discord-player 6.6.8-dev.3 → 6.6.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +6 -6
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -516,7 +516,7 @@ var _Track = class _Track {
516
516
  extractor: this.extractor?.identifier ?? null,
517
517
  metadata: this.metadata,
518
518
  $type: "track" /* Track */,
519
- $encoder_version: "6.6.8-dev.3"
519
+ $encoder_version: "6.6.8"
520
520
  };
521
521
  }
522
522
  /**
@@ -639,7 +639,7 @@ var _Playlist = class _Playlist {
639
639
  id: this.id,
640
640
  url: this.url,
641
641
  $type: "playlist" /* Playlist */,
642
- $encoder_version: "6.6.8-dev.3"
642
+ $encoder_version: "6.6.8"
643
643
  };
644
644
  }
645
645
  /**
@@ -3315,7 +3315,7 @@ var _GuildQueueStatistics = class _GuildQueueStatistics {
3315
3315
  memoryUsage: process.memoryUsage(),
3316
3316
  versions: {
3317
3317
  node: process.version,
3318
- player: "6.6.8-dev.3"
3318
+ player: "6.6.8"
3319
3319
  }
3320
3320
  };
3321
3321
  }
@@ -5411,14 +5411,14 @@ _lagMonitorInterval = new WeakMap();
5411
5411
  _onVoiceStateUpdate = new WeakMap();
5412
5412
  _hooksCtx = new WeakMap();
5413
5413
  __name(_Player, "Player");
5414
- _Player.version = "6.6.8-dev.3";
5414
+ _Player.version = "6.6.8";
5415
5415
  _Player._singletonKey = kSingleton;
5416
5416
  var Player = _Player;
5417
5417
 
5418
5418
  // src/index.ts
5419
5419
  var import_equalizer3 = require("@discord-player/equalizer");
5420
5420
  var import_discord_voip7 = require("discord-voip");
5421
- var version = "6.6.8-dev.3";
5421
+ var version = "6.6.8";
5422
5422
  if (!import_discord6.version.startsWith("14")) {
5423
5423
  process.emitWarning(`Discord.js v${import_discord6.version} is incompatible with Discord Player v${version}! Please use >=v14.x of Discord.js`);
5424
5424
  }
@@ -5496,4 +5496,4 @@ if (!import_discord6.version.startsWith("14")) {
5496
5496
  version,
5497
5497
  ...require("@discord-player/ffmpeg")
5498
5498
  });
5499
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyLnRzIiwgIi4uL3NyYy91dGlscy9VdGlsLnRzIiwgIi4uL3NyYy9mYWJyaWMvVHJhY2sudHMiLCAiLi4vc3JjL3V0aWxzL1R5cGVVdGlsLnRzIiwgIi4uL3NyYy9lcnJvcnMvaW5kZXgudHMiLCAiLi4vc3JjL3V0aWxzL3NlcmRlLnRzIiwgIi4uL3NyYy9mYWJyaWMvUGxheWxpc3QudHMiLCAiLi4vc3JjL3R5cGVzL3R5cGVzLnRzIiwgIi4uL3NyYy9mYWJyaWMvU2VhcmNoUmVzdWx0LnRzIiwgIi4uL3NyYy91dGlscy9BdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvci50cyIsICIuLi9zcmMvZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LnRzIiwgIi4uL3NyYy9tYW5hZ2VyL0d1aWxkTm9kZU1hbmFnZXIudHMiLCAiLi4vc3JjL21hbmFnZXIvR3VpbGRRdWV1ZS50cyIsICIuLi9zcmMvVm9pY2VJbnRlcmZhY2UvU3RyZWFtRGlzcGF0Y2hlci50cyIsICIuLi9zcmMvbWFuYWdlci9Wb2ljZVJlY2VpdmVyTm9kZS50cyIsICIuLi9zcmMvbWFuYWdlci9HdWlsZFF1ZXVlSGlzdG9yeS50cyIsICIuLi9zcmMvbWFuYWdlci9HdWlsZFF1ZXVlUGxheWVyTm9kZS50cyIsICIuLi9zcmMvdXRpbHMvUXVlcnlSZXNvbHZlci50cyIsICIuLi9zcmMvdXRpbHMvQXN5bmNRdWV1ZS50cyIsICIuLi9zcmMvbWFuYWdlci9HdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzLnRzIiwgIi4uL3NyYy91dGlscy9GRm1wZWdTdHJlYW0udHMiLCAiLi4vc3JjL21hbmFnZXIvR3VpbGRRdWV1ZVN0YXRpc3RpY3MudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9fY29udGFpbmVyLnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vYWRkUGxheWVyLnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vY2xlYXJQbGF5ZXIudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9nZXRQbGF5ZXJzLnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vZ2V0R2xvYmFsUmVnaXN0cnkudHMiLCAiLi4vc3JjL1ZvaWNlSW50ZXJmYWNlL1ZvaWNlVXRpbHMudHMiLCAiLi4vc3JjL3V0aWxzL1F1ZXJ5Q2FjaGUudHMiLCAiLi4vc3JjL1BsYXllci50cyIsICIuLi9zcmMvRGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyLnRzIiwgIi4uL3NyYy91dGlscy9JUFJvdGF0b3IudHMiLCAiLi4vc3JjL2hvb2tzL2NvbnRleHQvYXN5bmMtY29udGV4dC50cyIsICIuLi9zcmMvaG9va3MvY29tbW9uLnRzIiwgIi4uL3NyYy9ob29rcy91c2VIaXN0b3J5LnRzIiwgIi4uL3NyYy9ob29rcy91c2VQbGF5ZXIudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVF1ZXVlLnRzIiwgIi4uL3NyYy9ob29rcy91c2VNYWluUGxheWVyLnRzIiwgIi4uL3NyYy9ob29rcy91c2VNZXRhZGF0YS50cyIsICIuLi9zcmMvaG9va3MvdXNlVGltZWxpbmUudHMiLCAiLi4vc3JjL2hvb2tzL3N0cmVhbS9vbkFmdGVyQ3JlYXRlU3RyZWFtLnRzIiwgIi4uL3NyYy9ob29rcy9zdHJlYW0vb25CZWZvcmVDcmVhdGVTdHJlYW0udHMiLCAiLi4vc3JjL2hvb2tzL3VzZVZvbHVtZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgdmVyc2lvbiBhcyBkanNWZXJzaW9uIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5cbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0F1ZGlvRmlsdGVycyc7XG5leHBvcnQgKiBmcm9tICcuL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5leHBvcnQgKiBmcm9tICcuL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCc7XG5leHBvcnQgKiBmcm9tICcuL2ZhYnJpYyc7XG5leHBvcnQgKiBmcm9tICcuL21hbmFnZXInO1xuZXhwb3J0ICogZnJvbSAnLi9Wb2ljZUludGVyZmFjZS9Wb2ljZVV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vVm9pY2VJbnRlcmZhY2UvU3RyZWFtRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9UeXBlVXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0FzeW5jUXVldWUnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcy90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0ZGbXBlZ1N0cmVhbSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmV4cG9ydCAqIGZyb20gJ0BkaXNjb3JkLXBsYXllci9mZm1wZWcnO1xuZXhwb3J0ICogZnJvbSAnLi9QbGF5ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9ob29rcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0lQUm90YXRvcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL3NlcmRlJztcbmV4cG9ydCB7XG4gICAgQXVkaW9GaWx0ZXJzIGFzIFBDTUF1ZGlvRmlsdGVycyxcbiAgICB0eXBlIEJpcXVhZEZpbHRlcnMsXG4gICAgRmlsdGVyVHlwZSBhcyBCaXF1YWRGaWx0ZXJUeXBlLFxuICAgIHR5cGUgUENNRmlsdGVycyxcbiAgICBRX0JVVFRFUldPUlRILFxuICAgIFZvbHVtZVRyYW5zZm9ybWVyLFxuICAgIEJBU1NfRVFfQkFORFMsXG4gICAgQUZfTklHSFRDT1JFX1JBVEUsXG4gICAgQUZfVkFQT1JXQVZFX1JBVEUsXG4gICAgRmlsdGVyc0NoYWluXG59IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuZXhwb3J0IHsgY3JlYXRlQXVkaW9QbGF5ZXIsIEF1ZGlvUGxheWVyLCB0eXBlIENyZWF0ZUF1ZGlvUGxheWVyT3B0aW9ucyB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW5mZXJyYWJsZS10eXBlc1xuZXhwb3J0IGNvbnN0IHZlcnNpb246IHN0cmluZyA9ICc2LjYuOC1kZXYuMyc7XG5cbmlmICghZGpzVmVyc2lvbi5zdGFydHNXaXRoKCcxNCcpKSB7XG4gICAgcHJvY2Vzcy5lbWl0V2FybmluZyhgRGlzY29yZC5qcyB2JHtkanNWZXJzaW9ufSBpcyBpbmNvbXBhdGlibGUgd2l0aCBEaXNjb3JkIFBsYXllciB2JHt2ZXJzaW9ufSEgUGxlYXNlIHVzZSA+PXYxNC54IG9mIERpc2NvcmQuanNgKTtcbn1cbiIsICJpbXBvcnQgeyBEZWZhdWx0TGlzdGVuZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgTGlzdGVuZXJTaWduYXR1cmUgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgY2xhc3MgUGxheWVyRXZlbnRzRW1pdHRlcjxMIGV4dGVuZHMgTGlzdGVuZXJTaWduYXR1cmU8TD4gPSBEZWZhdWx0TGlzdGVuZXI+IGV4dGVuZHMgRXZlbnRFbWl0dGVyPEw+IHtcbiAgICAjaGFzRGVidWdnZXIgPSBmYWxzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlcXVpcmVkRXZlbnRzOiBBcnJheTxrZXlvZiBMPiA9IFtdKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCBsaXN0ZW5lcjogTFtLXSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25jZTxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgICAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdXBlci5vbmNlKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkTGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIuYWRkTGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvZmY8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdGhpcy5saXN0ZW5lckNvdW50KCdkZWJ1ZycgYXMgSykgPiAwO1xuXG4gICAgICAgIHJldHVybiBzdXBlci5vZmYobmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVMaXN0ZW5lcjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0aGlzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJyBhcyBLKSA+IDA7XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlQWxsTGlzdGVuZXJzPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lPzogSykge1xuICAgICAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRoaXMubGlzdGVuZXJDb3VudCgnZGVidWcnIGFzIEspID4gMDtcblxuICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKG5hbWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCAuLi5hcmdzOiBQYXJhbWV0ZXJzPExbS10+KSB7XG4gICAgICAgIGlmICh0aGlzLnJlcXVpcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpICYmICF0aGlzLmV2ZW50TmFtZXMoKS5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoLi4uYXJncyk7XG4gICAgICAgICAgICBVdGlsLndhcm4oXG4gICAgICAgICAgICAgICAgYE5vIGV2ZW50IGxpc3RlbmVyIGZvdW5kIGZvciBldmVudCBcIiR7U3RyaW5nKG5hbWUpfVwiLiBFdmVudHMgJHt0aGlzLnJlcXVpcmVkRXZlbnRzLm1hcCgobSkgPT4gYFwiJHtTdHJpbmcobSl9XCJgKS5qb2luKCcsICcpfSBtdXN0IGhhdmUgZXZlbnQgbGlzdGVuZXJzLmAsXG4gICAgICAgICAgICAgICAgJ1VuaGFuZGxlZEV2ZW50c1dhcm5pbmcnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLmVtaXQobmFtZSwgLi4uYXJncyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNEZWJ1Z2dlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2hhc0RlYnVnZ2VyO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBTdGFnZUNoYW5uZWwsIFZvaWNlQ2hhbm5lbCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgVGltZURhdGEgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgUGxheWxpc3QsIFRyYWNrIH0gZnJvbSAnLi4vZmFicmljJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgcmFuZG9tSW50IH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuXG5jbGFzcyBVdGlsIHtcbiAgICAvKipcbiAgICAgKiBVdGlsc1xuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBkdXJhdGlvbiBzdHJpbmdcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZHVyT2JqIFRoZSBkdXJhdGlvbiBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBkdXJhdGlvblN0cmluZyhkdXJPYmo6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZHVyT2JqKVxuICAgICAgICAgICAgLm1hcCgobSkgPT4gKGlzTmFOKG0pID8gMCA6IG0pKVxuICAgICAgICAgICAgLmpvaW4oJzonKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgbWlsbGlzZWNvbmRzIHRvIGNvbnN1bWFibGUgdGltZSBvYmplY3RcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWlsbGlzZWNvbmRzIFRoZSB0aW1lIGluIG1zXG4gICAgICogQHJldHVybnMge1RpbWVEYXRhfVxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZU1TKG1pbGxpc2Vjb25kczogbnVtYmVyKSB7XG4gICAgICAgIGlmIChpc05hTihtaWxsaXNlY29uZHMpKSBtaWxsaXNlY29uZHMgPSAwO1xuICAgICAgICBjb25zdCByb3VuZCA9IG1pbGxpc2Vjb25kcyA+IDAgPyBNYXRoLmZsb29yIDogTWF0aC5jZWlsO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXlzOiByb3VuZChtaWxsaXNlY29uZHMgLyA4NjQwMDAwMCksXG4gICAgICAgICAgICBob3Vyczogcm91bmQobWlsbGlzZWNvbmRzIC8gMzYwMDAwMCkgJSAyNCxcbiAgICAgICAgICAgIG1pbnV0ZXM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDYwMDAwKSAlIDYwLFxuICAgICAgICAgICAgc2Vjb25kczogcm91bmQobWlsbGlzZWNvbmRzIC8gMTAwMCkgJSA2MFxuICAgICAgICB9IGFzIFRpbWVEYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyB0aW1lIGNvZGVcbiAgICAgKiBAcGFyYW0ge1RpbWVEYXRhfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gb2JqZWN0XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgYnVpbGRUaW1lQ29kZShkdXJhdGlvbjogVGltZURhdGEpIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBPYmplY3Qua2V5cyhkdXJhdGlvbik7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkID0gWydkYXlzJywgJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcyddO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGl0ZW1zLmZpbHRlcigoeCkgPT4gcmVxdWlyZWQuaW5jbHVkZXMoeCkpLm1hcCgobSkgPT4gZHVyYXRpb25bbSBhcyBrZXlvZiBUaW1lRGF0YV0pO1xuICAgICAgICBjb25zdCBmaW5hbCA9IHBhcnNlZFxuICAgICAgICAgICAgLnNsaWNlKHBhcnNlZC5maW5kSW5kZXgoKHgpID0+IHggIT09IDApKVxuICAgICAgICAgICAgLm1hcCgoeCkgPT4geC50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykpXG4gICAgICAgICAgICAuam9pbignOicpO1xuXG4gICAgICAgIHJldHVybiBmaW5hbC5sZW5ndGggPD0gMyA/IGAwOiR7ZmluYWwucGFkU3RhcnQoMiwgJzAnKSB8fCAwfWAgOiBmaW5hbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQaWNrcyBsYXN0IGl0ZW0gb2YgdGhlIGdpdmVuIGFycmF5XG4gICAgICogQHBhcmFtIHthbnlbXX0gYXJyIFRoZSBhcnJheVxuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBzdGF0aWMgbGFzdDxUID0gYW55PihhcnI6IFRbXSk6IFQge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbiAgICAgICAgcmV0dXJuIGFyclthcnIubGVuZ3RoIC0gMV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIGlzVm9pY2VFbXB0eShjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIGNoYW5uZWwgJiYgY2hhbm5lbC5tZW1iZXJzLmZpbHRlcigobWVtYmVyKSA9PiAhbWVtYmVyLnVzZXIuYm90KS5zaXplID09PSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhZmVyIHJlcXVpcmVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgTm9kZSByZXF1aXJlIGlkXG4gICAgICogQHJldHVybnMge2FueX1cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVxdWlyZShpZDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IHJlcXVpcmUoaWQpLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGltcG9ydChpZDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBtb2QsIGVycm9yOiBudWxsIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IG51bGwsIGVycm9yIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3luY2hyb25vdXMgdGltZW91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIFRoZSB0aW1lIGluIG1zIHRvIHdhaXRcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICAgKi9cbiAgICBzdGF0aWMgd2FpdCh0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQodGltZSwgdW5kZWZpbmVkLCB7IHJlZjogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIG5vb3AoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgc3RhdGljIGFzeW5jIGdldEZldGNoKCkge1xuICAgICAgICBpZiAoJ2ZldGNoJyBpbiBnbG9iYWxUaGlzKSByZXR1cm4gZ2xvYmFsVGhpcy5mZXRjaDtcbiAgICAgICAgZm9yIChjb25zdCBsaWIgb2YgWydub2RlLWZldGNoJywgJ3VuZGljaSddKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBpbXBvcnQobGliKS50aGVuKChyZXMpID0+IHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHJlcXVpcmUobGliKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQ7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vP1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgY29kZSA9ICdEZXByZWNhdGlvbldhcm5pbmcnLCBkZXRhaWw/OiBzdHJpbmcpIHtcbiAgICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZyhtZXNzYWdlLCB7XG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgZGV0YWlsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyByYW5kb21DaG9pY2U8VD4oc3JjOiBUW10pOiBUIHtcbiAgICAgICAgcmV0dXJuIHNyY1tyYW5kb21JbnQoc3JjLmxlbmd0aCldO1xuICAgIH1cblxuICAgIHN0YXRpYyBhcnJheUNsb25lU2h1ZmZsZTxUPihzcmM6IFRbXSk6IFRbXSB7XG4gICAgICAgIGNvbnN0IGFyciA9IHNyYy5zbGljZSgpO1xuXG4gICAgICAgIGxldCBtID0gYXJyLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAobSkge1xuICAgICAgICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG0tLSk7XG4gICAgICAgICAgICBbYXJyW21dLCBhcnJbaV1dID0gW2FycltpXSwgYXJyW21dXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgVkFMSURBVEVfUVVFVUVfQ0FQID0gKHF1ZXVlOiBHdWlsZFF1ZXVlLCBpdGVtczogUGxheWxpc3QgfCBUcmFjayB8IFRyYWNrW10pID0+IHtcbiAgICBjb25zdCB0cmFja3MgPSBpdGVtcyBpbnN0YW5jZW9mIFBsYXlsaXN0ID8gaXRlbXMudHJhY2tzIDogQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IFtpdGVtc107XG5cbiAgICBpZiAocXVldWUubWF4U2l6ZSA8IDEgfHwgcXVldWUubWF4U2l6ZSA9PT0gSW5maW5pdHkpIHJldHVybjtcblxuICAgIGNvbnN0IG1heENhcCA9IHF1ZXVlLmdldENhcGFjaXR5KCk7XG5cbiAgICBpZiAobWF4Q2FwIDwgdHJhY2tzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9PVVRfT0ZfU1BBQ0UoJ3RyYWNrcyBxdWV1ZScsIG1heENhcCwgdHJhY2tzLmxlbmd0aCk7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgVXRpbCB9O1xuIiwgImltcG9ydCB7IFVzZXIsIGVzY2FwZU1hcmtkb3duLCBTbm93Zmxha2VVdGlsLCBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsIEFQSVVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciwgUGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0LCBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFJhd1RyYWNrRGF0YSwgU2VhcmNoUXVlcnlUeXBlLCBUcmFja0pTT04gfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL21hbmFnZXIvR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBTZXJpYWxpemVkVHlwZSwgdHJ5SW50b1RodW1ibmFpbFN0cmluZyB9IGZyb20gJy4uL3V0aWxzL3NlcmRlJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgdHlwZSBUcmFja1Jlc29sdmFibGUgPSBUcmFjayB8IHN0cmluZyB8IG51bWJlcjtcblxuZXhwb3J0IHR5cGUgV2l0aE1ldGFkYXRhPFQgZXh0ZW5kcyBvYmplY3QsIE0+ID0gVCAmIHtcbiAgICBtZXRhZGF0YTogTTtcbiAgICByZXF1ZXN0TWV0YWRhdGEoKTogUHJvbWlzZTxNPjtcbn07XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRUcmFjayA9IFJldHVyblR5cGU8VHJhY2tbJ3NlcmlhbGl6ZSddPjtcblxuZXhwb3J0IGNsYXNzIFRyYWNrPFQgPSB1bmtub3duPiB7XG4gICAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gICAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIGF1dGhvcjogc3RyaW5nO1xuICAgIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgcHVibGljIGR1cmF0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIHZpZXdzOiBudW1iZXI7XG4gICAgcHVibGljIHJlcXVlc3RlZEJ5OiBVc2VyIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHBsYXlsaXN0PzogUGxheWxpc3Q7XG4gICAgcHVibGljIHF1ZXJ5VHlwZTogU2VhcmNoUXVlcnlUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGw7XG4gICAgcHVibGljIHJhdzogUmF3VHJhY2tEYXRhID0ge1xuICAgICAgICBzb3VyY2U6ICdhcmJpdHJhcnknXG4gICAgfSBhcyBSYXdUcmFja0RhdGE7XG4gICAgcHVibGljIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICAgIHByaXZhdGUgX19tZXRhZGF0YTogVCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX19yZXFNZXRhZGF0YUZuOiAoKSA9PiBQcm9taXNlPFQgfCBudWxsPjtcblxuICAgIC8qKlxuICAgICAqIFRyYWNrIGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgaW5zdGFudGlhdGVkIHRoaXMgVHJhY2tcbiAgICAgKiBAcGFyYW0gZGF0YSBUcmFjayBkYXRhXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllciwgZGF0YTogUGFydGlhbDxXaXRoTWV0YWRhdGE8UmF3VHJhY2tEYXRhLCBUPj4pIHtcbiAgICAgICAgdGhpcy50aXRsZSA9IGVzY2FwZU1hcmtkb3duKGRhdGEudGl0bGUgPz8gJycpO1xuICAgICAgICB0aGlzLmF1dGhvciA9IGRhdGEuYXV0aG9yID8/ICcnO1xuICAgICAgICB0aGlzLnVybCA9IGRhdGEudXJsID8/ICcnO1xuICAgICAgICB0aGlzLnRodW1ibmFpbCA9IGRhdGEudGh1bWJuYWlsID8/ICcnO1xuICAgICAgICB0aGlzLmR1cmF0aW9uID0gZGF0YS5kdXJhdGlvbiA/PyAnJztcbiAgICAgICAgdGhpcy52aWV3cyA9IGRhdGEudmlld3MgPz8gMDtcbiAgICAgICAgdGhpcy5xdWVyeVR5cGUgPSBkYXRhLnF1ZXJ5VHlwZTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0ZWRCeSA9IGRhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5wbGF5bGlzdCA9IGRhdGEucGxheWxpc3Q7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBgJHt0aGlzLnRpdGxlfSBieSAke3RoaXMuYXV0aG9yfWA7XG4gICAgICAgIHRoaXMucmF3ID0gT2JqZWN0LmFzc2lnbih7fSwgeyBzb3VyY2U6IGRhdGEucmF3Py5zb3VyY2UgPz8gZGF0YS5zb3VyY2UgfSwgZGF0YS5yYXcgPz8gZGF0YSk7XG4gICAgICAgIHRoaXMuX19tZXRhZGF0YSA9IGRhdGEubWV0YWRhdGEgPz8gbnVsbDtcbiAgICAgICAgdGhpcy5fX3JlcU1ldGFkYXRhRm4gPSBkYXRhLnJlcXVlc3RNZXRhZGF0YSB8fCAoKCkgPT4gUHJvbWlzZS5yZXNvbHZlPFQgfCBudWxsPihudWxsKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBtZXRhZGF0YSBmb3IgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0TWV0YWRhdGEoKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuX19yZXFNZXRhZGF0YUZuKCk7XG5cbiAgICAgICAgdGhpcy5zZXRNZXRhZGF0YShyZXMpO1xuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1ldGFkYXRhIGZvciB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHNldE1ldGFkYXRhKG06IFQgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX19tZXRhZGF0YSA9IG07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0YWRhdGEgb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fbWV0YWRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyB0cmFjayBoYXMgbWV0YWRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc01ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YSAhPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBxdWV1ZSBpbiB3aGljaCB0aGlzIHRyYWNrIGlzIGxvY2F0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHF1ZXVlKCk6IEd1aWxkUXVldWUge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuZmluZCgocSkgPT4gcS50cmFja3Muc29tZSgoYWIpID0+IGFiLmlkID09PSB0aGlzLmlkKSkhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHVyYXRpb25NUygpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB0aW1lcyA9IChuOiBudW1iZXIsIHQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgbGV0IHRuID0gMTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdDsgaSsrKSB0biAqPSBuO1xuICAgICAgICAgICAgcmV0dXJuIHQgPD0gMCA/IDEwMDAgOiB0biAqIDEwMDA7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZHVyYXRpb25cbiAgICAgICAgICAgIC5zcGxpdCgnOicpXG4gICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAubWFwKChtLCBpKSA9PiBwYXJzZUludChtKSAqIHRpbWVzKDYwLCBpKSlcbiAgICAgICAgICAgIC5yZWR1Y2UoKGEsIGMpID0+IGEgKyBjLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNjb3JkIGh5cGVybGluayByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHRvSHlwZXJsaW5rKCk6IHN0cmluZyAvKiBub3QgdXNpbmcgYFske3N0cmluZ31dKCR7c3RyaW5nfSlgIHlldCAqLyB7XG4gICAgICAgIHJldHVybiBgWyR7dGhpcy50aXRsZX1dKCR7dGhpcy51cmx9KWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBzb3VyY2Ugb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc291cmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYXc/LnNvdXJjZSA/PyAnYXJiaXRyYXJ5JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy50aXRsZX0gYnkgJHt0aGlzLmF1dGhvcn1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJhdyBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9KU09OKGhpZGVQbGF5bGlzdD86IGJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgZHVyYXRpb25NUzogdGhpcy5kdXJhdGlvbk1TLFxuICAgICAgICAgICAgdmlld3M6IHRoaXMudmlld3MsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeT8uaWQgfHwgbnVsbCxcbiAgICAgICAgICAgIHBsYXlsaXN0OiBoaWRlUGxheWxpc3QgPyBudWxsIDogdGhpcy5wbGF5bGlzdD8udG9KU09OKCkgPz8gbnVsbFxuICAgICAgICB9IGFzIFRyYWNrSlNPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemVkIHRyYWNrIGRhdGEgdGhhdCBjYW4gYmUgcmVjb25zdHJ1Y3RlZFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICB0aHVtYm5haWw6IFR5cGVVdGlsLmlzU3RyaW5nKHRoaXMudGh1bWJuYWlsKSA/IHRoaXMudGh1bWJuYWlsIDogdHJ5SW50b1RodW1ibmFpbFN0cmluZyh0aGlzLnRodW1ibmFpbCksXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHZpZXdzOiB0aGlzLnZpZXdzID8/IDAsXG4gICAgICAgICAgICByZXF1ZXN0ZWRfYnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpID8/IG51bGwsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgICAgICAgbGl2ZTogZmFsc2UsXG4gICAgICAgICAgICBxdWVyeV90eXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogdGhpcy5leHRyYWN0b3I/LmlkZW50aWZpZXIgPz8gbnVsbCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgICAgICAgJHR5cGU6IFNlcmlhbGl6ZWRUeXBlLlRyYWNrLFxuICAgICAgICAgICAgJGVuY29kZXJfdmVyc2lvbjogJzYuNi44LWRldi4zJ1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIHRyYWNrIGZyb20gc2VyaWFsaXplZCBkYXRhXG4gICAgICogQHBhcmFtIHBsYXllciBQbGF5ZXIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gZGF0YSBTZXJpYWxpemVkIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21TZXJpYWxpemVkKHBsYXllcjogUGxheWVyLCBkYXRhOiBSZXR1cm5UeXBlPFRyYWNrWydzZXJpYWxpemUnXT4pIHtcbiAgICAgICAgaWYgKGRhdGEuJHR5cGUgIT09IFNlcmlhbGl6ZWRUeXBlLlRyYWNrKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdkYXRhJywgJ1NlcmlhbGl6ZWRUcmFjaycsICdtYWxmb3JtZWQgZGF0YScpO1xuICAgICAgICBjb25zdCB0cmFjayA9IG5ldyBUcmFjayhwbGF5ZXIsIHtcbiAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogZGF0YS5yZXF1ZXN0ZWRfYnlcbiAgICAgICAgICAgICAgICA/ICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gZGF0YS5yZXF1ZXN0ZWRfYnkgYXMgQVBJVXNlcjtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IHBsYXllci5jbGllbnQudXNlcnMucmVzb2x2ZShyZXMuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXllci5jbGllbnQudXNlcnMuY2FjaGUuaGFzKHJlcy5pZCkpIHJldHVybiBwbGF5ZXIuY2xpZW50LnVzZXJzLmNhY2hlLmdldChyZXMuaWQpITtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gbmV3IFVzZXIocGxheWVyLmNsaWVudCwgcmVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pKClcbiAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICBxdWVyeVR5cGU6IGRhdGEucXVlcnlfdHlwZSA/PyB1bmRlZmluZWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJhY2suc2V0TWV0YWRhdGEoZGF0YS5tZXRhZGF0YSk7XG5cbiAgICAgICAgcmV0dXJuIHRyYWNrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBiZWxvbmdpbmcgcXVldWVzIG9mIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QmVsb25naW5nUXVldWVzKCkge1xuICAgICAgICBjb25zdCBub2RlcyA9IHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLmZpbHRlcigobm9kZSkgPT4gbm9kZS50cmFja3Muc29tZSgodCkgPT4gdC5pZCA9PT0gdGhpcy5pZCkpO1xuXG4gICAgICAgIHJldHVybiBub2RlcyBhcyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZTx1bmtub3duPj47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGlzIHRyYWNrIHRvIHRoZSBnaXZlbiB2b2ljZSBjaGFubmVsLiBJZiBxdWV1ZSBleGlzdHMgYW5kIGFub3RoZXIgdHJhY2sgaXMgYmVpbmcgcGxheWVkLCB0aGlzIHRyYWNrIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHF1ZXVlLlxuICAgICAqIEBwYXJhbSBjaGFubmVsIFZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhpcyB0cmFjayBzaGFsbCBiZSBwbGF5ZWRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBOb2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPik6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgICAgIGNvbnN0IGZuID0gdGhpcy5wbGF5ZXIucGxheS5iaW5kKHRoaXMucGxheWVyKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgZm4oY2hhbm5lbCwgdGhpcywgb3B0aW9ucyk7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjbGFzcyBUeXBlVXRpbCB7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgcmV0dXJuIFR5cGVVdGlsO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gICAgcHVibGljIHN0YXRpYyBpc0Z1bmN0aW9uKHQ6IHVua25vd24pOiB0IGlzIEZ1bmN0aW9uIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnZnVuY3Rpb24nO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNOdW1iZXIodDogdW5rbm93bik6IHQgaXMgbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc1N0cmluZyh0OiB1bmtub3duKTogdCBpcyBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdzdHJpbmcnO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNCb29sZWFuKHQ6IHVua25vd24pOiB0IGlzIGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdib29sZWFuJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTnVsbGlzaCh0OiB1bmtub3duKTogdCBpcyBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHQgPT0gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzQXJyYXkodDogdW5rbm93bik6IHQgaXMgdW5rbm93bltdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0Vycm9yKHQ6IHVua25vd24pOiB0IGlzIEVycm9yIHtcbiAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBFcnJvcjtcbiAgICB9XG59XG4iLCAiY29uc3QgRGlzY29yZFBsYXllckVycm9ycyA9IHtcbiAgICBFUlJfT1VUX09GX1NQQUNFOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfT1VUX09GX1NQQUNFJyxcbiAgICAgICAgdHlwZTogUmFuZ2VFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcsIGNhcGFjaXR5OiBudW1iZXIsIHRvdGFsOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gTWF4IGNhcGFjaXR5IHJlYWNoZWQgZm9yICR7dGFyZ2V0fSAoQ2FwYWNpdHkgJHtjYXBhY2l0eX0vVG90YWwgJHt0b3RhbH0pYDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX0lOVkFMSURfQVJHX1RZUEU6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9JTlZBTElEX0FSR19UWVBFJyxcbiAgICAgICAgdHlwZTogVHlwZUVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZywgZXhwZWN0YXRpb246IHN0cmluZywgZm91bmQ6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSBFeHBlY3RlZCAke3RhcmdldH0gdG8gYmUgXCIke2V4cGVjdGF0aW9ufVwiLCByZWNlaXZlZCBcIiR7Zm91bmR9XCJgO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fUkVTVUxUOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9fUkVTVUxUJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSAke21lc3NhZ2V9YDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PVF9JTVBMRU1FTlRFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX05PVF9JTVBMRU1FTlRFRCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSAke3RhcmdldH0gaXMgbm90IHlldCBpbXBsZW1lbnRlZGA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT1RfRVhJU1RJTkc6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT1RfRVhJU1RJTkcnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gJHt0YXJnZXR9IGRvZXMgbm90IGV4aXN0YDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX09VVF9PRl9SQU5HRToge1xuICAgICAgICBuYW1lOiAnRVJSX09VVF9PRl9SQU5HRScsXG4gICAgICAgIHR5cGU6IFJhbmdlRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBtaW5pbXVtOiBzdHJpbmcsIG1heGltdW06IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSAke3RhcmdldH0gaXMgb3V0IG9mIHJhbmdlIChFeHBlY3RlZCBtaW5pbXVtICR7bWF4aW11bX0gYW5kIG1heGltdW0gJHttYXhpbXVtfSwgZ290ICR7dmFsdWV9KWA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19WT0lDRV9DT05ORUNUSU9OOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9fVk9JQ0VfQ09OTkVDVElPTicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMubmFtZX1dIGAgKyAobWVzc2FnZSB8fCAnTm8gdm9pY2UgY29ubmVjdGlvbiBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0PycpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9WT0lDRV9DT05ORUNUSU9OX0RFU1RST1lFRCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcigpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gYCArICdDYW5ub3QgdXNlIGRlc3Ryb3llZCB2b2ljZSBjb25uZWN0aW9uJztcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PX1ZPSUNFX0NIQU5ORUw6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19WT0lDRV9DSEFOTkVMJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSBgICsgJ0NvdWxkIG5vdCBnZXQgdGhlIHZvaWNlIGNoYW5uZWwnO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSBgICsgJ0V4cGVjdGVkIGEgdm9pY2UgY2hhbm5lbCc7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19SRUNFSVZFUjoge1xuICAgICAgICBuYW1lOiAnRVJSX05PX1JFQ0VJVkVSJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gYCArIChtZXNzYWdlIHx8ICdObyB2b2ljZSByZWNlaXZlciBpcyBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0PycpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfRkZNUEVHX0xPQ0FUT1I6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9GRk1QRUdfTE9DQVRPUicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gYCArIG1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19BVURJT19SRVNPVVJDRToge1xuICAgICAgICBuYW1lOiAnRVJSX05PX0FVRElPX1JFU09VUkNFJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gYCArIChtZXNzYWdlIHx8ICdFeHBlY3RlZCBhbiBhdWRpbyByZXNvdXJjZScpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fR1VJTERfUVVFVUU6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19HVUlMRF9RVUVVRScsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMubmFtZX1dIGAgKyAobWVzc2FnZSB8fCAnRXhwZWN0ZWQgYSBndWlsZCBxdWV1ZScpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fR1VJTEQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19HVUlMRCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMubmFtZX1dIGAgKyAobWVzc2FnZSB8fCAnRXhwZWN0ZWQgYSBndWlsZCcpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfSU5GT19SRVFVSVJFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX0lORk9fUkVRVUlSRUQnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcsIGFjdHVhbDogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMubmFtZX1dIEV4cGVjdGVkICR7dGFyZ2V0fSwgZm91bmQgXCIke2FjdHVhbH1cImA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX1NFUklBTElaQVRJT05fRkFJTEVEJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XWAgKyBcIkRvbid0IGtub3cgaG93IHRvIHNlcmlhbGl6ZSB0aGlzIGRhdGFcIjtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX0RFU0VSSUFMSVpBVElPTl9GQUlMRUQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9ERVNFUklBTElaQVRJT05fRkFJTEVEJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XWAgKyBcIkRvbid0IGtub3cgaG93IHRvIGRlc2VyaWFsaXplIHRoaXMgZGF0YVwiO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfSUxMRUdBTF9IT09LX0lOVk9DQVRJT046IHtcbiAgICAgICAgbmFtZTogJ0VSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZywgbWVzc2FnZT86IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSBgICsgYElsbGVnYWwgaW52b2NhdGlvbiBvZiAke3RhcmdldH0gaG9vay4ke21lc3NhZ2UgPyBgICR7bWVzc2FnZX1gIDogJyd9YDtcbiAgICAgICAgfVxuICAgIH1cbn0gYXMgY29uc3Q7XG5cbnR5cGUgRmluYWxFeGNlcHRpb248TyBleHRlbmRzICh0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycylba2V5b2YgdHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnNdPiA9IHtcbiAgICBuYW1lOiBPWyduYW1lJ107XG59ICYgSW5zdGFuY2VUeXBlPE9bJ3R5cGUnXT47XG5cbnR5cGUgRGlzY29yZFBsYXllckV4Y2VwdGlvbiA9IHtcbiAgICBbSyBpbiBrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9yc106ICguLi5hcmdzOiBQYXJhbWV0ZXJzPCh0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycylbS11bJ2NyZWF0ZUVycm9yJ10+KSA9PiBGaW5hbEV4Y2VwdGlvbjwodHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnMpW0tdPjtcbn07XG5cbmNvbnN0IHRhcmdldCA9IHt9IGFzIERpc2NvcmRQbGF5ZXJFeGNlcHRpb247XG5cbmNvbnN0IGhhbmRsZXI6IFByb3h5SGFuZGxlcjx0eXBlb2YgdGFyZ2V0PiA9IHtcbiAgICBnZXQodGFyZ2V0LCBwOiBrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycywgcmVjZWl2ZXIpIHtcbiAgICAgICAgY29uc3QgZXJyID0gRGlzY29yZFBsYXllckVycm9yc1twXTtcblxuICAgICAgICBpZiAoIWVycikgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuXG4gICAgICAgIHJldHVybiAoLi4uYXJnczogUGFyYW1ldGVyczwodHlwZW9mIGVycilbJ2NyZWF0ZUVycm9yJ10+KSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICBjb25zdCBleGNlcHRpb24gPSBuZXcgZXJyLnR5cGUoZXJyLmNyZWF0ZUVycm9yKC4uLmFyZ3MpKTtcbiAgICAgICAgICAgIGV4Y2VwdGlvbi5uYW1lID0gZXJyLm5hbWU7XG5cbiAgICAgICAgICAgIHJldHVybiBleGNlcHRpb247XG4gICAgICAgIH07XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IEVycm9yQ29kZXMgPSAoKCkgPT4ge1xuICAgIHR5cGUgRXJyQ29kZXMgPSB7XG4gICAgICAgIC1yZWFkb25seSBbSyBpbiBrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9yc106ICh0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycylbS11bJ25hbWUnXTtcbiAgICB9O1xuXG4gICAgY29uc3QgZGljdCA9IHt9IGFzIEVyckNvZGVzO1xuXG4gICAgZm9yIChjb25zdCBwcm9wIGluIERpc2NvcmRQbGF5ZXJFcnJvcnMpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBkaWN0W3Byb3BdID0gcHJvcDtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShkaWN0KTtcbn0pKCk7XG5leHBvcnQgY29uc3QgRXhjZXB0aW9ucyA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpO1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBQbGF5bGlzdCwgdHlwZSBTZXJpYWxpemVkVHJhY2ssIFRyYWNrLCBTZXJpYWxpemVkUGxheWxpc3QgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuL1R5cGVVdGlsJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuXG5leHBvcnQgZW51bSBTZXJpYWxpemVkVHlwZSB7XG4gICAgVHJhY2sgPSAndHJhY2snLFxuICAgIFBsYXlsaXN0ID0gJ3BsYXlsaXN0J1xufVxuXG5leHBvcnQgdHlwZSBFbmNvZGFibGUgPSBTZXJpYWxpemVkVHJhY2sgfCBTZXJpYWxpemVkUGxheWxpc3Q7XG5cbmNvbnN0IGlzVHJhY2sgPSAoZGF0YTogYW55KTogZGF0YSBpcyBTZXJpYWxpemVkVHJhY2sgPT4gZGF0YS4kdHlwZSA9PT0gU2VyaWFsaXplZFR5cGUuVHJhY2s7XG5jb25zdCBpc1BsYXlsaXN0ID0gKGRhdGE6IGFueSk6IGRhdGEgaXMgU2VyaWFsaXplZFBsYXlsaXN0ID0+IGRhdGEuJHR5cGUgPT09IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0O1xuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplKGRhdGE6IFRyYWNrIHwgUGxheWxpc3QgfCBhbnkpIHtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFRyYWNrKSByZXR1cm4gZGF0YS5zZXJpYWxpemUoKTtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFBsYXlsaXN0KSByZXR1cm4gZGF0YS5zZXJpYWxpemUoKTtcblxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkYXRhLnRvSlNPTigpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRCgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplKHBsYXllcjogUGxheWVyLCBkYXRhOiBFbmNvZGFibGUpIHtcbiAgICBpZiAoaXNUcmFjayhkYXRhKSkgcmV0dXJuIFRyYWNrLmZyb21TZXJpYWxpemVkKHBsYXllciwgZGF0YSk7XG4gICAgaWYgKGlzUGxheWxpc3QoZGF0YSkpIHJldHVybiBQbGF5bGlzdC5mcm9tU2VyaWFsaXplZChwbGF5ZXIsIGRhdGEpO1xuXG4gICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfREVTRVJJQUxJWkFUSU9OX0ZBSUxFRCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlKGRhdGE6IEVuY29kYWJsZSkge1xuICAgIGNvbnN0IHN0ciA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0cikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKGRhdGE6IHN0cmluZykge1xuICAgIGNvbnN0IHN0ciA9IEJ1ZmZlci5mcm9tKGRhdGEsICdiYXNlNjQnKS50b1N0cmluZygpO1xuXG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyeUludG9UaHVtYm5haWxTdHJpbmcoZGF0YTogYW55KSB7XG4gICAgaWYgKCFkYXRhKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgICBpZiAoVHlwZVV0aWwuaXNTdHJpbmcoZGF0YSkpIHJldHVybiBkYXRhO1xuICAgICAgICByZXR1cm4gZGF0YT8udXJsID8/IGRhdGE/LnRodW1ibmFpbD8udXJsID8/IG51bGw7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBQbGF5ZXIsIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdCwgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9ucyB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4vVHJhY2snO1xuaW1wb3J0IHsgUGxheWxpc3RJbml0RGF0YSwgUGxheWxpc3RKU09OLCBUcmFja0pTT04sIFRyYWNrU291cmNlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemVkVHlwZSwgdHJ5SW50b1RodW1ibmFpbFN0cmluZyB9IGZyb20gJy4uL3V0aWxzL3NlcmRlJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRQbGF5bGlzdCA9IFJldHVyblR5cGU8UGxheWxpc3RbJ3NlcmlhbGl6ZSddPjtcblxuZXhwb3J0IGNsYXNzIFBsYXlsaXN0IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXI7XG4gICAgcHVibGljIHRyYWNrczogVHJhY2tbXTtcbiAgICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgcHVibGljIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAgIHB1YmxpYyBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAgIHB1YmxpYyBhdXRob3I6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICB1cmw6IHN0cmluZztcbiAgICB9O1xuICAgIHB1YmxpYyBpZDogc3RyaW5nO1xuICAgIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgcmF3UGxheWxpc3Q/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXG4gICAgLyoqXG4gICAgICogUGxheWxpc3QgY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyIFRoZSBwbGF5ZXJcbiAgICAgKiBAcGFyYW0ge1BsYXlsaXN0SW5pdERhdGF9IGRhdGEgVGhlIGRhdGFcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwbGF5ZXI6IFBsYXllciwgZGF0YTogUGxheWxpc3RJbml0RGF0YSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXllclxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNwbGF5ZXJcbiAgICAgICAgICogQHR5cGUge1BsYXllcn1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHRyYWNrcyBpbiB0aGlzIHBsYXlsaXN0XG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3RyYWNrc1xuICAgICAgICAgKiBAdHlwZSB7VHJhY2tbXX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHJhY2tzID0gZGF0YS50cmFja3MgPz8gW107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhdXRob3Igb2YgdGhpcyBwbGF5bGlzdFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNhdXRob3JcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXV0aG9yID0gZGF0YS5hdXRob3I7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkZXNjcmlwdGlvblxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNkZXNjcmlwdGlvblxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRhdGEuZGVzY3JpcHRpb247XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0aHVtYm5haWwgb2YgdGhpcyBwbGF5bGlzdFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCN0aHVtYm5haWxcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGh1bWJuYWlsID0gZGF0YS50aHVtYm5haWw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5bGlzdCB0eXBlOlxuICAgICAgICAgKiAtIGBhbGJ1bWBcbiAgICAgICAgICogLSBgcGxheWxpc3RgXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3R5cGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHlwZSA9IGRhdGEudHlwZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHNvdXJjZSBvZiB0aGlzIHBsYXlsaXN0OlxuICAgICAgICAgKiAtIGB5b3V0dWJlYFxuICAgICAgICAgKiAtIGBzb3VuZGNsb3VkYFxuICAgICAgICAgKiAtIGBzcG90aWZ5YFxuICAgICAgICAgKiAtIGBhcmJpdHJhcnlgXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3NvdXJjZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zb3VyY2UgPSBkYXRhLnNvdXJjZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I2lkXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlkID0gZGF0YS5pZDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXlsaXN0IHVybFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCN1cmxcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXJsID0gZGF0YS51cmw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5bGlzdCB0aXRsZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50aXRsZSA9IGRhdGEudGl0bGU7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3Jhd1BsYXlsaXN0XG4gICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICB9XG5cbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHlpZWxkKiB0aGlzLnRyYWNrcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc3RpbWF0ZWQgZHVyYXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5yZWR1Y2UoKHAsIGMpID0+IHAgKyBjLmR1cmF0aW9uTVMsIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm1hdHRlZCBlc3RpbWF0ZWQgZHVyYXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHVyYXRpb25Gb3JtYXR0ZWQoKSB7XG4gICAgICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt3aXRoVHJhY2tzPXRydWVdIElmIGl0IHNob3VsZCBidWlsZCBqc29uIHdpdGggdHJhY2tzXG4gICAgICogQHJldHVybnMge1BsYXlsaXN0SlNPTn1cbiAgICAgKi9cbiAgICB0b0pTT04od2l0aFRyYWNrcyA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICB0aHVtYm5haWw6IHRoaXMudGh1bWJuYWlsLFxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICAgICAgICB0cmFja3M6IFtdIGFzIFRyYWNrSlNPTltdXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHdpdGhUcmFja3MpIHBheWxvYWQudHJhY2tzID0gdGhpcy50cmFja3MubWFwKChtKSA9PiBtLnRvSlNPTih0cnVlKSk7XG5cbiAgICAgICAgcmV0dXJuIHBheWxvYWQgYXMgUGxheWxpc3RKU09OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSB0aGlzIHBsYXlsaXN0IGludG8gcmVjb25zdHJ1Y3RhYmxlIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHJhY2tzOiB0aGlzLnRyYWNrcy5tYXAoKG0pID0+IG0uc2VyaWFsaXplKCkpLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHRodW1ibmFpbDogVHlwZVV0aWwuaXNTdHJpbmcodGhpcy50aHVtYm5haWwpID8gdGhpcy50aHVtYm5haWwgOiB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nKHRoaXMudGh1bWJuYWlsKSxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgJHR5cGU6IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0LFxuICAgICAgICAgICAgJGVuY29kZXJfdmVyc2lvbjogJzYuNi44LWRldi4zJ1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIHRoaXMgcGxheWxpc3QgZnJvbSBzZXJpYWxpemVkIGRhdGFcbiAgICAgKiBAcGFyYW0gcGxheWVyIFBsYXllciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBkYXRhIFNlcmlhbGl6ZWQgZGF0YVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVNlcmlhbGl6ZWQocGxheWVyOiBQbGF5ZXIsIGRhdGE6IFNlcmlhbGl6ZWRQbGF5bGlzdCkge1xuICAgICAgICBpZiAoZGF0YS4kdHlwZSAhPT0gU2VyaWFsaXplZFR5cGUuUGxheWxpc3QpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2RhdGEnLCAnU2VyaWFsaXplZFBsYXlsaXN0JywgJ21hbGZvcm1lZCBkYXRhJyk7XG4gICAgICAgIHJldHVybiBuZXcgUGxheWxpc3QocGxheWVyLCB7XG4gICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgdHJhY2tzOiBkYXRhLnRyYWNrcy5tYXAoKG0pID0+IFRyYWNrLmZyb21TZXJpYWxpemVkKHBsYXllciwgbSkpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhpcyBwbGF5bGlzdCB0byB0aGUgZ2l2ZW4gdm9pY2UgY2hhbm5lbC4gSWYgcXVldWUgZXhpc3RzIGFuZCBhbm90aGVyIHRyYWNrIGlzIGJlaW5nIHBsYXllZCwgdGhpcyBwbGF5bGlzdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZS5cbiAgICAgKiBAcGFyYW0gY2hhbm5lbCBWb2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoaXMgcGxheWxpc3Qgc2hhbGwgYmUgcGxheWVkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTm9kZSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgb3B0aW9ucz86IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4pOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgICAgICBjb25zdCBmbiA9IHRoaXMucGxheWVyLnBsYXkuYmluZCh0aGlzLnBsYXllcik7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuKGNoYW5uZWwsIHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFVzZXIsIFVzZXJSZXNvbHZhYmxlLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB0eXBlIHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHR5cGUgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgdHlwZSB7IGRvd25sb2FkT3B0aW9ucyB9IGZyb20gJ3l0ZGwtY29yZSc7XG5pbXBvcnQgdHlwZSB7IFF1ZXJ5Q2FjaGVQcm92aWRlciB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuaW1wb3J0IHR5cGUgeyBJUFJvdGF0aW9uQ29uZmlnIH0gZnJvbSAnLi4vdXRpbHMvSVBSb3RhdG9yJztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHR5cGUgeyBCcmlkZ2VQcm92aWRlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9leHRyYWN0b3InO1xuXG5leHBvcnQgdHlwZSBGaWx0ZXJzTmFtZSA9IGtleW9mIFF1ZXVlRmlsdGVycztcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJTZWFyY2hSZXN1bHQge1xuICAgIHBsYXlsaXN0OiBQbGF5bGlzdCB8IG51bGw7XG4gICAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgRkZtcGVnIGZpbHRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWV1ZUZpbHRlcnMge1xuICAgIGJhc3Nib29zdF9sb3c/OiBib29sZWFuO1xuICAgIGJhc3Nib29zdD86IGJvb2xlYW47XG4gICAgYmFzc2Jvb3N0X2hpZ2g/OiBib29sZWFuO1xuICAgICc4RCc/OiBib29sZWFuO1xuICAgIHZhcG9yd2F2ZT86IGJvb2xlYW47XG4gICAgbmlnaHRjb3JlPzogYm9vbGVhbjtcbiAgICBwaGFzZXI/OiBib29sZWFuO1xuICAgIHRyZW1vbG8/OiBib29sZWFuO1xuICAgIHZpYnJhdG8/OiBib29sZWFuO1xuICAgIHJldmVyc2U/OiBib29sZWFuO1xuICAgIHRyZWJsZT86IGJvb2xlYW47XG4gICAgbm9ybWFsaXplcj86IGJvb2xlYW47XG4gICAgbm9ybWFsaXplcjI/OiBib29sZWFuO1xuICAgIHN1cnJvdW5kaW5nPzogYm9vbGVhbjtcbiAgICBwdWxzYXRvcj86IGJvb2xlYW47XG4gICAgc3ViYm9vc3Q/OiBib29sZWFuO1xuICAgIGthcmFva2U/OiBib29sZWFuO1xuICAgIGZsYW5nZXI/OiBib29sZWFuO1xuICAgIGdhdGU/OiBib29sZWFuO1xuICAgIGhhYXM/OiBib29sZWFuO1xuICAgIG1jb21wYW5kPzogYm9vbGVhbjtcbiAgICBtb25vPzogYm9vbGVhbjtcbiAgICBtc3Rscj86IGJvb2xlYW47XG4gICAgbXN0cnI/OiBib29sZWFuO1xuICAgIGNvbXByZXNzb3I/OiBib29sZWFuO1xuICAgIGV4cGFuZGVyPzogYm9vbGVhbjtcbiAgICBzb2Z0bGltaXRlcj86IGJvb2xlYW47XG4gICAgY2hvcnVzPzogYm9vbGVhbjtcbiAgICBjaG9ydXMyZD86IGJvb2xlYW47XG4gICAgY2hvcnVzM2Q/OiBib29sZWFuO1xuICAgIGZhZGVpbj86IGJvb2xlYW47XG4gICAgZGltPzogYm9vbGVhbjtcbiAgICBlYXJyYXBlPzogYm9vbGVhbjtcbiAgICBsb2ZpPzogYm9vbGVhbjtcbiAgICBzaWxlbmNlcmVtb3ZlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgdHJhY2sgc291cmNlOlxuICogLSBzb3VuZGNsb3VkXG4gKiAtIHlvdXR1YmVcbiAqIC0gc3BvdGlmeVxuICogLSBhcHBsZV9tdXNpY1xuICogLSBhcmJpdHJhcnlcbiAqL1xuZXhwb3J0IHR5cGUgVHJhY2tTb3VyY2UgPSAnc291bmRjbG91ZCcgfCAneW91dHViZScgfCAnc3BvdGlmeScgfCAnYXBwbGVfbXVzaWMnIHwgJ2FyYml0cmFyeSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmF3VHJhY2tEYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGl0bGVcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvclxuICAgICAqL1xuICAgIGF1dGhvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1cmxcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGh1bWJuYWlsXG4gICAgICovXG4gICAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGR1cmF0aW9uXG4gICAgICovXG4gICAgZHVyYXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gaW4gbXNcbiAgICAgKi9cbiAgICB2aWV3czogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHdobyByZXF1ZXN0ZWQgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0XG4gICAgICovXG4gICAgcGxheWxpc3Q/OiBQbGF5bGlzdDtcbiAgICAvKipcbiAgICAgKiBUaGUgc291cmNlXG4gICAgICovXG4gICAgc291cmNlPzogVHJhY2tTb3VyY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZ2luZVxuICAgICAqL1xuICAgIGVuZ2luZT86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgLyoqXG4gICAgICogSWYgdGhpcyB0cmFjayBpcyBsaXZlXG4gICAgICovXG4gICAgbGl2ZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBkYXRhXG4gICAgICovXG4gICAgcmF3PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAvKipcbiAgICAgKiBUaGUgcXVlcnkgdHlwZVxuICAgICAqL1xuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaW1lRGF0YSB7XG4gICAgLyoqXG4gICAgICogVGltZSBpbiBkYXlzXG4gICAgICovXG4gICAgZGF5czogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRpbWUgaW4gaG91cnNcbiAgICAgKi9cbiAgICBob3VyczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRpbWUgaW4gbWludXRlc1xuICAgICAqL1xuICAgIG1pbnV0ZXM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaW1lIGluIHNlY29uZHNcbiAgICAgKi9cbiAgICBzZWNvbmRzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJZiBpdCBzaG91bGQgcmVuZGVyIHRpbWUgY29kZXNcbiAgICAgKi9cbiAgICB0aW1lY29kZXM/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIElmIGl0IHNob3VsZCBjcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciB0aGUgd2hvbGUgcXVldWVcbiAgICAgKi9cbiAgICBsZW5ndGg/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGJhciBsZW5ndGhcbiAgICAgKi9cbiAgICBsZWZ0Q2hhcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZWxhcHNlZCB0aW1lIHRyYWNrXG4gICAgICovXG4gICAgcmlnaHRDaGFyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZW1haW5pbmcgdGltZSB0cmFja1xuICAgICAqL1xuICAgIHNlcGFyYXRvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2VwYXJhdGlvbiBiZXR3ZWVuIHRpbWVzdGFtcCBhbmQgbGluZVxuICAgICAqL1xuICAgIGluZGljYXRvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5kaWNhdG9yXG4gICAgICovXG4gICAgcXVldWU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBzZWFyY2ggcXVlcnkgdHlwZVxuICogVGhpcyBjYW4gYmUgb25lIG9mOlxuICogLSBBVVRPXG4gKiAtIFlPVVRVQkVcbiAqIC0gWU9VVFVCRV9QTEFZTElTVFxuICogLSBTT1VORENMT1VEX1RSQUNLXG4gKiAtIFNPVU5EQ0xPVURfUExBWUxJU1RcbiAqIC0gU09VTkRDTE9VRFxuICogLSBTUE9USUZZX1NPTkdcbiAqIC0gU1BPVElGWV9BTEJVTVxuICogLSBTUE9USUZZX1BMQVlMSVNUXG4gKiAtIFNQT1RJRllfU0VBUkNIXG4gKiAtIEZBQ0VCT09LXG4gKiAtIFZJTUVPXG4gKiAtIEFSQklUUkFSWVxuICogLSBSRVZFUkJOQVRJT05cbiAqIC0gWU9VVFVCRV9TRUFSQ0hcbiAqIC0gWU9VVFVCRV9WSURFT1xuICogLSBTT1VORENMT1VEX1NFQVJDSFxuICogLSBBUFBMRV9NVVNJQ19TT05HXG4gKiAtIEFQUExFX01VU0lDX0FMQlVNXG4gKiAtIEFQUExFX01VU0lDX1BMQVlMSVNUXG4gKiAtIEFQUExFX01VU0lDX1NFQVJDSFxuICogLSBGSUxFXG4gKiAtIEFVVE9fU0VBUkNIXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBRdWVyeVR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFF1ZXJ5VHlwZSA9IHtcbiAgICBBVVRPOiAnYXV0bycsXG4gICAgWU9VVFVCRTogJ3lvdXR1YmUnLFxuICAgIFlPVVRVQkVfUExBWUxJU1Q6ICd5b3V0dWJlUGxheWxpc3QnLFxuICAgIFNPVU5EQ0xPVURfVFJBQ0s6ICdzb3VuZGNsb3VkVHJhY2snLFxuICAgIFNPVU5EQ0xPVURfUExBWUxJU1Q6ICdzb3VuZGNsb3VkUGxheWxpc3QnLFxuICAgIFNPVU5EQ0xPVUQ6ICdzb3VuZGNsb3VkJyxcbiAgICBTUE9USUZZX1NPTkc6ICdzcG90aWZ5U29uZycsXG4gICAgU1BPVElGWV9BTEJVTTogJ3Nwb3RpZnlBbGJ1bScsXG4gICAgU1BPVElGWV9QTEFZTElTVDogJ3Nwb3RpZnlQbGF5bGlzdCcsXG4gICAgU1BPVElGWV9TRUFSQ0g6ICdzcG90aWZ5U2VhcmNoJyxcbiAgICBGQUNFQk9PSzogJ2ZhY2Vib29rJyxcbiAgICBWSU1FTzogJ3ZpbWVvJyxcbiAgICBBUkJJVFJBUlk6ICdhcmJpdHJhcnknLFxuICAgIFJFVkVSQk5BVElPTjogJ3JldmVyYm5hdGlvbicsXG4gICAgWU9VVFVCRV9TRUFSQ0g6ICd5b3V0dWJlU2VhcmNoJyxcbiAgICBZT1VUVUJFX1ZJREVPOiAneW91dHViZVZpZGVvJyxcbiAgICBTT1VORENMT1VEX1NFQVJDSDogJ3NvdW5kY2xvdWRTZWFyY2gnLFxuICAgIEFQUExFX01VU0lDX1NPTkc6ICdhcHBsZU11c2ljU29uZycsXG4gICAgQVBQTEVfTVVTSUNfQUxCVU06ICdhcHBsZU11c2ljQWxidW0nLFxuICAgIEFQUExFX01VU0lDX1BMQVlMSVNUOiAnYXBwbGVNdXNpY1BsYXlsaXN0JyxcbiAgICBBUFBMRV9NVVNJQ19TRUFSQ0g6ICdhcHBsZU11c2ljU2VhcmNoJyxcbiAgICBGSUxFOiAnZmlsZScsXG4gICAgQVVUT19TRUFSQ0g6ICdhdXRvU2VhcmNoJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2VhcmNoUXVlcnlUeXBlID0ga2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZSB8ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJFdmVudHMge1xuICAgIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gICAgZXJyb3I6IChlcnJvcjogRXJyb3IpID0+IGFueTtcbiAgICB2b2ljZVN0YXRlVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWUsIG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkgPT4gYW55O1xufVxuXG5leHBvcnQgZW51bSBQbGF5ZXJFdmVudCB7XG4gICAgZGVidWcgPSAnZGVidWcnLFxuICAgIGVycm9yID0gJ2Vycm9yJyxcbiAgICB2b2ljZVN0YXRlVXBkYXRlID0gJ3ZvaWNlU3RhdGVVcGRhdGUnXG59XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJZiB0aGlzIHBsYXkgd2FzIHRyaWdnZXJlZCBmb3IgZmlsdGVycyB1cGRhdGVcbiAgICAgKi9cbiAgICBmaWx0ZXJzVXBkYXRlPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBGRm1wZWcgYXJncyBwYXNzZWQgdG8gZW5jb2RlclxuICAgICAqL1xuICAgIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gICAgLyoqXG4gICAgICogVGltZSB0byBzZWVrIHRvIGJlZm9yZSBwbGF5aW5nXG4gICAgICovXG4gICAgc2Vlaz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiBpdCBzaG91bGQgc3RhcnQgcGxheWluZyB0aGUgcHJvdmlkZWQgdHJhY2sgaW1tZWRpYXRlbHlcbiAgICAgKi9cbiAgICBpbW1lZGlhdGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBRdWVyeUV4dHJhY3RvclNlYXJjaCA9IGBleHQ6JHtzdHJpbmd9YDtcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgc2VhcmNoXG4gICAgICovXG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyUmVzb2x2YWJsZTtcbiAgICAvKipcbiAgICAgKiBUaGUgcXVlcnkgc2VhcmNoIGVuZ2luZSwgY2FuIGJlIGV4dHJhY3RvciBuYW1lIHRvIHRhcmdldCBzcGVjaWZpYyBvbmUgKGN1c3RvbSlcbiAgICAgKi9cbiAgICBzZWFyY2hFbmdpbmU/OiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaDtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHRoZSBleHRyYWN0b3JzIHRvIGJsb2NrXG4gICAgICovXG4gICAgYmxvY2tFeHRyYWN0b3JzPzogc3RyaW5nW107XG4gICAgLyoqXG4gICAgICogSWYgaXQgc2hvdWxkIGlnbm9yZSBxdWVyeSBjYWNoZSBsb29rdXBcbiAgICAgKi9cbiAgICBpZ25vcmVDYWNoZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogRmFsbGJhY2sgc2VhcmNoIGVuZ2luZSB0byB1c2VcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHJlcXVlc3RPcHRpb25zPzogYW55O1xuICAgIC8qKlxuICAgICAqIEZhbGxiYWNrIHNlYXJjaCBlbmdpbmUgdG8gdXNlXG4gICAgICovXG4gICAgZmFsbGJhY2tTZWFyY2hFbmdpbmU/OiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG59XG5cbi8qKlxuICogVGhlIHF1ZXVlIHJlcGVhdCBtb2RlLiBUaGlzIGNhbiBiZSBvbmUgb2Y6XG4gKiAtIE9GRlxuICogLSBUUkFDS1xuICogLSBRVUVVRVxuICogLSBBVVRPUExBWVxuICovXG5leHBvcnQgZW51bSBRdWV1ZVJlcGVhdE1vZGUge1xuICAgIC8qKlxuICAgICAqIERpc2FibGUgcmVwZWF0IG1vZGUuXG4gICAgICovXG4gICAgT0ZGID0gMCxcbiAgICAvKipcbiAgICAgKiBSZXBlYXQgdGhlIGN1cnJlbnQgdHJhY2suXG4gICAgICovXG4gICAgVFJBQ0sgPSAxLFxuICAgIC8qKlxuICAgICAqIFJlcGVhdCB0aGUgZW50aXJlIHF1ZXVlLlxuICAgICAqL1xuICAgIFFVRVVFID0gMixcbiAgICAvKipcbiAgICAgKiBXaGVuIGxhc3QgdHJhY2sgZW5kcywgcGxheSBzaW1pbGFyIHRyYWNrcyBpbiB0aGUgZnV0dXJlIGlmIHF1ZXVlIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIEFVVE9QTEFZID0gM1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlsaXN0SW5pdERhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFja3Mgb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqL1xuICAgIHRyYWNrczogVHJhY2tbXTtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRodW1ibmFpbFxuICAgICAqL1xuICAgIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICAgICAqL1xuICAgIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBzb3VyY2VcbiAgICAgKi9cbiAgICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAgICAgKi9cbiAgICBhdXRob3I6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhdXRob3IgbmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGF1dGhvciB1cmxcbiAgICAgICAgICovXG4gICAgICAgIHVybDogc3RyaW5nO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdXJsXG4gICAgICovXG4gICAgdXJsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBwbGF5bGlzdCBkYXRhXG4gICAgICovXG4gICAgcmF3UGxheWxpc3Q/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNrSlNPTiB7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIGlkXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgdGl0bGVcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIGF1dGhvclxuICAgICAqL1xuICAgIGF1dGhvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayB1cmxcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgdGh1bWJuYWlsXG4gICAgICovXG4gICAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIGR1cmF0aW9uXG4gICAgICovXG4gICAgZHVyYXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgZHVyYXRpb24gaW4gbXNcbiAgICAgKi9cbiAgICBkdXJhdGlvbk1TOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIHZpZXdzXG4gICAgICovXG4gICAgdmlld3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciBpZCB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICByZXF1ZXN0ZWRCeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBpbmZvIChpZiBhbnkpXG4gICAgICovXG4gICAgcGxheWxpc3Q/OiBQbGF5bGlzdEpTT047XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWxpc3RKU09OIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgaWRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB1cmxcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRodW1ibmFpbFxuICAgICAqL1xuICAgIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICAgICAqL1xuICAgIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBzb3VyY2VcbiAgICAgKi9cbiAgICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAgICAgKi9cbiAgICBhdXRob3I6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhdXRob3IgbmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGF1dGhvciB1cmxcbiAgICAgICAgICovXG4gICAgICAgIHVybDogc3RyaW5nO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrcyBkYXRhIChpZiBhbnkpXG4gICAgICovXG4gICAgdHJhY2tzOiBUcmFja0pTT05bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJJbml0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIG9wdGlvbnMgcGFzc2VkIHRvIGB5dGRsLWNvcmVgLlxuICAgICAqL1xuICAgIHl0ZGxPcHRpb25zPzogZG93bmxvYWRPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uIHRpbWVvdXRcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaW1lIGluIG1zIHRvIHJlLW1vbml0b3IgZXZlbnQgbG9vcCBsYWdcbiAgICAgKi9cbiAgICBsYWdNb25pdG9yPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFByZXZlbnQgdm9pY2Ugc3RhdGUgaGFuZGxlciBmcm9tIGJlaW5nIG92ZXJyaWRkZW5cbiAgICAgKi9cbiAgICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZXh0cmFjdG9ycyB0byBkaXNhYmxlIHF1ZXJ5aW5nIG1ldGFkYXRhIGZyb21cbiAgICAgKi9cbiAgICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGV4dHJhY3RvcnMgdG8gZGlzYWJsZSBzdHJlYW1pbmcgZnJvbVxuICAgICAqL1xuICAgIGJsb2NrU3RyZWFtRnJvbT86IHN0cmluZ1tdO1xuICAgIC8qKlxuICAgICAqIFF1ZXJ5IGNhY2hlIHByb3ZpZGVyXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBxdWVyeUNhY2hlPzogUXVlcnlDYWNoZVByb3ZpZGVyPGFueT4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElnbm9yZSBwbGF5ZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBpZ25vcmVJbnN0YW5jZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVXNlIGxlZ2FjeSB2ZXJzaW9uIG9mIGZmbXBlZ1xuICAgICAqL1xuICAgIHVzZUxlZ2FjeUZGbXBlZz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU2V0IGJyaWRnZSBwcm92aWRlclxuICAgICAqL1xuICAgIGJyaWRnZVByb3ZpZGVyPzogQnJpZGdlUHJvdmlkZXI7XG4gICAgLyoqXG4gICAgICogSVAgcm90YXRvciBjb25maWdcbiAgICAgKi9cbiAgICBpcGNvbmZpZz86IElQUm90YXRpb25Db25maWc7XG4gICAgLyoqXG4gICAgICogU2tpcCBmZm1wZWcgcHJvY2VzcyB3aGVuIHBvc3NpYmxlXG4gICAgICovXG4gICAgc2tpcEZGbXBlZz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHByb2JlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byA1MDAwLlxuICAgICAqL1xuICAgIHByb2JlVGltZW91dD86IG51bWJlcjtcbn1cbiIsICJpbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBRdWVyeUV4dHJhY3RvclNlYXJjaCwgUXVlcnlUeXBlLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuL1RyYWNrJztcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSZXN1bHREYXRhIHtcbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoIHwgbnVsbDtcbiAgICBleHRyYWN0b3I/OiBCYXNlRXh0cmFjdG9yIHwgbnVsbDtcbiAgICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbDtcbiAgICB0cmFja3M/OiBUcmFja1tdO1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hSZXN1bHQge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIsIHByaXZhdGUgX2RhdGE6IFNlYXJjaFJlc3VsdERhdGEpIHtcbiAgICAgICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAgICAgICB0cmFjay5leHRyYWN0b3IgPz89IHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgICAgICAgICB0cmFjay5yZXF1ZXN0ZWRCeSA/Pz0gX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFF1ZXJ5VHlwZSh0eXBlOiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaCkge1xuICAgICAgICB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSA9IHR5cGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRSZXF1ZXN0ZWRCeSh1c2VyOiBVc2VyKSB7XG4gICAgICAgIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgPSB1c2VyO1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICAgIHRyYWNrLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRFeHRyYWN0b3IoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuZXh0cmFjdG9yID0gZXh0cmFjdG9yO1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICAgIHRyYWNrLmV4dHJhY3RvciA9IGV4dHJhY3RvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRUcmFja3ModHJhY2tzOiBUcmFja1tdKSB7XG4gICAgICAgIHRoaXMuX2RhdGEudHJhY2tzID0gdHJhY2tzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UXVlcnkocXVlcnk6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kYXRhLnF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRQbGF5bGlzdChwbGF5bGlzdDogUGxheWxpc3QpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5wbGF5bGlzdCA9IHBsYXlsaXN0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VhcmNoIHF1ZXJ5XG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEucXVlcnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSB8fCBRdWVyeVR5cGUuQVVUTztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIGdldCBleHRyYWN0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmV4dHJhY3RvciB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXlsaXN0IHJlc3VsdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGxheWxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnBsYXlsaXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYWNrcyByZXN1bHRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRyYWNrcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEudHJhY2tzIHx8IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3RlZCBieVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVxdWVzdGVkQnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmUtZXhlY3V0ZSB0aGlzIHNlYXJjaFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuc2VhcmNoKHRoaXMucXVlcnksIHtcbiAgICAgICAgICAgIHNlYXJjaEVuZ2luZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeSFcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGlzIGVtcHR5XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy50cmFja3MubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzUGxheWxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXlsaXN0ICE9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGhhcyB0cmFja3NcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzVHJhY2tzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3MubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2VhcmNoXG4gICAgICovXG4gICAgcHVibGljIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgICAgICAgcXVlcnlUeXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHBsYXlsaXN0OiB0aGlzLnBsYXlsaXN0Py50b0pTT04oZmFsc2UpIHx8IG51bGwsXG4gICAgICAgICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpLFxuICAgICAgICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCBudWxsLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpIHx8IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgRmlsdGVyc05hbWUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5cbmNvbnN0IGJhc3MgPSAoZzogbnVtYmVyKSA9PiBgYmFzcz1nPSR7Z306Zj0xMTA6dz0wLjNgO1xuXG5leHBvcnQgY2xhc3MgQXVkaW9GaWx0ZXJzIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb0ZpbHRlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmaWx0ZXJzOiBSZWNvcmQ8RmlsdGVyc05hbWUsIHN0cmluZz4gPSB7XG4gICAgICAgIGJhc3Nib29zdF9sb3c6IGJhc3MoMTUpLFxuICAgICAgICBiYXNzYm9vc3Q6IGJhc3MoMjApLFxuICAgICAgICBiYXNzYm9vc3RfaGlnaDogYmFzcygzMCksXG4gICAgICAgICc4RCc6ICdhcHVsc2F0b3I9aHo9MC4wOScsXG4gICAgICAgIHZhcG9yd2F2ZTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjgnLFxuICAgICAgICBuaWdodGNvcmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMS4yNScsXG4gICAgICAgIGxvZmk6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMC45LGV4dHJhc3RlcmVvPW09Mi41OmM9ZGlzYWJsZWQnLFxuICAgICAgICBwaGFzZXI6ICdhcGhhc2VyPWluX2dhaW49MC40JyxcbiAgICAgICAgdHJlbW9sbzogJ3RyZW1vbG8nLFxuICAgICAgICB2aWJyYXRvOiAndmlicmF0bz1mPTYuNScsXG4gICAgICAgIHJldmVyc2U6ICdhcmV2ZXJzZScsXG4gICAgICAgIHRyZWJsZTogJ3RyZWJsZT1nPTUnLFxuICAgICAgICBub3JtYWxpemVyMjogJ2R5bmF1ZG5vcm09Zz0xMDEnLFxuICAgICAgICBub3JtYWxpemVyOiAnYWNvbXByZXNzb3InLFxuICAgICAgICBzdXJyb3VuZGluZzogJ3N1cnJvdW5kJyxcbiAgICAgICAgcHVsc2F0b3I6ICdhcHVsc2F0b3I9aHo9MScsXG4gICAgICAgIHN1YmJvb3N0OiAnYXN1YmJvb3N0JyxcbiAgICAgICAga2FyYW9rZTogJ3N0ZXJlb3Rvb2xzPW1sZXY9MC4wMycsXG4gICAgICAgIGZsYW5nZXI6ICdmbGFuZ2VyJyxcbiAgICAgICAgZ2F0ZTogJ2FnYXRlJyxcbiAgICAgICAgaGFhczogJ2hhYXMnLFxuICAgICAgICBtY29tcGFuZDogJ21jb21wYW5kJyxcbiAgICAgICAgbW9ubzogJ3Bhbj1tb25vfGMwPS41KmMwKy41KmMxJyxcbiAgICAgICAgbXN0bHI6ICdzdGVyZW90b29scz1tb2RlPW1zPmxyJyxcbiAgICAgICAgbXN0cnI6ICdzdGVyZW90b29scz1tb2RlPW1zPnJyJyxcbiAgICAgICAgY29tcHJlc3NvcjogJ2NvbXBhbmQ9cG9pbnRzPS04MC8tMTA1fC02Mi8tODB8LTE1LjQvLTE1LjR8MC8tMTJ8MjAvLTcuNicsXG4gICAgICAgIGV4cGFuZGVyOiAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tMTY5fC01NC8tODB8LTQ5LjUvLTY0LjZ8LTQxLjEvLTQxLjF8LTI1LjgvLTE1fC0xMC44Ly00LjV8MC8wfDIwLzguMycsXG4gICAgICAgIHNvZnRsaW1pdGVyOiAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tODB8LTEyLjQvLTEyLjR8LTYvLTh8MC8tNi44fDIwLy0yLjgnLFxuICAgICAgICBjaG9ydXM6ICdjaG9ydXM9MC43OjAuOTo1NTowLjQ6MC4yNToyJyxcbiAgICAgICAgY2hvcnVzMmQ6ICdjaG9ydXM9MC42OjAuOTo1MHw2MDowLjR8MC4zMjowLjI1fDAuNDoyfDEuMycsXG4gICAgICAgIGNob3J1czNkOiAnY2hvcnVzPTAuNTowLjk6NTB8NjB8NDA6MC40fDAuMzJ8MC4zOjAuMjV8MC40fDAuMzoyfDIuM3wxLjMnLFxuICAgICAgICBmYWRlaW46ICdhZmFkZT10PWluOnNzPTA6ZD0xMCcsXG4gICAgICAgIGRpbTogYGFmZnRmaWx0PVwiJ3JlYWw9cmUgKiAoMS1jbGlwKChiL25iKSpiLDAsMSkpJzppbWFnPSdpbSAqICgxLWNsaXAoKGIvbmIpKmIsMCwxKSknXCJgLFxuICAgICAgICBlYXJyYXBlOiAnY2hhbm5lbHNwbGl0LHNpZGVjaGFpbmdhdGU9bGV2ZWxfaW49NjQnLFxuICAgICAgICBzaWxlbmNlcmVtb3ZlOiAnc2lsZW5jZXJlbW92ZT0xOjA6LTUwZEInXG4gICAgfTtcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0PEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4obmFtZTogSykge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJzW25hbWVdID8/IG5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXM8SyBleHRlbmRzIEZpbHRlcnNOYW1lPihuYW1lOiBLKSB7XG4gICAgICAgIHJldHVybiBuYW1lIGluIHRoaXMuZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPHsgbmFtZTogRmlsdGVyc05hbWU7IHZhbHVlOiBzdHJpbmcgfT4ge1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmZpbHRlcnMpKSB7XG4gICAgICAgICAgICB5aWVsZCB7IG5hbWU6IGsgYXMgRmlsdGVyc05hbWUsIHZhbHVlOiB2IGFzIHN0cmluZyB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgbmFtZXMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpIGFzIEZpbHRlcnNOYW1lW107XG4gICAgfVxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVzLm1hcCgobSkgPT4gKHRoaXMgYXMgYW55KVttXSkuam9pbignLCcpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZmZtcGVnIGFyZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbHRlcnMgbmFtZVxuICAgICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciBuYW1lXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZTxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KGZpbHRlcnM/OiBLW10pIHtcbiAgICAgICAgaWYgKCFmaWx0ZXJzIHx8ICFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gZmlsdGVyc1xuICAgICAgICAgICAgLmZpbHRlcigocHJlZGljYXRlKSA9PiB0eXBlb2YgcHJlZGljYXRlID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgIC5tYXAoKG0pID0+IHRoaXMuZ2V0KG0pKVxuICAgICAgICAgICAgLmpvaW4oJywnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGF1ZGlvIGZpbHRlclxuICAgICAqIEBwYXJhbSBmaWx0ZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWx0ZXJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGZmbXBlZyBhcmdzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmUoZmlsdGVyTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyc1tmaWx0ZXJOYW1lIGFzIEZpbHRlcnNOYW1lXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgbXVsdGlwbGUgYXVkaW8gZmlsdGVyc1xuICAgICAqIEBwYXJhbSBmaWx0ZXJzQXJyYXkgQXJyYXkgb2YgZmlsdGVycyBjb250YWluaW5nIHRoZSBmaWx0ZXIgbmFtZSBhbmQgZmZtcGVnIGFyZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZUJ1bGsoZmlsdGVyc0FycmF5OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10pIHtcbiAgICAgICAgZmlsdGVyc0FycmF5LmZvckVhY2goKGFycikgPT4gdGhpcy5kZWZpbmUoYXJyLm5hbWUsIGFyci52YWx1ZSkpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHMsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IEd1aWxkUXVldWVIaXN0b3J5IH0gZnJvbSAnLi4vbWFuYWdlcic7XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RvclN0cmVhbWFibGUgPVxuICAgIHwgUmVhZGFibGVcbiAgICB8IHN0cmluZ1xuICAgIHwge1xuICAgICAgICAgICRmbXQ6IHN0cmluZztcbiAgICAgICAgICBzdHJlYW06IFJlYWRhYmxlO1xuICAgICAgfTtcblxuZXhwb3J0IGNsYXNzIEJhc2VFeHRyYWN0b3I8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpZGVudGlmaWVyID0gJ2NvbS5kaXNjb3JkLXBsYXllci5leHRyYWN0b3InO1xuXG4gICAgLyoqXG4gICAgICogUHJpb3JpdHkgb2YgdGhpcyBleHRyYWN0b3IuIEhpZ2hlciB2YWx1ZSBtZWFucyBoaWdoZXIgcHJpb3JpdHkgKHdpbGwgYmUgZXhlY3V0ZWQgZmlyc3QpLlxuICAgICAqL1xuICAgIHB1YmxpYyBwcmlvcml0eSA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcXVlcnkgcHJvdG9jb2xzIHRoYXQgdGhpcyBleHRyYWN0b3Igc3VwcG9ydHMuXG4gICAgICovXG4gICAgcHVibGljIHByb3RvY29sczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBicmlkZ2UgcXVlcnkgY3JlYXRpb25cbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGJ1aWxkIHF1ZXJ5IGZvclxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVCcmlkZ2VRdWVyeSA9ICh0cmFjazogVHJhY2spID0+IGAke3RyYWNrLnRpdGxlfSBieSAke3RyYWNrLmF1dGhvcn0gb2ZmaWNpYWwgYXVkaW9gO1xuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdG9yIGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBvcHRpb25zIEluaXRpYWxpemF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBwdWJsaWMgb3B0aW9uczogVCA9IDxUPnt9KSB7fVxuXG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGlzIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaWRlbnRpZmllcigpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBCYXNlRXh0cmFjdG9yKS5pZGVudGlmaWVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY29uZmlndXJlcyB0aGlzIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBuZXcgb3B0aW9ucyB0byBhcHBseVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZWNvbmZpZ3VyZShvcHRpb25zOiBUKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmFjdGl2YXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBhY3RpdmF0ZSgpIHtcbiAgICAgICAgLy8gZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkZWFjdGl2YXRlKCkge1xuICAgICAgICAvLyBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBpbmNvbWluZyBxdWVyeVxuICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgdG8gdmFsaWRhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdmFsaWRhdGUocXVlcnk6IHN0cmluZywgdHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdm9pZCB0eXBlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyZWFtIHRoZSBnaXZlbiB0cmFja1xuICAgICAqIEBwYXJhbSBpbmZvIFRoZSB0cmFjayB0byBzdHJlYW1cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc3RyZWFtKGluZm86IFRyYWNrKTogUHJvbWlzZTxFeHRyYWN0b3JTdHJlYW1hYmxlPiB7XG4gICAgICAgIHZvaWQgaW5mbztcbiAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9UX0lNUExFTUVOVEVEKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uc3RyZWFtKClgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdGhlIGdpdmVuIHF1ZXJ5XG4gICAgICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byBoYW5kbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlKHF1ZXJ5OiBzdHJpbmcsIGNvbnRleHQ6IEV4dHJhY3RvclNlYXJjaENvbnRleHQpOiBQcm9taXNlPEV4dHJhY3RvckluZm8+IHtcbiAgICAgICAgdm9pZCBjb250ZXh0O1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT1RfSU1QTEVNRU5URUQoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5oYW5kbGUoKWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCByZWxhdGVkIHRyYWNrcyBmb3IgdGhlIGdpdmVuIHRyYWNrXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayBzb3VyY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0UmVsYXRlZFRyYWNrcyh0cmFjazogVHJhY2ssIGhpc3Rvcnk6IEd1aWxkUXVldWVIaXN0b3J5KTogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgICAgIHZvaWQgdHJhY2s7XG4gICAgICAgIHZvaWQgaGlzdG9yeTtcbiAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9UX0lNUExFTUVOVEVEKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uZ2V0UmVsYXRlZFRyYWNrcygpYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzdHJlYW0gbWlkZGxld2FyZSB0byBoYW5kbGUgc3RyZWFtcyBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgcGxheWVyXG4gICAgICogQHBhcmFtIHN0cmVhbSBUaGUgaW5jb21pbmcgc3RyZWFtXG4gICAgICogQHBhcmFtIG5leHQgVGhlIG5leHQgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlUG9zdFN0cmVhbShzdHJlYW06IFJlYWRhYmxlLCBuZXh0OiBOZXh0RnVuY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIG5leHQobnVsbCwgc3RyZWFtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhbiBldmVudCB0byB0aGUgcGxheWVyXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBkaXNwYXRjaFxuICAgICAqIEBwYXJhbSBhcmdzIFRoZSBkYXRhIHRvIGRpc3BhdGNoXG4gICAgICovXG4gICAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIFBsYXllckV2ZW50cz4oZXZlbnQ6IEssIC4uLmFyZ3M6IFBhcmFtZXRlcnM8UGxheWVyRXZlbnRzW0tdPikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnBsYXllci5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZXh0cmFjdG9yIHJlc3BvbnNlXG4gICAgICogQHBhcmFtIHBsYXlsaXN0IFRoZSBwbGF5bGlzdFxuICAgICAqIEBwYXJhbSB0cmFja3MgVGhlIHRyYWNrIGFycmF5XG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVJlc3BvbnNlKHBsYXlsaXN0PzogUGxheWxpc3QgfCBudWxsLCB0cmFja3M6IFRyYWNrW10gPSBwbGF5bGlzdD8udHJhY2tzIHx8IFtdKTogRXh0cmFjdG9ySW5mbyB7XG4gICAgICAgIHJldHVybiB7IHBsYXlsaXN0OiBwbGF5bGlzdCB8fCBudWxsLCB0cmFja3MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXcml0ZSBkZWJ1ZyBtZXNzYWdlXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGRlYnVnIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmRlYnVnKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElQIHJvdGF0b3IgaW5zdGFuY2UsIGlmIGF2YWlsYWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm91dGVQbGFubmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnBsYXllci5yb3V0ZVBsYW5uZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBmbGFnIHRvIGluZGljYXRlIGBEZW11eGFibGVgIHN0cmVhbSBzdXBwb3J0IGZvciBgb3B1c2AvYG9nZy9vcHVzYC9gd2VibS9vcHVzYCBmb3JtYXRzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3VwcG9ydHNEZW11eCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5jb250ZXh0LnBsYXllci5vcHRpb25zLnNraXBGRm1wZWc7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBOZXh0RnVuY3Rpb24gPSAoZXJyb3I/OiBFcnJvciB8IG51bGwsIHN0cmVhbT86IFJlYWRhYmxlKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckluZm8ge1xuICAgIHBsYXlsaXN0OiBQbGF5bGlzdCB8IG51bGw7XG4gICAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvclNlYXJjaENvbnRleHQge1xuICAgIHR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsO1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG4gICAgcmVxdWVzdE9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucztcbiAgICBwcm90b2NvbD86IHN0cmluZyB8IG51bGw7XG59XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4vQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHNFbWl0dGVyIH0gZnJvbSAnLi4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBrbm93bkV4dHJhY3RvcktleXMgPSBbXG4gICAgJ1Nwb3RpZnlFeHRyYWN0b3InLFxuICAgICdBcHBsZU11c2ljRXh0cmFjdG9yJyxcbiAgICAnU291bmRDbG91ZEV4dHJhY3RvcicsXG4gICAgJ1lvdVR1YmVFeHRyYWN0b3InLFxuICAgICdWaW1lb0V4dHJhY3RvcicsXG4gICAgJ1JldmVyYm5hdGlvbkV4dHJhY3RvcicsXG4gICAgJ0F0dGFjaG1lbnRFeHRyYWN0b3InXG5dIGFzIGNvbnN0O1xuY29uc3Qga25vd25FeHRyYWN0b3JMaWIgPSAnQGRpc2NvcmQtcGxheWVyL2V4dHJhY3Rvcic7XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RvckxvYWRlck9wdGlvbkRpY3QgPSB7XG4gICAgLy8gQHRzLWlnbm9yZSB0eXBlc1xuICAgIFtLIGluICh0eXBlb2Yga25vd25FeHRyYWN0b3JLZXlzKVtudW1iZXJdXT86IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgaW1wb3J0KCdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJylbS10+WzFdO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JFeGVjdXRpb25FdmVudHMge1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyByZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgZXh0cmFjdG9yIHdhcyByZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRoYXQgd2FzIHJlZ2lzdGVyZWRcbiAgICAgKi9cbiAgICByZWdpc3RlcmVkOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyB1bnJlZ2lzdGVyZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHVucmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0aGF0IHdhcyB1bnJlZ2lzdGVyZWRcbiAgICAgKi9cbiAgICB1bnJlZ2lzdGVyZWQ6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGFjdGl2YXRlZFxuICAgICAqL1xuICAgIGFjdGl2YXRlOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAgICovXG4gICAgZGVhY3RpdmF0ZTogKGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgZmFpbHMgdG8gYWN0aXZhdGUvZGVhY3RpdmF0ZVxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAgICovXG4gICAgZXJyb3I6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IsIGVycm9yOiBFcnJvcikgPT4gdW5rbm93bjtcbn1cblxuZXhwb3J0IGNsYXNzIEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBQbGF5ZXJFdmVudHNFbWl0dGVyPEV4dHJhY3RvckV4ZWN1dGlvbkV2ZW50cz4ge1xuICAgIC8qKlxuICAgICAqIFRoZSBleHRyYWN0b3JzIHN0b3JlXG4gICAgICovXG4gICAgcHVibGljIHN0b3JlID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCBCYXNlRXh0cmFjdG9yPigpO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge1xuICAgICAgICBzdXBlcihbJ2Vycm9yJ10pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgZGVmYXVsdCBleHRyYWN0b3JzIGZyb20gYEBkaXNjb3JkLXBsYXllci9leHRyYWN0b3JgXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGxvYWREZWZhdWx0KGZpbHRlcj86IChleHQ6ICh0eXBlb2Yga25vd25FeHRyYWN0b3JLZXlzKVtudW1iZXJdKSA9PiBib29sZWFuIHwgbnVsbCwgb3B0aW9ucz86IEV4dHJhY3RvckxvYWRlck9wdGlvbkRpY3QpIHtcbiAgICAgICAgY29uc3QgbW9kID0gYXdhaXQgVXRpbC5pbXBvcnQoa25vd25FeHRyYWN0b3JMaWIpO1xuICAgICAgICBpZiAobW9kLmVycm9yKSByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IG1vZC5lcnJvciBhcyBFcnJvciB9O1xuXG4gICAgICAgIChmaWx0ZXIgPyBrbm93bkV4dHJhY3RvcktleXMuZmlsdGVyKGZpbHRlcikgOiBrbm93bkV4dHJhY3RvcktleXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFtb2QubW9kdWxlW2tleV0pIHJldHVybjtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdHlwZXNcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXIoPHR5cGVvZiBCYXNlRXh0cmFjdG9yPm1vZC5tb2R1bGVba2V5XSwgb3B0aW9ucz8uW2tleV0gfHwge30pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIGlmIHRoZSBnaXZlbiBleHRyYWN0b3IgaXMgcmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgICAqL1xuICAgIHB1YmxpYyBpc1JlZ2lzdGVyZWQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmhhcyhpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2l6ZSBvZiByZWdpc3RlcmVkIGV4dHJhY3RvcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHNpbmdsZSBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgZXh0cmFjdG9yIHRvIGdldFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldChpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBzaW5nbGUgZXh0cmFjdG9yXG4gICAgICogQHBhcmFtIF9leHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0byByZWdpc3RlclxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3VwcGxpZWQgdG8gdGhlIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlcjxPIGV4dGVuZHMgb2JqZWN0LCBUIGV4dGVuZHMgdHlwZW9mIEJhc2VFeHRyYWN0b3I8Tz4+KF9leHRyYWN0b3I6IFQsIG9wdGlvbnM6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxUPlsnMSddKTogUHJvbWlzZTxJbnN0YW5jZVR5cGU8VD4gfCBudWxsPiB7XG4gICAgICAgIGlmICh0eXBlb2YgX2V4dHJhY3Rvci5pZGVudGlmaWVyICE9PSAnc3RyaW5nJyB8fCB0aGlzLnN0b3JlLmhhcyhfZXh0cmFjdG9yLmlkZW50aWZpZXIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZXh0cmFjdG9yID0gbmV3IF9leHRyYWN0b3IodGhpcywgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAodGhpcy5wbGF5ZXIub3B0aW9ucy5icmlkZ2VQcm92aWRlcikgb3B0aW9ucy5icmlkZ2VQcm92aWRlciA/Pz0gdGhpcy5wbGF5ZXIub3B0aW9ucy5icmlkZ2VQcm92aWRlcjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXQoX2V4dHJhY3Rvci5pZGVudGlmaWVyLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBsb2FkZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlZ2lzdGVyZWQnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgYXdhaXQgZXh0cmFjdG9yLmFjdGl2YXRlKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGFjdGl2YXRlZCFgKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYWN0aXZhdGUnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RvciBhcyB1bmtub3duIGFzIEluc3RhbmNlVHlwZTxUPjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5kZWxldGUoX2V4dHJhY3Rvci5pZGVudGlmaWVyKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYCR7X2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZmFpbGVkIHRvIGFjdGl2YXRlISBFcnJvcjogJHtlfWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMsIGV4dHJhY3RvciwgZSBhcyBFcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXIgc2luZ2xlIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBfZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdG8gdW5yZWdpc3RlclxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyPEsgZXh0ZW5kcyBzdHJpbmcgfCBCYXNlRXh0cmFjdG9yPihfZXh0cmFjdG9yOiBLKSB7XG4gICAgICAgIGNvbnN0IGV4dHJhY3RvciA9IHR5cGVvZiBfZXh0cmFjdG9yID09PSAnc3RyaW5nJyA/IHRoaXMuc3RvcmUuZ2V0KF9leHRyYWN0b3IpIDogdGhpcy5zdG9yZS5maW5kKChyKSA9PiByID09PSBfZXh0cmFjdG9yKTtcbiAgICAgICAgaWYgKCFleHRyYWN0b3IpIHJldHVybjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gZXh0cmFjdG9yLmlkZW50aWZpZXIgfHwgdGhpcy5zdG9yZS5maW5kS2V5KChlKSA9PiBlID09PSBleHRyYWN0b3IpITtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZGlzYWJsZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3VucmVnaXN0ZXJlZCcsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICAgICAgICBhd2FpdCBleHRyYWN0b3IuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGRlYWN0aXZhdGVkIWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdkZWFjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGZhaWxlZCB0byBkZWFjdGl2YXRlIWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMsIGV4dHJhY3RvciwgZSBhcyBFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbnJlZ2lzdGVyIGFsbCBleHRyYWN0b3JzXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXJBbGwoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnN0b3JlLm1hcCgoZSkgPT4gdGhpcy51bnJlZ2lzdGVyKGUpKSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVuIGFsbCB0aGUgZXh0cmFjdG9yc1xuICAgICAqIEBwYXJhbSBmbiBUaGUgcnVubmVyIGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIGZpbHRlckJsb2NrZWQgRmlsdGVyIGJsb2NrZWQgZXh0cmFjdG9yc1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBydW48VCA9IHVua25vd24+KGZuOiBFeHRyYWN0b3JFeGVjdXRpb25GTjxUPiwgZmlsdGVyQmxvY2tlZCA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgYmxvY2tlZCA9IHRoaXMucGxheWVyLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzID8/IFtdO1xuXG4gICAgICAgIGlmICghdGhpcy5zdG9yZS5zaXplKSB7XG4gICAgICAgICAgICBVdGlsLndhcm4oJ1NraXBwaW5nIGV4dHJhY3RvcnMgZXhlY3V0aW9uIHNpbmNlIHplcm8gZXh0cmFjdG9ycyB3ZXJlIHJlZ2lzdGVyZWQnLCAnTm9FeHRyYWN0b3JzJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzb3J0IGJ5IHByaW9yaXR5IHNvIHRoYXQgZXh0cmFjdG9ycyB3aXRoIGhpZ2hlciBwcmlvcml0eSBhcmUgZXhlY3V0ZWQgZmlyc3RcbiAgICAgICAgY29uc3QgZXh0cmFjdG9ycyA9IHRoaXMuc3RvcmUuc29ydCgoYSwgYikgPT4gYi5wcmlvcml0eSAtIGEucHJpb3JpdHkpO1xuXG4gICAgICAgIGxldCBlcnI6IEVycm9yIHwgbnVsbCA9IG51bGwsXG4gICAgICAgICAgICBsYXN0RXh0OiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgZm9yIChjb25zdCBleHQgb2YgZXh0cmFjdG9ycy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKGZpbHRlckJsb2NrZWQgJiYgYmxvY2tlZC5zb21lKChlKSA9PiBlID09PSBleHQuaWRlbnRpZmllcikpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgRXhlY3V0aW5nIGV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfS4uLmApO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oZXh0KS50aGVuKFxuICAgICAgICAgICAgICAgIChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgd2l0aCBlcnJvcjogJHtlfWApO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUeXBlVXRpbC5pc0Vycm9yKGUpID8gZSA6IG5ldyBFcnJvcihgJHtlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGxhc3RFeHQgPSBleHQ7XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgIVR5cGVVdGlsLmlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBleGVjdXRlZCBzdWNjZXNzZnVsbHkhYCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3I6IGV4dCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgICAgICAgIH0gYXMgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PFQ+O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChUeXBlVXRpbC5pc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICBlcnIgPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBleHRyYWN0b3I6IGxhc3RFeHQhLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnIsXG4gICAgICAgICAgICAgICAgcmVzdWx0OiBmYWxzZVxuICAgICAgICAgICAgfSBhcyBFeHRyYWN0b3JFeGVjdXRpb25SZXN1bHQ8ZmFsc2U+O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGV4dHJhY3RvciBpcyBkaXNhYmxlZFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0Rpc2FibGVkKGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIub3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGlkZW50aWZpZXIpID8/IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGV4dHJhY3RvciBpcyBlbmFibGVkXG4gICAgICovXG4gICAgcHVibGljIGlzRW5hYmxlZChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWQoaWRlbnRpZmllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlSWQocmVzb2x2YWJsZTogRXh0cmFjdG9yUmVzb2x2YWJsZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnID8gcmVzb2x2YWJsZSA6IHJlc29sdmFibGUuaWRlbnRpZmllcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlKHJlc29sdmFibGU6IEV4dHJhY3RvclJlc29sdmFibGUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJyA/IHRoaXMuZ2V0KHJlc29sdmFibGUpIDogcmVzb2x2YWJsZTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PFQgPSB1bmtub3duPiB7XG4gICAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yO1xuICAgIGVycm9yOiBFcnJvciB8IG51bGw7XG4gICAgcmVzdWx0OiBUO1xufVxuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JFeGVjdXRpb25GTjxUID0gdW5rbm93bj4gPSAoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiBQcm9taXNlPFQgfCBib29sZWFuPjtcblxuZXhwb3J0IHR5cGUgRXh0cmFjdG9yUmVzb2x2YWJsZSA9IHN0cmluZyB8IEJhc2VFeHRyYWN0b3I7XG4iLCAiaW1wb3J0IHsgRXF1YWxpemVyQmFuZCwgUENNRmlsdGVycywgQmlxdWFkRmlsdGVycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiwgUXVldWVTdHJhdGVneSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBHdWlsZFJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciwgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IEZpbHRlcnNOYW1lLCBRdWV1ZVJlcGVhdE1vZGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQgPSB1bmtub3duPiB7XG4gICAgc3RyYXRlZ3k/OiBRdWV1ZVN0cmF0ZWd5O1xuICAgIHZvbHVtZT86IG51bWJlcjtcbiAgICBlcXVhbGl6ZXI/OiBFcXVhbGl6ZXJCYW5kW107XG4gICAgYV9maWx0ZXI/OiBQQ01GaWx0ZXJzW107XG4gICAgYmlxdWFkPzogQmlxdWFkRmlsdGVycztcbiAgICByZXNhbXBsZXI/OiBudW1iZXI7XG4gICAgZGlzYWJsZUhpc3Rvcnk/OiBib29sZWFuO1xuICAgIG9uQmVmb3JlQ3JlYXRlU3RyZWFtPzogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/OiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICByZXBlYXRNb2RlPzogUXVldWVSZXBlYXRNb2RlO1xuICAgIHBhdXNlT25FbXB0eT86IGJvb2xlYW47XG4gICAgbGVhdmVPbkVtcHR5PzogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW1wdHlDb29sZG93bj86IG51bWJlcjtcbiAgICBsZWF2ZU9uRW5kPzogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW5kQ29vbGRvd24/OiBudW1iZXI7XG4gICAgbGVhdmVPblN0b3A/OiBib29sZWFuO1xuICAgIGxlYXZlT25TdG9wQ29vbGRvd24/OiBudW1iZXI7XG4gICAgbWV0YWRhdGE/OiBUIHwgbnVsbDtcbiAgICBzZWxmRGVhZj86IGJvb2xlYW47XG4gICAgY29ubmVjdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gICAgZGVmYXVsdEZGbXBlZ0ZpbHRlcnM/OiBGaWx0ZXJzTmFtZVtdO1xuICAgIGJ1ZmZlcmluZ1RpbWVvdXQ/OiBudW1iZXI7XG4gICAgbm9FbWl0SW5zZXJ0PzogYm9vbGVhbjtcbiAgICBtYXhTaXplPzogbnVtYmVyO1xuICAgIG1heEhpc3RvcnlTaXplPzogbnVtYmVyO1xuICAgIHByZWZlckJyaWRnZWRNZXRhZGF0YT86IGJvb2xlYW47XG4gICAgZGlzYWJsZVZvbHVtZT86IGJvb2xlYW47XG4gICAgZGlzYWJsZUVxdWFsaXplcj86IGJvb2xlYW47XG4gICAgZGlzYWJsZUZpbHRlcmVyPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlUmVzYW1wbGVyPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgTm9kZVJlc29sdmFibGUgPSBHdWlsZFF1ZXVlIHwgR3VpbGRSZXNvbHZhYmxlO1xuXG5leHBvcnQgY2xhc3MgR3VpbGROb2RlTWFuYWdlcjxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBjYWNoZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZT4oKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7fVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGd1aWxkIHF1ZXVlIGlmIGl0IGRvZXMgbm90IGV4aXN0XG4gICAgICogQHBhcmFtIGd1aWxkIFRoZSBndWlsZCB3aGljaCB3aWxsIGJlIHRoZSBvd25lciBvZiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBRdWV1ZSBpbml0aWFsaXplciBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZTxUID0gTWV0YT4oZ3VpbGQ6IEd1aWxkUmVzb2x2YWJsZSwgb3B0aW9uczogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPiA9IHt9KTogR3VpbGRRdWV1ZTxUPiB7XG4gICAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZShndWlsZCk7XG4gICAgICAgIGlmICghc2VydmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19HVUlMRCgnSW52YWxpZCBvciB1bmtub3duIGd1aWxkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jYWNoZS5oYXMoc2VydmVyLmlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHNlcnZlci5pZCkgYXMgR3VpbGRRdWV1ZTxUPjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMuc3RyYXRlZ3kgPz89ICdGSUZPJztcbiAgICAgICAgb3B0aW9ucy52b2x1bWUgPz89IDEwMDtcbiAgICAgICAgb3B0aW9ucy5lcXVhbGl6ZXIgPz89IFtdO1xuICAgICAgICBvcHRpb25zLmFfZmlsdGVyID8/PSBbXTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlSGlzdG9yeSA/Pz0gZmFsc2U7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVtcHR5ID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duID8/PSAwO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25FbmQgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duID8/PSAwO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25TdG9wID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24gPz89IDA7XG4gICAgICAgIG9wdGlvbnMucmVzYW1wbGVyID8/PSA0ODAwMDtcbiAgICAgICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICAgICAgb3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/Pz0gdGhpcy5wbGF5ZXIub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dDtcbiAgICAgICAgb3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0ID8/PSAxMDAwO1xuICAgICAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgICAgICBvcHRpb25zLm1heEhpc3RvcnlTaXplID8/PSBJbmZpbml0eTtcbiAgICAgICAgb3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGEgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuICAgICAgICAvLyB0b2RvKHR3bGl0ZSk6IG1heWJlIGRpc2FibGUgdGhlc2UgYnkgZGVmYXVsdD9cbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlQmlxdWFkID8/PSBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyID8/PSBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIgPz89IGZhbHNlO1xuICAgICAgICBvcHRpb25zLmRpc2FibGVWb2x1bWUgPz89IGZhbHNlO1xuICAgICAgICBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIgPz89IHRydWU7XG5cbiAgICAgICAgaWYgKGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpICYmICFvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtKSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoJ0Bbb25CZWZvcmVDcmVhdGVTdHJlYW1dJykgYXMgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJykgJiYgIW9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSkge1xuICAgICAgICAgICAgb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nKSBhcyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHF1ZXVlID0gbmV3IEd1aWxkUXVldWU8VD4odGhpcy5wbGF5ZXIsIHtcbiAgICAgICAgICAgIGd1aWxkOiBzZXJ2ZXIsXG4gICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5OiBvcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgICAgICAgdm9sdW1lOiBvcHRpb25zLnZvbHVtZSxcbiAgICAgICAgICAgIGVxdWFsaXplcjogb3B0aW9ucy5lcXVhbGl6ZXIsXG4gICAgICAgICAgICBmaWx0ZXJlcjogb3B0aW9ucy5hX2ZpbHRlcixcbiAgICAgICAgICAgIGJpcXVhZDogb3B0aW9ucy5iaXF1YWQsXG4gICAgICAgICAgICByZXNhbXBsZXI6IG9wdGlvbnMucmVzYW1wbGVyLFxuICAgICAgICAgICAgZGlzYWJsZUhpc3Rvcnk6IG9wdGlvbnMuZGlzYWJsZUhpc3RvcnksXG4gICAgICAgICAgICBvbkJlZm9yZUNyZWF0ZVN0cmVhbTogb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSxcbiAgICAgICAgICAgIG9uQWZ0ZXJDcmVhdGVTdHJlYW06IG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSxcbiAgICAgICAgICAgIHJlcGVhdE1vZGU6IG9wdGlvbnMucmVwZWF0TW9kZSxcbiAgICAgICAgICAgIGxlYXZlT25FbXB0eTogb3B0aW9ucy5sZWF2ZU9uRW1wdHksXG4gICAgICAgICAgICBsZWF2ZU9uRW1wdHlDb29sZG93bjogb3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93bixcbiAgICAgICAgICAgIGxlYXZlT25FbmQ6IG9wdGlvbnMubGVhdmVPbkVuZCxcbiAgICAgICAgICAgIGxlYXZlT25FbmRDb29sZG93bjogb3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24sXG4gICAgICAgICAgICBsZWF2ZU9uU3RvcDogb3B0aW9ucy5sZWF2ZU9uU3RvcCxcbiAgICAgICAgICAgIGxlYXZlT25TdG9wQ29vbGRvd246IG9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93bixcbiAgICAgICAgICAgIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLFxuICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IG9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQgPz8gMTIwXzAwMCxcbiAgICAgICAgICAgIHNlbGZEZWFmOiBvcHRpb25zLnNlbGZEZWFmLFxuICAgICAgICAgICAgZmZtcGVnRmlsdGVyczogb3B0aW9ucy5kZWZhdWx0RkZtcGVnRmlsdGVycyA/PyBbXSxcbiAgICAgICAgICAgIGJ1ZmZlcmluZ1RpbWVvdXQ6IG9wdGlvbnMuYnVmZmVyaW5nVGltZW91dCxcbiAgICAgICAgICAgIG5vRW1pdEluc2VydDogb3B0aW9ucy5ub0VtaXRJbnNlcnQgPz8gZmFsc2UsXG4gICAgICAgICAgICBwcmVmZXJCcmlkZ2VkTWV0YWRhdGE6IG9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhLFxuICAgICAgICAgICAgbWF4SGlzdG9yeVNpemU6IG9wdGlvbnMubWF4SGlzdG9yeVNpemUsXG4gICAgICAgICAgICBtYXhTaXplOiBvcHRpb25zLm1heFNpemUsXG4gICAgICAgICAgICBwYXVzZU9uRW1wdHk6IG9wdGlvbnMucGF1c2VPbkVtcHR5LFxuICAgICAgICAgICAgZGlzYWJsZUJpcXVhZDogb3B0aW9ucy5kaXNhYmxlQmlxdWFkLFxuICAgICAgICAgICAgZGlzYWJsZUVxdWFsaXplcjogb3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyLFxuICAgICAgICAgICAgZGlzYWJsZUZpbHRlcmVyOiBvcHRpb25zLmRpc2FibGVGaWx0ZXJlcixcbiAgICAgICAgICAgIGRpc2FibGVSZXNhbXBsZXI6IG9wdGlvbnMuZGlzYWJsZVJlc2FtcGxlcixcbiAgICAgICAgICAgIGRpc2FibGVWb2x1bWU6IG9wdGlvbnMuZGlzYWJsZVZvbHVtZVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNhY2hlLnNldChzZXJ2ZXIuaWQsIHF1ZXVlKTtcblxuICAgICAgICByZXR1cm4gcXVldWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGV4aXN0aW5nIHF1ZXVlXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQ8VCA9IE1ldGE+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgICAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gKHRoaXMuY2FjaGUuZ2V0KHF1ZXVlLmlkKSBhcyBHdWlsZFF1ZXVlPFQ+KSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgcXVldWUgZXhpc3RzXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBoYXMobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgaWQgPSBub2RlIGluc3RhbmNlb2YgR3VpbGRRdWV1ZSA/IG5vZGUuaWQgOiB0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmVJZChub2RlKSE7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmhhcyhpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIHF1ZXVlXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGUobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgcXVldWUgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgICAgIGlmICghcXVldWUpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX0dVSUxEX1FVRVVFKCdDYW5ub3QgZGVsZXRlIG5vbi1leGlzdGluZyBxdWV1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUuc2V0VHJhbnNpdGlvbmluZyh0cnVlKTtcbiAgICAgICAgcXVldWUubm9kZS5zdG9wKHRydWUpO1xuICAgICAgICBxdWV1ZS5jb25uZWN0aW9uPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgcXVldWUuZGlzcGF0Y2hlcj8ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHF1ZXVlLmRpc3BhdGNoZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgcXVldWUudGltZW91dHMuZm9yRWFjaCgodG0pID0+IGNsZWFyVGltZW91dCh0bSkpO1xuICAgICAgICBxdWV1ZS5oaXN0b3J5LmNsZWFyKCk7XG4gICAgICAgIHF1ZXVlLnRyYWNrcy5jbGVhcigpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmRlbGV0ZShxdWV1ZS5pZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZTxUID0gTWV0YT4obm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBHdWlsZFF1ZXVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldCh0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmVJZChub2RlKSEpIGFzIEd1aWxkUXVldWU8VD4gfCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBxdWV1ZSBpZFxuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZUlkKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHEgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgICAgIHJldHVybiBxPy5pZCB8fCBudWxsO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBQbGF5ZXIsIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnMsIFRyYWNrTGlrZSB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBDaGFubmVsVHlwZSwgR3VpbGQsIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgVm9pY2VCYXNlZENoYW5uZWwsIFZvaWNlU3RhdGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlLCBRdWV1ZVN0cmF0ZWd5IH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEJpcXVhZEZpbHRlcnMsIEVxdWFsaXplckJhbmQsIFBDTUZpbHRlcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4uL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXInO1xuaW1wb3J0IHsgdHlwZSBBdWRpb1BsYXllciwgQXVkaW9SZXNvdXJjZSwgU3RyZWFtVHlwZSwgVm9pY2VDb25uZWN0aW9uLCBWb2ljZUNvbm5lY3Rpb25TdGF0dXMgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgVXRpbCwgVkFMSURBVEVfUVVFVUVfQ0FQIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlSGlzdG9yeSB9IGZyb20gJy4vR3VpbGRRdWV1ZUhpc3RvcnknO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZVBsYXllck5vZGUsIFN0cmVhbUNvbmZpZyB9IGZyb20gJy4vR3VpbGRRdWV1ZVBsYXllck5vZGUnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZUF1ZGlvRmlsdGVycyB9IGZyb20gJy4vR3VpbGRRdWV1ZUF1ZGlvRmlsdGVycyc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSwgUXVldWVSZXBlYXRNb2RlLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAndGltZXJzJztcbmltcG9ydCB7IEd1aWxkUXVldWVTdGF0aXN0aWNzIH0gZnJvbSAnLi9HdWlsZFF1ZXVlU3RhdGlzdGljcyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuLi91dGlscy9Bc3luY1F1ZXVlJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkTm9kZUluaXQ8TWV0YSA9IHVua25vd24+IHtcbiAgICBndWlsZDogR3VpbGQ7XG4gICAgcXVldWVTdHJhdGVneTogUXVldWVTdHJhdGVneTtcbiAgICBlcXVhbGl6ZXI6IEVxdWFsaXplckJhbmRbXSB8IGJvb2xlYW47XG4gICAgdm9sdW1lOiBudW1iZXIgfCBib29sZWFuO1xuICAgIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgcmVzYW1wbGVyOiBudW1iZXIgfCBib29sZWFuO1xuICAgIGZpbHRlcmVyOiBQQ01GaWx0ZXJzW10gfCBib29sZWFuO1xuICAgIGZmbXBlZ0ZpbHRlcnM6IEZpbHRlcnNOYW1lW107XG4gICAgZGlzYWJsZUhpc3Rvcnk6IGJvb2xlYW47XG4gICAgb25CZWZvcmVDcmVhdGVTdHJlYW0/OiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgb25BZnRlckNyZWF0ZVN0cmVhbT86IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgIHJlcGVhdE1vZGU/OiBRdWV1ZVJlcGVhdE1vZGU7XG4gICAgbGVhdmVPbkVtcHR5OiBib29sZWFuO1xuICAgIGxlYXZlT25FbXB0eUNvb2xkb3duOiBudW1iZXI7XG4gICAgbGVhdmVPbkVuZDogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW5kQ29vbGRvd246IG51bWJlcjtcbiAgICBsZWF2ZU9uU3RvcDogYm9vbGVhbjtcbiAgICBsZWF2ZU9uU3RvcENvb2xkb3duOiBudW1iZXI7XG4gICAgY29ubmVjdGlvblRpbWVvdXQ6IG51bWJlcjtcbiAgICBzZWxmRGVhZj86IGJvb2xlYW47XG4gICAgbWV0YWRhdGE/OiBNZXRhIHwgbnVsbDtcbiAgICBidWZmZXJpbmdUaW1lb3V0OiBudW1iZXI7XG4gICAgbm9FbWl0SW5zZXJ0OiBib29sZWFuO1xuICAgIG1heFNpemU/OiBudW1iZXI7XG4gICAgbWF4SGlzdG9yeVNpemU/OiBudW1iZXI7XG4gICAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhOiBib29sZWFuO1xuICAgIHBhdXNlT25FbXB0eT86IGJvb2xlYW47XG4gICAgZGlzYWJsZVZvbHVtZTogYm9vbGVhbjtcbiAgICBkaXNhYmxlRXF1YWxpemVyOiBib29sZWFuO1xuICAgIGRpc2FibGVGaWx0ZXJlcjogYm9vbGVhbjtcbiAgICBkaXNhYmxlQmlxdWFkOiBib29sZWFuO1xuICAgIGRpc2FibGVSZXNhbXBsZXI6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VDb25uZWN0Q29uZmlnIHtcbiAgICBkZWFmPzogYm9vbGVhbjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuICAgIGdyb3VwPzogc3RyaW5nO1xuICAgIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdFByb2Nlc3NlZFJlc3VsdCB7XG4gICAgc3RyZWFtOiBSZWFkYWJsZTtcbiAgICB0eXBlOiBTdHJlYW1UeXBlO1xufVxuXG5leHBvcnQgdHlwZSBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgPSAodHJhY2s6IFRyYWNrLCBxdWVyeVR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSwgcXVldWU6IEd1aWxkUXVldWUpID0+IFByb21pc2U8UmVhZGFibGUgfCBudWxsPjtcbmV4cG9ydCB0eXBlIE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyID0gKHN0cmVhbTogUmVhZGFibGUsIHF1ZXVlOiBHdWlsZFF1ZXVlKSA9PiBQcm9taXNlPFBvc3RQcm9jZXNzZWRSZXN1bHQgfCBudWxsPjtcblxuZXhwb3J0IHR5cGUgUGxheWVyVHJpZ2dlcmVkUmVhc29uID0gJ2ZpbHRlcnMnIHwgJ25vcm1hbCc7XG5cbmV4cG9ydCBjb25zdCBHdWlsZFF1ZXVlRXZlbnQgPSB7XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tBZGQ6ICdhdWRpb1RyYWNrQWRkJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIHdlcmUgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgYXVkaW9UcmFja3NBZGQ6ICdhdWRpb1RyYWNrc0FkZCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrUmVtb3ZlOiAnYXVkaW9UcmFja1JlbW92ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tzUmVtb3ZlOiAnYXVkaW9UcmFja3NSZW1vdmUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY3JlYXRlZFxuICAgICAqL1xuICAgIGNvbm5lY3Rpb246ICdjb25uZWN0aW9uJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZFxuICAgICAqL1xuICAgIGNvbm5lY3Rpb25EZXN0cm95ZWQ6ICdjb25uZWN0aW9uRGVzdHJveWVkJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3Q6ICdkaXNjb25uZWN0JyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIHNlbmRzIGEgZGVidWcgaW5mb1xuICAgICAqL1xuICAgIGRlYnVnOiAnZGVidWcnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgICAqL1xuICAgIGVycm9yOiAnZXJyb3InLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2UgY2hhbm5lbCBpcyBlbXB0eVxuICAgICAqL1xuICAgIGVtcHR5Q2hhbm5lbDogJ2VtcHR5Q2hhbm5lbCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgICAqL1xuICAgIGVtcHR5UXVldWU6ICdlbXB0eVF1ZXVlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICovXG4gICAgcGxheWVyU3RhcnQ6ICdwbGF5ZXJTdGFydCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZXJyb3JzIHdoaWxlIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqL1xuICAgIHBsYXllckVycm9yOiAncGxheWVyRXJyb3InLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGZpbmlzaGVzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqL1xuICAgIHBsYXllckZpbmlzaDogJ3BsYXllckZpbmlzaCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgICAqL1xuICAgIHBsYXllclNraXA6ICdwbGF5ZXJTa2lwJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBpcyB0cmlnZ2VyZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJUcmlnZ2VyOiAncGxheWVyVHJpZ2dlcicsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBzdGF0ZSBpcyB1cGRhdGVkLiBDb25zdW1pbmcgdGhpcyBldmVudCBtYXkgZGlzYWJsZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGBQbGF5ZXIuaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpYCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICovXG4gICAgdm9pY2VTdGF0ZVVwZGF0ZTogJ3ZvaWNlU3RhdGVVcGRhdGUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB2b2x1bWUgaXMgdXBkYXRlZFxuICAgICAqL1xuICAgIHZvbHVtZUNoYW5nZTogJ3ZvbHVtZUNoYW5nZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHBsYXllciBpcyBwYXVzZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJQYXVzZTogJ3BsYXllclBhdXNlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gcGxheWVyIGlzIHJlc3VtZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJSZXN1bWU6ICdwbGF5ZXJSZXN1bWUnLFxuICAgIC8qKlxuICAgICAqIEJpcXVhZCBGaWx0ZXJzIFVwZGF0ZVxuICAgICAqL1xuICAgIGJpcXVhZEZpbHRlcnNVcGRhdGU6ICdiaXF1YWRGaWx0ZXJzVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBFcXVhbGl6ZXIgVXBkYXRlXG4gICAgICovXG4gICAgZXF1YWxpemVyVXBkYXRlOiAnZXF1YWxpemVyVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBEU1AgdXBkYXRlXG4gICAgICovXG4gICAgZHNwVXBkYXRlOiAnZHNwVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBBdWRpbyBGaWx0ZXJzIFVwZGF0ZVxuICAgICAqL1xuICAgIGF1ZGlvRmlsdGVyc1VwZGF0ZTogJ2F1ZGlvRmlsdGVyc1VwZGF0ZScsXG4gICAgLyoqXG4gICAgICogQXVkaW8gcGxheWVyIHdpbGwgcGxheSBuZXh0IHRyYWNrXG4gICAgICovXG4gICAgd2lsbFBsYXlUcmFjazogJ3dpbGxQbGF5VHJhY2snLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHZvaWNlIGNoYW5uZWwgaXMgcmVwb3B1bGF0ZWRcbiAgICAgKi9cbiAgICBjaGFubmVsUG9wdWxhdGU6ICdjaGFubmVsUG9wdWxhdGUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXG4gICAgICovXG4gICAgcXVldWVDcmVhdGU6ICdxdWV1ZUNyZWF0ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgZGVsZXRlZFxuICAgICAqL1xuICAgIHF1ZXVlRGVsZXRlOiAncXVldWVEZWxldGUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHRyeWluZyB0byBhZGQgc2ltaWxhciB0cmFjayBmb3IgYXV0b3BsYXlcbiAgICAgKi9cbiAgICB3aWxsQXV0b1BsYXk6ICd3aWxsQXV0b1BsYXknXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZW51bSBUcmFja1NraXBSZWFzb24ge1xuICAgIE5vU3RyZWFtID0gJ0VSUl9OT19TVFJFQU0nLFxuICAgIE1hbnVhbCA9ICdNQU5VQUwnLFxuICAgIFNFRUtfT1ZFUl9USFJFU0hPTEQgPSAnU0VFS19PVkVSX1RIUkVTSE9MRCcsXG4gICAgSnVtcCA9ICdKVU1QRURfVE9fQU5PVEhFUl9UUkFDSycsXG4gICAgU2tpcFRvID0gJ1NLSVBfVE9fQU5PVEhFUl9UUkFDSycsXG4gICAgSGlzdG9yeU5leHQgPSAnSElTVE9SWV9ORVhUX1RSQUNLJ1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlRXZlbnRzPE1ldGEgPSBhbnk+IHtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tBZGQ6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3Mgd2VyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2tzIFRoZSB0cmFja3MgYXJyYXlcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrc0FkZDogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2tbXSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrUmVtb3ZlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tzUmVtb3ZlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFja1tdKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY3JlYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGNvbm5lY3Rpb246IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGNvbm5lY3Rpb25EZXN0cm95ZWQ6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3Q6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIHNlbmRzIGEgZGVidWcgaW5mb1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBkZWJ1ZyBtZXNzYWdlXG4gICAgICovXG4gICAgZGVidWc6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgbWVzc2FnZTogc3RyaW5nKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcjogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBlcnJvcjogRXJyb3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgZW1wdHlDaGFubmVsOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGVtcHR5UXVldWU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAgICovXG4gICAgcGxheWVyU3RhcnQ6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAgICovXG4gICAgcGxheWVyRXJyb3I6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgZXJyb3I6IEVycm9yLCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZmluaXNoZXMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdhcyBiZWluZyBzdHJlYW1lZFxuICAgICAqL1xuICAgIHBsYXllckZpbmlzaDogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3YXMgc2tpcHBlZFxuICAgICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiBmb3Igc2tpcHBpbmdcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIGZvciBza2lwcGluZ1xuICAgICAqL1xuICAgIHBsYXllclNraXA6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrLCByZWFzb246IFRyYWNrU2tpcFJlYXNvbiwgZGVzY3JpcHRpb246IHN0cmluZykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBpcyB0cmlnZ2VyZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHdoaWNoIHdhcyBwbGF5ZWQgaW4gdGhpcyBldmVudFxuICAgICAqL1xuICAgIHBsYXllclRyaWdnZXI6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrLCByZWFzb246IFBsYXllclRyaWdnZXJlZFJlYXNvbikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIHN0YXRlIGlzIHVwZGF0ZWQuIENvbnN1bWluZyB0aGlzIGV2ZW50IG1heSBkaXNhYmxlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgYFBsYXllci5pc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKClgIHJldHVybnMgYGZhbHNlYC5cbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgICAqIEBwYXJhbSBuZXdTdGF0ZSBUaGUgbmV3IHZvaWNlIHN0YXRlXG4gICAgICovXG4gICAgdm9pY2VTdGF0ZVVwZGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHBsYXllciBpcyBwYXVzZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJQYXVzZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyBwbGF5ZXIgaXMgcmVzdW1lZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIHBsYXllclJlc3VtZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyBwbGF5ZXIncyB2b2x1bWUgaXMgY2hhbmdlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRWb2x1bWUgVGhlIG9sZCB2b2x1bWVcbiAgICAgKiBAcGFyYW0gbmV3Vm9sdW1lIFRoZSB1cGRhdGVkIHZvbHVtZVxuICAgICAqL1xuICAgIHZvbHVtZUNoYW5nZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRWb2x1bWU6IG51bWJlciwgbmV3Vm9sdW1lOiBudW1iZXIpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGVxdWFsaXplciBjb25maWcgaXMgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICAgKi9cbiAgICBlcXVhbGl6ZXJVcGRhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkRmlsdGVyczogRXF1YWxpemVyQmFuZFtdLCBuZXdGaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGJpcXVhZCBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAgICovXG4gICAgYmlxdWFkRmlsdGVyc1VwZGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRGaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzIHwgbnVsbCwgbmV3RmlsdGVyczogQmlxdWFkRmlsdGVycyB8IG51bGwpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGRzcCBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAgICovXG4gICAgZHNwVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZEZpbHRlcnM6IFBDTUZpbHRlcnNbXSwgbmV3RmlsdGVyczogUENNRmlsdGVyc1tdKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBmZm1wZWcgYXVkaW8gZmlsdGVycyBpcyB1cGRhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgICAqL1xuICAgIGF1ZGlvRmlsdGVyc1VwZGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdLCBuZXdGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdKSA9PiB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgc3RyZWFtaW5nIGFuIGF1ZGlvIHRyYWNrLiBUaGlzIGV2ZW50IGNhbiBiZSB1c2VkIHRvIG1vZGlmeSBzdHJlYW0gY29uZmlnIGJlZm9yZSBwbGF5aW5nIGEgdHJhY2suXG4gICAgICogTGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQgd2lsbCBwYXVzZSB0aGUgZXhlY3V0aW9uIG9mIGF1ZGlvIHBsYXllciB1bnRpbCBgZG9uZSgpYCBpcyBpbnZva2VkLlxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3aWxsIGJlIHN0cmVhbWVkXG4gICAgICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9ucyBmb3Igc3RyZWFtaW5nXG4gICAgICogQHBhcmFtIGRvbmUgRG9uZSBjYWxsYmFja1xuICAgICAqL1xuICAgIHdpbGxQbGF5VHJhY2s6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrPHVua25vd24+LCBjb25maWc6IFN0cmVhbUNvbmZpZywgZG9uZTogKCkgPT4gdm9pZCkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjaGFubmVsIGlzIHBvcHVsYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGNoYW5uZWxQb3B1bGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgcXVldWVDcmVhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBzdWNjZXNzZnVsbHkgZGVsZXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIHF1ZXVlRGVsZXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgdHJ5aW5nIHRvIGFkZCBzaW1pbGFyIHRyYWNrIGZvciBhdXRvcGxheVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFja3MgVGhlIHNpbWlsYXIgdHJhY2tzIHRoYXQgd2VyZSBmb3VuZFxuICAgICAqIEBwYXJhbSBkb25lIERvbmUgY2FsbGJhY2tcbiAgICAgKi9cbiAgICB3aWxsQXV0b1BsYXk6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2tzOiBUcmFja1tdLCBkb25lOiAodHJhY2s6IFRyYWNrIHwgbnVsbCkgPT4gdm9pZCkgPT4gdW5rbm93bjtcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWU8TWV0YSA9IHVua25vd24+IHtcbiAgICAjdHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICNkZWxldGVkID0gZmFsc2U7XG4gICAgI3NodWZmbGUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9fY3VycmVudDogVHJhY2sgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgdHJhY2tzOiBRdWV1ZTxUcmFjaz47XG4gICAgcHVibGljIGhpc3RvcnkgPSBuZXcgR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgbm9kZSA9IG5ldyBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhPih0aGlzKTtcbiAgICBwdWJsaWMgZmlsdGVycyA9IG5ldyBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBvbkJlZm9yZUNyZWF0ZVN0cmVhbTogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyID0gYXN5bmMgKCkgPT4gbnVsbDtcbiAgICBwdWJsaWMgb25BZnRlckNyZWF0ZVN0cmVhbTogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIgPSBhc3luYyAoc3RyZWFtKSA9PiAoe1xuICAgICAgICBzdHJlYW0sXG4gICAgICAgIHR5cGU6IFN0cmVhbVR5cGUuUmF3XG4gICAgfSk7XG4gICAgcHVibGljIHJlcGVhdE1vZGUgPSBRdWV1ZVJlcGVhdE1vZGUuT0ZGO1xuICAgIHB1YmxpYyB0aW1lb3V0cyA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgTm9kZUpTLlRpbWVvdXQ+KCk7XG4gICAgcHVibGljIHN0YXRzID0gbmV3IEd1aWxkUXVldWVTdGF0aXN0aWNzPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyB0YXNrc1F1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIsIHB1YmxpYyBvcHRpb25zOiBHdWlsZE5vZGVJbml0PE1ldGE+KSB7XG4gICAgICAgIHRoaXMudHJhY2tzID0gbmV3IFF1ZXVlPFRyYWNrPihvcHRpb25zLnF1ZXVlU3RyYXRlZ3kpO1xuICAgICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbihvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtKSkgdGhpcy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW07XG4gICAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSkpIHRoaXMub25BZnRlckNyZWF0ZVN0cmVhbSA9IG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbTtcbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc051bGxpc2gob3B0aW9ucy5yZXBlYXRNb2RlKSkgdGhpcy5yZXBlYXRNb2RlID0gb3B0aW9ucy5yZXBlYXRNb2RlO1xuXG4gICAgICAgIG9wdGlvbnMuc2VsZkRlYWYgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMubWF4U2l6ZSA/Pz0gSW5maW5pdHk7XG4gICAgICAgIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz89IEluZmluaXR5O1xuICAgICAgICBvcHRpb25zLnBhdXNlT25FbXB0eSA/Pz0gdHJ1ZTtcblxuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVsbGlzaCh0aGlzLm9wdGlvbnMuYmlxdWFkKSAmJiAhVHlwZVV0aWwuaXNCb29sZWFuKHRoaXMub3B0aW9ucy5iaXF1YWQpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkID0gdGhpcy5vcHRpb25zLmJpcXVhZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5lcXVhbGl6ZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gdGhpcy5vcHRpb25zLmVxdWFsaXplcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5maWx0ZXJlcikpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzID0gdGhpcy5vcHRpb25zLmZpbHRlcmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzTnVtYmVyKHRoaXMub3B0aW9ucy5yZXNhbXBsZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZSA9IHRoaXMub3B0aW9ucy5yZXNhbXBsZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVHlwZVV0aWwuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmZtcGVnRmlsdGVycykpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5mZm1wZWcuc2V0RGVmYXVsdHModGhpcy5vcHRpb25zLmZmbXBlZ0ZpbHRlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihvcHRpb25zLm1heFNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdbR3VpbGROb2RlSW5pdC5tYXhTaXplXScsICdudW1iZXInLCB0eXBlb2Ygb3B0aW9ucy5tYXhTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ1tHdWlsZE5vZGVJbml0Lm1heEhpc3RvcnlTaXplXScsICdudW1iZXInLCB0eXBlb2Ygb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5tYXhTaXplIDwgMSkgb3B0aW9ucy5tYXhTaXplID0gSW5maW5pdHk7XG4gICAgICAgIGlmIChvcHRpb25zLm1heEhpc3RvcnlTaXplIDwgMSkgb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA9IEluZmluaXR5O1xuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBHdWlsZFF1ZXVlIGluaXRpYWxpemVkIGZvciBndWlsZCAke3RoaXMub3B0aW9ucy5ndWlsZC5uYW1lfSAoSUQ6ICR7dGhpcy5vcHRpb25zLmd1aWxkLmlkfSlgKTtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5xdWV1ZUNyZWF0ZSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcXVldWUgaW4gbXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc3RvcmUucmVkdWNlKChhLCBjKSA9PiBhICsgYy5kdXJhdGlvbk1TLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXR0ZWQgZHVyYXRpb24gb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHVyYXRpb25Gb3JtYXR0ZWQoKSB7XG4gICAgICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgcmVjZWl2ZXIgZm9yIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZvaWNlUmVjZWl2ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LnJlY2VpdmVyID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBkZWJ1ZyBtZXNzYWdlIHRvIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gbSBUaGUgbWVzc2FnZSB0byB3cml0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWJ1ZyhtOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5kZWJ1ZywgdGhpcywgbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG1ldGFkYXRhIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1ldGFkYXRhITtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IG1ldGFkYXRhKG06IE1ldGEpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm1ldGFkYXRhID0gbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgbWV0YWRhdGEgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gbSBNZXRhZGF0YSB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0TWV0YWRhdGEobTogTWV0YSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubWV0YWRhdGEgPSBtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBjdXJyZW50IHRyYWNrIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5fX2N1cnJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoaXMgcXVldWUgd2FzIGRlbGV0ZWQgcHJldmlvdXNseVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVsZXRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2RlbGV0ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNoYW5uZWwgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2hhbm5lbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uY2hhbm5lbCB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY2hhbm5lbChjOiBWb2ljZUJhc2VkQ2hhbm5lbCB8IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcGF0Y2hlcikge1xuICAgICAgICAgICAgaWYgKGMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuY2hhbm5lbCA9IGM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb25uZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy52b2ljZUNvbm5lY3Rpb24gfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZ3VpbGQgdGhpcyBxdWV1ZSBiZWxvbmdzIHRvXG4gICAgICovXG4gICAgcHVibGljIGdldCBndWlsZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ndWlsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWxkLmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0cmFuc2l0aW9uIG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlIHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRUcmFuc2l0aW9uaW5nKHN0YXRlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuI3RyYW5zaXRpb25pbmcgPSBzdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBpZiB0aGlzIHF1ZXVlIGlzIGN1cnJlbnRseSB1bmRlciB0cmFuc2l0aW9uIG1vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNUcmFuc2l0aW9uaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHJhbnNpdGlvbmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcmVwZWF0IG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gbW9kZSBUaGUgcmVwZWF0IG1vZGUgdG8gYXBwbHlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0UmVwZWF0TW9kZShtb2RlOiBRdWV1ZVJlcGVhdE1vZGUpIHtcbiAgICAgICAgdGhpcy5yZXBlYXRNb2RlID0gbW9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXggc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBtYXhTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1heFNpemUgPz8gSW5maW5pdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWF4IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNYXhTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhTaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBtYXhIaXN0b3J5U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA/PyBJbmZpbml0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXggaGlzdG9yeSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TWF4SGlzdG9yeVNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1heEhpc3RvcnlTaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBtYXggaGlzdG9yeSBzaXplIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldE1heEhpc3RvcnlTaXplKHNpemU6IG51bWJlcikge1xuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKHNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdzaXplJywgJ251bWJlcicsIHR5cGVvZiBzaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaXplIDwgMSkgc2l6ZSA9IEluZmluaXR5O1xuXG4gICAgICAgIHRoaXMub3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA9IHNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1heCBzaXplIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldE1heFNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIoc2l6ZSkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3NpemUnLCAnbnVtYmVyJywgdHlwZW9mIHNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNpemUgPCAxKSBzaXplID0gSW5maW5pdHk7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zLm1heFNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoaXMgcXVldWUgaGFzIG5vIHRyYWNrcyBsZWZ0IGluIGl0XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGlzIGZ1bGxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNGdWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA+PSB0aGlzLm1heFNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHF1ZXVlIGNhcGFjaXR5XG4gICAgICovXG4gICAgcHVibGljIGdldENhcGFjaXR5KCkge1xuICAgICAgICBpZiAodGhpcy5pc0Z1bGwoKSkgcmV0dXJuIDA7XG4gICAgICAgIGNvbnN0IGNhcCA9IHRoaXMubWF4U2l6ZSAtIHRoaXMuc2l6ZTtcbiAgICAgICAgcmV0dXJuIGNhcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGN1cnJlbnRseSBob2xkcyBhY3RpdmUgYXVkaW8gcmVzb3VyY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNQbGF5aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlICE9IG51bGwgJiYgIXRoaXMuZGlzcGF0Y2hlci5hdWRpb1Jlc291cmNlLmVuZGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCB0cmFjayB0byB0aGUgcXVldWUuIFRoaXMgd2lsbCBlbWl0IGBhdWRpb1RyYWNrc0FkZGAgd2hlbiBtdWx0aXBsZSB0cmFja3MgYXJlIGFkZGVkLCBvdGhlcndpc2UgYGF1ZGlvVHJhY2tBZGRgLlxuICAgICAqIEBwYXJhbSB0cmFjayBUcmFjayBvciBwbGF5bGlzdCBvciBhcnJheSBvZiB0cmFja3MgdG8gYWRkXG4gICAgICovXG4gICAgcHVibGljIGFkZFRyYWNrKHRyYWNrOiBUcmFjayB8IFRyYWNrW10gfCBQbGF5bGlzdCkge1xuICAgICAgICBjb25zdCB0b0FkZCA9IHRyYWNrIGluc3RhbmNlb2YgUGxheWxpc3QgPyB0cmFjay50cmFja3MgOiB0cmFjaztcbiAgICAgICAgY29uc3QgaXNNdWx0aSA9IEFycmF5LmlzQXJyYXkodG9BZGQpO1xuXG4gICAgICAgIFZBTElEQVRFX1FVRVVFX0NBUCh0aGlzLCB0b0FkZCk7XG5cbiAgICAgICAgdGhpcy50cmFja3MuYWRkKHRvQWRkKTtcblxuICAgICAgICBpZiAoaXNNdWx0aSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb1RyYWNrc0FkZCwgdGhpcywgdG9BZGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb1RyYWNrQWRkLCB0aGlzLCB0b0FkZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSB0cmFjayBmcm9tIHF1ZXVlXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZW1vdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlVHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnJlbW92ZSh0cmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyB0aGUgdHJhY2sgdG8gdGhlIGdpdmVuIGluZGV4XG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBpbnNlcnRcbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIGluc2VydCB0aGUgdHJhY2sgYXQgKGRlZmF1bHRzIHRvIDApXG4gICAgICovXG4gICAgcHVibGljIGluc2VydFRyYWNrKHRyYWNrOiBUcmFjaywgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUuaW5zZXJ0KHRyYWNrLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gbW92ZVxuICAgICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gbW92ZSB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBtb3ZlVHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSwgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUubW92ZSh0cmFjaywgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcHkgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gY2xvbmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIGNsb25lIGF0XG4gICAgICovXG4gICAgcHVibGljIGNvcHlUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5jb3B5KHRyYWNrLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3dhcCB0d28gdHJhY2tzIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBzcmMgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICAgKiBAcGFyYW0gZGVzdCBUaGUgc2Vjb25kIHRyYWNrIHRvIHN3YXBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3dhcFRyYWNrcyhzcmM6IFRyYWNrUmVzb2x2YWJsZSwgZGVzdDogVHJhY2tSZXNvbHZhYmxlKTogdm9pZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUuc3dhcChzcmMsIGRlc3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBzdHJlYW0gZGlzcGF0Y2hlciBmcm9tIHRoZSBnaXZlbiBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gdXNlXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZURpc3BhdGNoZXIoY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uLCBvcHRpb25zOiBQaWNrPFZvaWNlQ29ubmVjdENvbmZpZywgJ2F1ZGlvUGxheWVyJyB8ICd0aW1lb3V0Jz4gPSB7fSkge1xuICAgICAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX1ZPSUNFX0NPTk5FQ1RJT05fREVTVFJPWUVEKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5wbGF5ZXIuY2xpZW50LmNoYW5uZWxzLmNhY2hlLmdldChjb25uZWN0aW9uLmpvaW5Db25maWcuY2hhbm5lbElkISk7XG4gICAgICAgIGlmICghY2hhbm5lbCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fVk9JQ0VfQ0hBTk5FTCgpO1xuICAgICAgICBpZiAoIWNoYW5uZWwuaXNWb2ljZUJhc2VkKCkpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2NoYW5uZWwnLCBgVm9pY2VCYXNlZENoYW5uZWwgKHR5cGUgJHtDaGFubmVsVHlwZS5HdWlsZFZvaWNlfS8ke0NoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZX0pYCwgU3RyaW5nKGNoYW5uZWw/LnR5cGUpKTtcblxuICAgICAgICBpZiAodGhpcy5kaXNwYXRjaGVyKSB7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVMaXN0ZW5lcnModGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbmV3IFN0cmVhbURpc3BhdGNoZXIoY29ubmVjdGlvbiwgY2hhbm5lbCwgdGhpcywgb3B0aW9ucy50aW1lb3V0ID8/IHRoaXMub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCwgb3B0aW9ucy5hdWRpb1BsYXllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0gY2hhbm5lbFJlc29sdmFibGUgVGhlIHZvaWNlIGNoYW5uZWwgdG8gY29ubmVjdCB0b1xuICAgICAqIEBwYXJhbSBvcHRpb25zIEpvaW4gY29uZmlnXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNvbm5lY3QoY2hhbm5lbFJlc29sdmFibGU6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgb3B0aW9uczogVm9pY2VDb25uZWN0Q29uZmlnID0ge30pIHtcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucGxheWVyLmNsaWVudC5jaGFubmVscy5yZXNvbHZlKGNoYW5uZWxSZXNvbHZhYmxlKTtcbiAgICAgICAgaWYgKCFjaGFubmVsIHx8ICFjaGFubmVsLmlzVm9pY2VCYXNlZCgpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdjaGFubmVsJywgYFZvaWNlQmFzZWRDaGFubmVsICh0eXBlICR7Q2hhbm5lbFR5cGUuR3VpbGRWb2ljZX0vJHtDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2V9KWAsIFN0cmluZyhjaGFubmVsPy50eXBlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ29ubmVjdGluZyB0byAke2NoYW5uZWwudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlID8gJ3N0YWdlJyA6ICd2b2ljZSd9IGNoYW5uZWwgJHtjaGFubmVsLm5hbWV9IChJRDogJHtjaGFubmVsLmlkfSlgKTtcblxuICAgICAgICBpZiAodGhpcy5kaXNwYXRjaGVyICYmIGNoYW5uZWwuaWQgIT09IHRoaXMuZGlzcGF0Y2hlci5jaGFubmVsLmlkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRGVzdHJveWluZyBvbGQgY29ubmVjdGlvbicpO1xuICAgICAgICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IGF3YWl0IHRoaXMucGxheWVyLnZvaWNlVXRpbHMuY29ubmVjdChjaGFubmVsLCB7XG4gICAgICAgICAgICBkZWFmOiBvcHRpb25zLmRlYWYgPz8gdGhpcy5vcHRpb25zLnNlbGZEZWFmID8/IHRydWUsXG4gICAgICAgICAgICBtYXhUaW1lOiBvcHRpb25zPy50aW1lb3V0ID8/IHRoaXMub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/PyAxMjBfMDAwLFxuICAgICAgICAgICAgcXVldWU6IHRoaXMsXG4gICAgICAgICAgICBhdWRpb1BsYXllcjogb3B0aW9ucz8uYXVkaW9QbGF5ZXIsXG4gICAgICAgICAgICBncm91cDogb3B0aW9ucy5ncm91cCA/PyB0aGlzLnBsYXllci5jbGllbnQudXNlcj8uaWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5jb25uZWN0aW9uLCB0aGlzKTtcblxuICAgICAgICBpZiAodGhpcy5jaGFubmVsIS50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hhbm5lbCEuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0U3VwcHJlc3NlZChmYWxzZSkuY2F0Y2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNoYW5uZWwhLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldFJlcXVlc3RUb1NwZWFrKHRydWUpLmNhdGNoKFV0aWwubm9vcCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuI2F0dGFjaExpc3RlbmVycyh0aGlzLmRpc3BhdGNoZXIpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSBzaHVmZmxlIG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gZHluYW1pYyBXaGV0aGVyIHRvIHNodWZmbGUgdGhlIHF1ZXVlIGR5bmFtaWNhbGx5LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogRHluYW1pYyBzaHVmZmxpbmcgd2lsbCBzaHVmZmxlIHRoZSBxdWV1ZSB3aGVuIHRoZSBjdXJyZW50IHRyYWNrIGVuZHMsIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHF1ZXVlLlxuICAgICAqIElmIHNldCB0byBgZmFsc2VgLCB0aGUgcXVldWUgd2lsbCBiZSBzaHVmZmxlZCBpbW1lZGlhdGVseSBpbi1wbGFjZSwgd2hpY2ggY2Fubm90IGJlIHVuZG9uZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZW5hYmxlU2h1ZmZsZShkeW5hbWljID0gdHJ1ZSkge1xuICAgICAgICBpZiAoIWR5bmFtaWMpIHtcbiAgICAgICAgICAgIHRoaXMudHJhY2tzLnNodWZmbGUoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4jc2h1ZmZsZSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBkaXNhYmxlU2h1ZmZsZSgpIHtcbiAgICAgICAgdGhpcy4jc2h1ZmZsZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlLlxuICAgICAqIEBwYXJhbSBkeW5hbWljIFdoZXRoZXIgdG8gc2h1ZmZsZSB0aGUgcXVldWUgZHluYW1pY2FsbHkuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHNodWZmbGUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlU2h1ZmZsZShkeW5hbWljID0gdHJ1ZSkge1xuICAgICAgICBpZiAoZHluYW1pYykge1xuICAgICAgICAgICAgdGhpcy4jc2h1ZmZsZSA9ICF0aGlzLiNzaHVmZmxlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI3NodWZmbGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrcy5zaHVmZmxlKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgc2h1ZmZsZSBtb2RlIGlzIGVuYWJsZWQgZm9yIHRoaXMgcXVldWUuXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1NodWZmbGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3NodWZmbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gbGF0ZW5jeSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uPy5waW5nLnVkcCA/PyAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXllci5ub2Rlcy5kZWxldGUodGhpcy5pZCkpIHtcbiAgICAgICAgICAgIHRoaXMuI2RlbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnF1ZXVlRGVsZXRlLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMubm9kZS50YXNrc1F1ZXVlLmNhbmNlbEFsbCgpO1xuICAgICAgICAgICAgdGhpcy50YXNrc1F1ZXVlLmNhbmNlbEFsbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2aXZlcyB0aGlzIHF1ZXVlXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmV2aXZlKCkge1xuICAgICAgICBpZiAoIXRoaXMuZGVsZXRlZCB8fCB0aGlzLnBsYXllci5ub2Rlcy5oYXModGhpcy5pZCkpIHJldHVybjtcbiAgICAgICAgdGhpcy4jZGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgICAgICB0aGlzLnBsYXllci5ub2Rlcy5jYWNoZS5zZXQodGhpcy5pZCwgdGhpcyk7XG4gICAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5xdWV1ZUNyZWF0ZSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHNlbGYgZGVhZlxuICAgICAqIEBwYXJhbSBtb2RlIE9uL09mZiBzdGF0ZVxuICAgICAqIEBwYXJhbSByZWFzb24gUmVhc29uXG4gICAgICovXG4gICAgcHVibGljIHNldFNlbGZEZWFmKG1vZGU/OiBib29sZWFuLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0RGVhZihtb2RlLCByZWFzb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBzZWxmIG11dGVcbiAgICAgKiBAcGFyYW0gbW9kZSBPbi9PZmYgc3RhdGVcbiAgICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvblxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRTZWxmTXV0ZShtb2RlPzogYm9vbGVhbiwgcmVhc29uPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldE11dGUobW9kZSwgcmVhc29uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IGEgdHJhY2sgaW4gdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYmUgcGxheWVkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIG5vZGUgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5KHRyYWNrOiBUcmFja0xpa2UsIG9wdGlvbnM/OiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPE1ldGE+KSB7XG4gICAgICAgIGlmICghdGhpcy5jaGFubmVsKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19WT0lDRV9DT05ORUNUSU9OKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyLnBsYXkodGhpcy5jaGFubmVsLCB0cmFjaywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdCBhbiBldmVudCBvbiB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBlbWl0XG4gICAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3MgZm9yIHRoZSBldmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBHdWlsZFF1ZXVlRXZlbnRzPE1ldGE+PihldmVudDogSywgLi4uYXJnczogUGFyYW1ldGVyczxHdWlsZFF1ZXVlRXZlbnRzPE1ldGE+W0tdPik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5kZWxldGVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5ldmVudHMuZW1pdChldmVudCwgLi4uYXJncyk7XG4gICAgfVxuXG4gICAgI2F0dGFjaExpc3RlbmVycyhkaXNwYXRjaGVyOiBTdHJlYW1EaXNwYXRjaGVyKSB7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2Vycm9yJywgKGUpID0+IHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZXJyb3IsIHRoaXMsIGUpKTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignZGVidWcnLCAobSkgPT4gdGhpcy5oYXNEZWJ1Z2dlciAmJiB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmRlYnVnLCB0aGlzLCBtKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2ZpbmlzaCcsIChyKSA9PiB0aGlzLiNwZXJmb3JtRmluaXNoKHIpKTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignc3RhcnQnLCAocikgPT4gdGhpcy4jcGVyZm9ybVN0YXJ0KHIpKTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignZGVzdHJveWVkJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKGRpc3BhdGNoZXIpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2RzcCcsIChmKSA9PiB7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5pcyh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycywgZikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmRzcFVwZGF0ZSwgdGhpcywgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsIGYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMgPSBmO1xuICAgICAgICB9KTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignYmlxdWFkJywgKGYpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkICE9PSBmKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5iaXF1YWRGaWx0ZXJzVXBkYXRlLCB0aGlzLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkLCBmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgPSBmO1xuICAgICAgICB9KTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignZXFCYW5kcycsIChmKSA9PiB7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5pcyhmLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZXF1YWxpemVyVXBkYXRlLCB0aGlzLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyLCBmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIgPSBmO1xuICAgICAgICB9KTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbigndm9sdW1lJywgKGYpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lICE9PSBmKSB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnZvbHVtZUNoYW5nZSwgdGhpcywgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSwgZik7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lID0gZjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNEZWJ1Z2dlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyLmV2ZW50cy5oYXNEZWJ1Z2dlcjtcbiAgICB9XG5cbiAgICAjcmVtb3ZlTGlzdGVuZXJzPFQgZXh0ZW5kcyB7IHJlbW92ZUFsbExpc3RlbmVyczogKCkgPT4gdW5rbm93biB9Pih0YXJnZXQ6IFQpIHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIH1cblxuICAgICNwZXJmb3JtU3RhcnQocmVzb3VyY2U/OiBBdWRpb1Jlc291cmNlPFRyYWNrPikge1xuICAgICAgICBjb25zdCB0cmFjayA9IHJlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLmN1cnJlbnRUcmFjaztcbiAgICAgICAgY29uc3QgcmVhc29uID0gdGhpcy5pc1RyYW5zaXRpb25pbmcoKSA/ICdmaWx0ZXJzJyA6ICdub3JtYWwnO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgUGxheWVyIHRyaWdnZXJlZCBmb3IgVHJhY2sgJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0cmFjaz8udGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgICAgIH0pfWBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJUcmlnZ2VyLCB0aGlzLCB0cmFjayEsIHJlYXNvbik7XG4gICAgICAgIGlmICh0cmFjayAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcoKSkgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJTdGFydCwgdGhpcywgdHJhY2spO1xuICAgICAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgIH1cblxuICAgICNnZXROZXh0VHJhY2soKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1NodWZmbGluZykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdG9yZSA9IHRoaXMudHJhY2tzLnN0b3JlO1xuXG4gICAgICAgIGlmICghc3RvcmUubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgdHJhY2sgPSBVdGlsLnJhbmRvbUNob2ljZShzdG9yZSk7XG5cbiAgICAgICAgdGhpcy50cmFja3MucmVtb3ZlT25lKCh0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdC5pZCA9PT0gdHJhY2suaWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0cmFjaztcbiAgICB9XG5cbiAgICAjcGVyZm9ybUZpbmlzaChyZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gcmVzb3VyY2U/Lm1ldGFkYXRhIHx8IHRoaXMuY3VycmVudFRyYWNrO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgVHJhY2sgJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0cmFjaz8udGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIGlzVHJhbnNpdGlvbk1vZGU6IHRoaXMuaXNUcmFuc2l0aW9uaW5nKClcbiAgICAgICAgICAgICAgICB9KX0gd2FzIG1hcmtlZCBhcyBmaW5pc2hlZGBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRyYWNrICYmICF0aGlzLmlzVHJhbnNpdGlvbmluZygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnQWRkaW5nIHRyYWNrIHRvIGhpc3RvcnkgYW5kIGVtaXR0aW5nIGZpbmlzaCBldmVudCBzaW5jZSB0cmFuc2l0aW9uIG1vZGUgaXMgZGlzYWJsZWQuLi4nKTtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKHRyYWNrKTtcbiAgICAgICAgICAgIHRoaXMubm9kZS5yZXNldFByb2dyZXNzKCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllckZpbmlzaCwgdGhpcywgdHJhY2spO1xuICAgICAgICAgICAgaWYgKHRoaXMuI2RlbGV0ZWQpIHJldHVybiB0aGlzLiNlbWl0RW5kKCk7XG4gICAgICAgICAgICBpZiAodGhpcy50cmFja3Muc2l6ZSA8IDEgJiYgdGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuT0ZGKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ05vIG1vcmUgdHJhY2tzIGxlZnQgaW4gdGhlIHF1ZXVlIHRvIHBsYXkgYW5kIHJlcGVhdCBtb2RlIGlzIG9mZiwgaW5pdGlhdGluZyAjZW1pdEVuZCgpJyk7XG4gICAgICAgICAgICAgICAgdGhpcy4jZW1pdEVuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuVFJBQ0spIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ1JlcGVhdCBtb2RlIGlzIHNldCB0byB0cmFjaywgcmVwZWF0aW5nIGxhc3QgdHJhY2sgZnJvbSB0aGUgaGlzdG9yeS4uLicpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9fY3VycmVudCA9IHRoaXMuaGlzdG9yeS50cmFja3MuZGlzcGF0Y2goKSB8fCB0cmFjaztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50ISwgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5RVUVVRSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHF1ZXVlLCBtb3ZpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5IHRvIGN1cnJlbnQgcXVldWUuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFja3MuYWRkKHRoaXMuaGlzdG9yeS50cmFja3MuZGlzcGF0Y2goKSB8fCB0cmFjayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy50cmFja3Muc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuQVVUT1BMQVkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gYXV0b3BsYXksIGluaXRpYXRpbmcgYXV0b3BsYXkgaGFuZGxlci4uLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jaGFuZGxlQXV0b3BsYXkodHJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0luaXRpYWxpemluZyBuZXh0IHRyYWNrIG9mIHRoZSBxdWV1ZS4uLicpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9fY3VycmVudCA9IHRoaXMuI2dldE5leHRUcmFjaygpITtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLnBsYXkodGhpcy5fX2N1cnJlbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAjZW1pdEVuZCgpIHtcbiAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVtcHR5UXVldWUsIHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxlYXZlT25FbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRtOiBOb2RlSlMuVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUGxheWluZygpKSByZXR1cm4gY2xlYXJUaW1lb3V0KHRtKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24pLnVucmVmKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyAjaGFuZGxlQXV0b3BsYXkodHJhY2s6IFRyYWNrKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQXV0b3BsYXkgPj4gRmluZGluZyByZWxhdGVkIHRyYWNrcyBmb3IgVHJhY2sgJHt0cmFjay50aXRsZX0gKCR7dHJhY2sudXJsfSkgW2V4dDoke3RyYWNrLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ31dYCk7XG4gICAgICAgICAgICBjb25zdCB0cmFja3MgPVxuICAgICAgICAgICAgICAgIChhd2FpdCB0cmFjay5leHRyYWN0b3I/LmdldFJlbGF0ZWRUcmFja3ModHJhY2ssIHRoaXMuaGlzdG9yeSkpPy50cmFja3MgfHxcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGxheWVyLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBRdWVyeWluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGV4dC5nZXRSZWxhdGVkVHJhY2tzKHRyYWNrLCB0aGlzLmhpc3RvcnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXMudHJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gZmFpbGVkIHRvIHByb3ZpZGUgcmVzdWx0cy5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gc3VjY2Vzc2Z1bGx5IHJldHVybmVkIHJlc3VsdHMuYCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMudHJhY2tzO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk/LnJlc3VsdCB8fFxuICAgICAgICAgICAgICAgIFtdO1xuXG4gICAgICAgICAgICBsZXQgcmVzb2x2ZXI6ICh0cmFjazogVHJhY2sgfCBudWxsKSA9PiB2b2lkID0gVXRpbC5ub29wO1xuICAgICAgICAgICAgY29uc3QgZG9uZVByb21pc2UgPSBuZXcgUHJvbWlzZTxUcmFjayB8IG51bGw+KChyZXNvbHZlKSA9PiAocmVzb2x2ZXIgPSByZXNvbHZlKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LndpbGxBdXRvUGxheSwgdGhpcywgdHJhY2tzLCByZXNvbHZlciEpO1xuXG4gICAgICAgICAgICAvLyBwcmV2ZW50IGRhbmdsaW5nIHByb21pc2VcbiAgICAgICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHJlc29sdmVyKFxuICAgICAgICAgICAgICAgICAgICB0cmFja3MubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlxdWUgPSB0cmFja3MuZmlsdGVyKCh0cikgPT4gIXRoaXMuaGlzdG9yeS50cmFja3MuZmluZCgodCkgPT4gdC51cmwgPT09IHRyLnVybCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuaXF1ZT8uWzBdID8/IFV0aWwucmFuZG9tQ2hvaWNlKHRyYWNrcy5zbGljZSgwLCA1KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5leHRUcmFjayA9IGF3YWl0IGRvbmVQcm9taXNlO1xuXG4gICAgICAgICAgICBpZiAoIW5leHRUcmFjaykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdBdXRvcGxheSA+PiBObyB0cmFjayB3YXMgZm91bmQsIGluaXRpYXRpbmcgI2VtaXRFbmQoKScpO1xuICAgICAgICAgICAgICAgIHRocm93ICdObyB0cmFjayB3YXMgZm91bmQnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm5vZGUucGxheShuZXh0VHJhY2ssIHtcbiAgICAgICAgICAgICAgICBxdWV1ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2VlazogMCxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uTW9kZTogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNlbWl0RW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgICBBdWRpb1BsYXllcixcbiAgICBBdWRpb1BsYXllckVycm9yLFxuICAgIEF1ZGlvUGxheWVyU3RhdHVzLFxuICAgIEF1ZGlvUmVzb3VyY2UsXG4gICAgY3JlYXRlQXVkaW9QbGF5ZXIsXG4gICAgY3JlYXRlQXVkaW9SZXNvdXJjZSxcbiAgICBlbnRlcnNTdGF0ZSxcbiAgICBTdHJlYW1UeXBlLFxuICAgIFZvaWNlQ29ubmVjdGlvbixcbiAgICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMsXG4gICAgVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvblxufSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgU3RhZ2VDaGFubmVsLCBWb2ljZUNoYW5uZWwgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB0eXBlIHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IEVxdWFsaXplckJhbmQsIEJpcXVhZEZpbHRlcnMsIFBDTUZpbHRlcnMsIEZpbHRlcnNDaGFpbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50LCBQb3N0UHJvY2Vzc2VkUmVzdWx0IH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBWb2ljZVJlY2VpdmVyTm9kZSB9IGZyb20gJy4uL21hbmFnZXIvVm9pY2VSZWNlaXZlck5vZGUnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlU3RyZWFtT3BzIHtcbiAgICB0eXBlPzogU3RyZWFtVHlwZTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGRhdGE/OiBhbnk7XG4gICAgZGlzYWJsZVZvbHVtZT86IGJvb2xlYW47XG4gICAgZGlzYWJsZUVxdWFsaXplcj86IGJvb2xlYW47XG4gICAgZGlzYWJsZUJpcXVhZD86IGJvb2xlYW47XG4gICAgZXE/OiBFcXVhbGl6ZXJCYW5kW107XG4gICAgYmlxdWFkRmlsdGVyPzogQmlxdWFkRmlsdGVycztcbiAgICBkaXNhYmxlRmlsdGVycz86IGJvb2xlYW47XG4gICAgZGVmYXVsdEZpbHRlcnM/OiBQQ01GaWx0ZXJzW107XG4gICAgdm9sdW1lPzogbnVtYmVyO1xuICAgIGRpc2FibGVSZXNhbXBsZXI/OiBib29sZWFuO1xuICAgIHNhbXBsZVJhdGU/OiBudW1iZXI7XG4gICAgc2tpcEZGbXBlZz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VFdmVudHMge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbiAgICBlcnJvcjogKGVycm9yOiBBdWRpb1BsYXllckVycm9yKSA9PiBhbnk7XG4gICAgZGVidWc6IChtZXNzYWdlOiBzdHJpbmcpID0+IGFueTtcbiAgICBzdGFydDogKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPikgPT4gYW55O1xuICAgIGZpbmlzaDogKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPikgPT4gYW55O1xuICAgIGRzcDogKGZpbHRlcnM6IFBDTUZpbHRlcnNbXSkgPT4gYW55O1xuICAgIGVxQmFuZHM6IChmaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10pID0+IGFueTtcbiAgICBzYW1wbGVSYXRlOiAoZmlsdGVyczogbnVtYmVyKSA9PiBhbnk7XG4gICAgYmlxdWFkOiAoZmlsdGVyczogQmlxdWFkRmlsdGVycykgPT4gYW55O1xuICAgIHZvbHVtZTogKHZvbHVtZTogbnVtYmVyKSA9PiBhbnk7XG4gICAgZGVzdHJveWVkOiAoKSA9PiBhbnk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG59XG5cbmNsYXNzIFN0cmVhbURpc3BhdGNoZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXI8Vm9pY2VFdmVudHM+IHtcbiAgICBwdWJsaWMgdm9pY2VDb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb247XG4gICAgcHVibGljIGF1ZGlvUGxheWVyOiBBdWRpb1BsYXllcjtcbiAgICBwdWJsaWMgcmVjZWl2ZXIgPSBuZXcgVm9pY2VSZWNlaXZlck5vZGUodGhpcyk7XG4gICAgcHVibGljIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbDtcbiAgICBwdWJsaWMgYXVkaW9SZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+IHwgbnVsbDtcbiAgICBwdWJsaWMgZHNwID0gbmV3IEZpbHRlcnNDaGFpbigpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgY29ubmVjdGlvbiBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1ZvaWNlQ29ubmVjdGlvbn0gY29ubmVjdGlvbiBUaGUgY29ubmVjdGlvblxuICAgICAqIEBwYXJhbSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH0gY2hhbm5lbCBUaGUgY29ubmVjdGVkIGNoYW5uZWxcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbiwgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsLCBwdWJsaWMgcXVldWU6IEd1aWxkUXVldWUsIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uVGltZW91dDogbnVtYmVyID0gMjAwMDAsIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgICAgICogQHR5cGUge1ZvaWNlQ29ubmVjdGlvbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uID0gY29ubmVjdGlvbjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGF1ZGlvIHBsYXllclxuICAgICAgICAgKiBAdHlwZSB7QXVkaW9QbGF5ZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmF1ZGlvUGxheWVyID1cbiAgICAgICAgICAgIGF1ZGlvUGxheWVyIHx8XG4gICAgICAgICAgICBjcmVhdGVBdWRpb1BsYXllcih7XG4gICAgICAgICAgICAgICAgZGVidWc6IHRoaXMucXVldWUuaGFzRGVidWdnZXJcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdm9pY2UgY2hhbm5lbFxuICAgICAgICAgKiBAdHlwZSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7XG5cbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ub24oJ2RlYnVnJywgKG0pID0+IHZvaWQgdGhpcy5lbWl0KCdkZWJ1ZycsIG0pKTtcbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ub24oJ2Vycm9yJywgKGVycm9yKSA9PiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvciBhcyBBdWRpb1BsYXllckVycm9yKSk7XG4gICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ2RlYnVnJywgKG0pID0+IHZvaWQgdGhpcy5lbWl0KCdkZWJ1ZycsIG0pKTtcbiAgICAgICAgdGhpcy5hdWRpb1BsYXllci5vbignZXJyb3InLCAoZXJyb3IpID0+IHZvaWQgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKSk7XG5cbiAgICAgICAgdGhpcy5kc3Aub25VcGRhdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZHNwKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodGhpcy5kc3AuZmlsdGVycz8uZmlsdGVycykgdGhpcy5lbWl0KCdkc3AnLCB0aGlzLmRzcC5maWx0ZXJzPy5maWx0ZXJzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRzcC5iaXF1YWQ/LmZpbHRlcikgdGhpcy5lbWl0KCdiaXF1YWQnLCB0aGlzLmRzcC5iaXF1YWQ/LmZpbHRlcik7XG4gICAgICAgICAgICBpZiAodGhpcy5kc3AuZXF1YWxpemVyKSB0aGlzLmVtaXQoJ2VxQmFuZHMnLCB0aGlzLmRzcC5lcXVhbGl6ZXIuZ2V0RVEoKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5kc3Audm9sdW1lKSB0aGlzLmVtaXQoJ3ZvbHVtZScsIHRoaXMuZHNwLnZvbHVtZS52b2x1bWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHNwLnJlc2FtcGxlcikgdGhpcy5lbWl0KCdzYW1wbGVSYXRlJywgdGhpcy5kc3AucmVzYW1wbGVyLnRhcmdldFNhbXBsZVJhdGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZHNwLm9uRXJyb3IgPSAoZSkgPT4gdGhpcy5lbWl0KCdlcnJvcicsIGUgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG5cbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb25cbiAgICAgICAgICAgIC5vbihWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGlzY29ubmVjdGVkLCBhc3luYyAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlLnJlYXNvbiA9PT0gVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvbi5NYW51YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUucmVhc29uID09PSBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uLldlYlNvY2tldENsb3NlICYmIG5ld1N0YXRlLmNsb3NlQ29kZSA9PT0gNDAxNCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUodGhpcy52b2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nLCB0aGlzLmNvbm5lY3Rpb25UaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVyciBhcyBBdWRpb1BsYXllckVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luQXR0ZW1wdHMgPCA1KSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IFV0aWwud2FpdCgodGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luQXR0ZW1wdHMgKyAxKSAqIDUwMDApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZWpvaW4oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVyciBhcyBBdWRpb1BsYXllckVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5jb25uZWN0aW9uRGVzdHJveWVkLCB0aGlzLnF1ZXVlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ3N0YXRlQ2hhbmdlJywgKG9sZFN0YXRlLCBuZXdTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG9sZFN0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkICYmIG5ld1N0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJQYXVzZSwgdGhpcy5xdWV1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvbGRTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZCAmJiBuZXdTdGF0ZS5zdGF0dXMgIT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyUmVzdW1lLCB0aGlzLnF1ZXVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5ld1N0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGxheWluZykge1xuICAgICAgICAgICAgICAgIGlmIChvbGRTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGUgfHwgb2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5CdWZmZXJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnc3RhcnQnLCB0aGlzLmF1ZGlvUmVzb3VyY2UhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZSAmJiBvbGRTdGF0ZS5zdGF0dXMgIT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2ZpbmlzaCcsIHRoaXMuYXVkaW9SZXNvdXJjZSEpO1xuICAgICAgICAgICAgICAgIHRoaXMuZHNwLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvUmVzb3VyY2UgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdWJzY3JpYmUodGhpcy5hdWRpb1BsYXllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIHBsYXllciBoYXMgYmVlbiBwYXVzZWQgbWFudWFsbHlcbiAgICAgKi9cbiAgICBnZXQgcGF1c2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZDtcbiAgICB9XG5cbiAgICBzZXQgcGF1c2VkKHZhbDogYm9vbGVhbikge1xuICAgICAgICB2YWwgPyB0aGlzLnBhdXNlKHRydWUpIDogdGhpcy5yZXN1bWUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBwYXVzZWQgYXV0b21hdGljYWxseSBvciBtYW51YWxseS5cbiAgICAgKi9cbiAgICBpc1BhdXNlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGF1c2VkIHx8IHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5BdXRvUGF1c2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGJ1ZmZlcmluZ1xuICAgICAqL1xuICAgIGlzQnVmZmVyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLkJ1ZmZlcmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBwbGF5aW5nXG4gICAgICovXG4gICAgaXNQbGF5aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBsYXlpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgaWRsZVxuICAgICAqL1xuICAgIGlzSWRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGhhcyBiZWVuIGRlc3Ryb3llZFxuICAgICAqL1xuICAgIGlzRGVzdHJveWVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGhhcyBiZWVuIGRlc3Ryb3llZFxuICAgICAqL1xuICAgIGlzRGlzY29ubmVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGlzY29ubmVjdGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIHJlYWR5IHRvIHBsYXlcbiAgICAgKi9cbiAgICBpc1JlYWR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgc2lnbmFsbGluZ1xuICAgICAqL1xuICAgIGlzU2lnbmFsbGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLlNpZ25hbGxpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgY29ubmVjdGluZ1xuICAgICAqL1xuICAgIGlzQ29ubmVjdGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3Rpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBzdHJlYW1cbiAgICAgKiBAcGFyYW0ge1JlYWRhYmxlfSBzcmMgVGhlIHN0cmVhbSBzb3VyY2VcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wc10gT3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtBdWRpb1Jlc291cmNlfVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZVN0cmVhbShzcmM6IFJlYWRhYmxlLCBvcHM/OiBDcmVhdGVTdHJlYW1PcHMpIHtcbiAgICAgICAgaWYgKCFvcHM/LmRpc2FibGVGaWx0ZXJzICYmIHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0luaXRpYXRpbmcgRFNQIGZpbHRlcnMgcGlwZWxpbmUuLi4nKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gIW9wcz8uZGlzYWJsZUZpbHRlcnNcbiAgICAgICAgICAgID8gdGhpcy5kc3AuY3JlYXRlKHNyYywge1xuICAgICAgICAgICAgICAgICAgZHNwOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZmlsdGVyczogb3BzPy5kZWZhdWx0RmlsdGVycyxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlRmlsdGVyc1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGJpcXVhZDogb3BzPy5iaXF1YWRGaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IG9wcy5iaXF1YWRGaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUJpcXVhZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgcmVzYW1wbGVyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U2FtcGxlUmF0ZTogb3BzPy5zYW1wbGVSYXRlLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVSZXNhbXBsZXJcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBlcXVhbGl6ZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICBiYW5kTXVsdGlwbGllcjogb3BzPy5lcSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlRXF1YWxpemVyXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgdm9sdW1lOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdm9sdW1lOiBvcHM/LnZvbHVtZSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlVm9sdW1lXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IHNyYztcblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnRXhlY3V0aW5nIG9uQWZ0ZXJDcmVhdGVTdHJlYW0gaG9vay4uLicpO1xuICAgICAgICBjb25zdCBwb3N0U3RyZWFtID0gYXdhaXQgdGhpcy5xdWV1ZS5vbkFmdGVyQ3JlYXRlU3RyZWFtPy4oc3RyZWFtLCB0aGlzLnF1ZXVlKS5jYXRjaChcbiAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtOiBzdHJlYW0sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IG9wcz8udHlwZSA/PyBTdHJlYW1UeXBlLkFyYml0cmFyeVxuICAgICAgICAgICAgICAgIH0gYXMgUG9zdFByb2Nlc3NlZFJlc3VsdClcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnUHJlcGFyaW5nIEF1ZGlvUmVzb3VyY2UuLi4nKTtcbiAgICAgICAgdGhpcy5hdWRpb1Jlc291cmNlID0gY3JlYXRlQXVkaW9SZXNvdXJjZShwb3N0U3RyZWFtPy5zdHJlYW0gPz8gc3RyZWFtLCB7XG4gICAgICAgICAgICBpbnB1dFR5cGU6IHBvc3RTdHJlYW0/LnR5cGUgPz8gb3BzPy50eXBlID8/IFN0cmVhbVR5cGUuQXJiaXRyYXJ5LFxuICAgICAgICAgICAgbWV0YWRhdGE6IG9wcz8uZGF0YSxcbiAgICAgICAgICAgIC8vIHZvbHVtZSBjb250cm9scyBoYXBwZW4gZnJvbSBBdWRpb0ZpbHRlciBEU1AgdXRpbGl0eVxuICAgICAgICAgICAgaW5saW5lVm9sdW1lOiBmYWxzZVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hdWRpb1Jlc291cmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kc3A/LnJlc2FtcGxlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcD8uZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGJpcXVhZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwPy5iaXF1YWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwPy5lcXVhbGl6ZXIgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWVyIHN0YXR1c1xuICAgICAqIEB0eXBlIHtBdWRpb1BsYXllclN0YXR1c31cbiAgICAgKi9cbiAgICBnZXQgc3RhdHVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzY29ubmVjdHMgZnJvbSB2b2ljZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hdWRpb1BsYXllcikgdGhpcy5hdWRpb1BsYXllci5zdG9wKHRydWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkgdGhpcy52b2ljZUNvbm5lY3Rpb24uZGVzdHJveSgpO1xuICAgICAgICB9IGNhdGNoIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95cyB0aGlzIGRpc3BhdGNoZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZW1pdCgnZGVzdHJveWVkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcHMgdGhlIHBsYXllclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGVuZCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIuc3RvcCgpO1xuICAgICAgICAgICAgdGhpcy5kc3AuZGVzdHJveSgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXVzZXMgdGhlIHN0cmVhbSBwbGF5YmFja1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ludGVycG9sYXRlU2lsZW5jZT1mYWxzZV0gSWYgdHJ1ZSwgdGhlIHBsYXllciB3aWxsIHBsYXkgNSBwYWNrZXRzIG9mIHNpbGVuY2UgYWZ0ZXIgcGF1c2luZyB0byBwcmV2ZW50IGF1ZGlvIGdsaXRjaGVzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIHBhdXNlKGludGVycG9sYXRlU2lsZW5jZT86IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuYXVkaW9QbGF5ZXIucGF1c2UoaW50ZXJwb2xhdGVTaWxlbmNlKTtcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdW1lcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgcmVzdW1lKCkge1xuICAgICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5hdWRpb1BsYXllci51bnBhdXNlKCk7XG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgc3RyZWFtXG4gICAgICogQHBhcmFtIHtBdWRpb1Jlc291cmNlPFRyYWNrPn0gW3Jlc291cmNlPXRoaXMuYXVkaW9SZXNvdXJjZV0gVGhlIGF1ZGlvIHJlc291cmNlIHRvIHBsYXlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHVzPWZhbHNlXSBXaGV0aGVyIG9yIG5vdCB0byB1c2Ugb3B1c1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+fVxuICAgICAqL1xuICAgIGFzeW5jIHBsYXlTdHJlYW0ocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+ID0gdGhpcy5hdWRpb1Jlc291cmNlISkge1xuICAgICAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19BVURJT19SRVNPVVJDRSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvdXJjZS5lbmRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5lbWl0KCdmaW5pc2gnLCByZXNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmF1ZGlvUmVzb3VyY2UpIHRoaXMuYXVkaW9SZXNvdXJjZSA9IHJlc291cmNlO1xuICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUodGhpcy52b2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeSwgdGhpcy5jb25uZWN0aW9uVGltZW91dCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIucGxheShyZXNvdXJjZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBwbGF5YmFjayB2b2x1bWVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIHZvbHVtZSBhbW91bnRcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzZXRWb2x1bWUodmFsdWU6IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMuZHNwLnZvbHVtZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5kc3Audm9sdW1lLnNldFZvbHVtZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdm9sdW1lXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgdm9sdW1lKCkge1xuICAgICAgICBpZiAoIXRoaXMuZHNwLnZvbHVtZSkgcmV0dXJuIDEwMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwLnZvbHVtZS52b2x1bWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXliYWNrIHRpbWVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBzdHJlYW1UaW1lKCkge1xuICAgICAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgcmV0dXJuIDA7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUmVzb3VyY2UucGxheWJhY2tEdXJhdGlvbjtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgYXMgU3RyZWFtRGlzcGF0Y2hlciB9O1xuIiwgImltcG9ydCB7IFVzZXJSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQYXNzVGhyb3VnaCwgdHlwZSBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBFbmRCZWhhdmlvclR5cGUgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0ICogYXMgcHJpc20gZnJvbSAncHJpc20tbWVkaWEnO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4uL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXInO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgUmF3VHJhY2tEYXRhIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VSZWNlaXZlck9wdGlvbnMge1xuICAgIG1vZGU/OiAnb3B1cycgfCAncGNtJztcbiAgICBlbmQ/OiBFbmRCZWhhdmlvclR5cGU7XG4gICAgc2lsZW5jZUR1cmF0aW9uPzogbnVtYmVyO1xuICAgIGNyYz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFJhd1RyYWNrSW5pdCA9IFBhcnRpYWw8T21pdDxSYXdUcmFja0RhdGEsICdhdXRob3InIHwgJ3BsYXlsaXN0JyB8ICdzb3VyY2UnIHwgJ2VuZ2luZScgfCAncmF3JyB8ICdxdWVyeVR5cGUnIHwgJ2Rlc2NyaXB0aW9uJyB8ICd2aWV3cyc+PjtcblxuZXhwb3J0IGNsYXNzIFZvaWNlUmVjZWl2ZXJOb2RlIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIpIHt9XG5cbiAgICBwdWJsaWMgY3JlYXRlUmF3VHJhY2soc3RyZWFtOiBSZWFkYWJsZSwgZGF0YTogUmF3VHJhY2tJbml0ID0ge30pIHtcbiAgICAgICAgZGF0YS50aXRsZSA/Pz0gYFJlY29yZGluZyAke0RhdGUubm93KCl9YDtcblxuICAgICAgICByZXR1cm4gbmV3IFRyYWNrKHRoaXMuZGlzcGF0Y2hlci5xdWV1ZS5wbGF5ZXIsIHtcbiAgICAgICAgICAgIGF1dGhvcjogJ0Rpc2NvcmQnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGRhdGEudGl0bGUsXG4gICAgICAgICAgICB0aXRsZTogZGF0YS50aXRsZSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiBkYXRhLmR1cmF0aW9uIHx8ICcwOjAwJyxcbiAgICAgICAgICAgIHZpZXdzOiAwLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IGRhdGEucmVxdWVzdGVkQnksXG4gICAgICAgICAgICB0aHVtYm5haWw6IGRhdGEudGh1bWJuYWlsIHx8ICdodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9lbWJlZC9hdmF0YXJzLzAucG5nJyxcbiAgICAgICAgICAgIHVybDogZGF0YS51cmwgfHwgJ2h0dHBzOi8vZGlzY29yZC5jb20nLFxuICAgICAgICAgICAgc291cmNlOiAnYXJiaXRyYXJ5JyxcbiAgICAgICAgICAgIHJhdzoge1xuICAgICAgICAgICAgICAgIGVuZ2luZTogc3RyZWFtLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ2FyYml0cmFyeSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWVyZ2UgbXVsdGlwbGUgc3RyZWFtcyB0b2dldGhlclxuICAgICAqIEBwYXJhbSBzdHJlYW1zIFRoZSBhcnJheSBvZiBzdHJlYW1zIHRvIG1lcmdlXG4gICAgICovXG4gICAgcHVibGljIG1lcmdlUmVjb3JkaW5ncyhzdHJlYW1zOiBSZWFkYWJsZVtdKSB7XG4gICAgICAgIC8vIFRPRE9cbiAgICAgICAgdm9pZCBzdHJlYW1zO1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT1RfSU1QTEVNRU5URUQoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5tZXJnZVJlY29yZGluZ3MoKWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY29yZCBhIHVzZXIgaW4gdm9pY2UgY2hhbm5lbFxuICAgICAqIEBwYXJhbSB1c2VyIFRoZSB1c2VyIHRvIHJlY29yZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFJlY29yZGluZyBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIHJlY29yZFVzZXIoXG4gICAgICAgIHVzZXI6IFVzZXJSZXNvbHZhYmxlLFxuICAgICAgICBvcHRpb25zOiBWb2ljZVJlY2VpdmVyT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGVuZDogRW5kQmVoYXZpb3JUeXBlLkFmdGVyU2lsZW5jZSxcbiAgICAgICAgICAgIG1vZGU6ICdwY20nLFxuICAgICAgICAgICAgc2lsZW5jZUR1cmF0aW9uOiAxMDAwXG4gICAgICAgIH1cbiAgICApIHtcbiAgICAgICAgY29uc3QgX3VzZXIgPSB0aGlzLmRpc3BhdGNoZXIucXVldWUucGxheWVyLmNsaWVudC51c2Vycy5yZXNvbHZlSWQodXNlcik7XG5cbiAgICAgICAgY29uc3QgcGFzc1Rocm91Z2ggPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICAgICAgY29uc3QgcmVjZWl2ZXIgPSB0aGlzLmRpc3BhdGNoZXIudm9pY2VDb25uZWN0aW9uLnJlY2VpdmVyO1xuXG4gICAgICAgIGlmICghcmVjZWl2ZXIpIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFQ0VJVkVSKCk7XG5cbiAgICAgICAgcmVjZWl2ZXIuc3BlYWtpbmcub24oJ3N0YXJ0JywgKHVzZXJJZCkgPT4ge1xuICAgICAgICAgICAgaWYgKHVzZXJJZCA9PT0gX3VzZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWNlaXZlU3RyZWFtID0gcmVjZWl2ZXIuc3Vic2NyaWJlKF91c2VyLCB7XG4gICAgICAgICAgICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IG9wdGlvbnMuZW5kIHx8IEVuZEJlaGF2aW9yVHlwZS5BZnRlclNpbGVuY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogb3B0aW9ucy5zaWxlbmNlRHVyYXRpb24gPz8gMTAwMFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5tb2RlID09PSAncGNtJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGNtID0gcmVjZWl2ZVN0cmVhbS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IChwcmlzbS5vcHVzIHx8ICg8YW55PnByaXNtKS5kZWZhdWx0Lm9wdXMpLkRlY29kZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsczogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplOiA5NjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGU6IDQ4MDAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGNtLnBpcGUocGFzc1Rocm91Z2gpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVTdHJlYW0ucGlwZShwYXNzVGhyb3VnaCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KS51bnJlZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcGFzc1Rocm91Z2ggYXMgUmVhZGFibGU7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFF1ZXVlIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgVHJhY2tTa2lwUmVhc29uIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVIaXN0b3J5PE1ldGEgPSB1bmtub3duPiB7XG4gICAgcHVibGljIHRyYWNrcyA9IG5ldyBRdWV1ZTxUcmFjaz4oJ0xJRk8nKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogQ3VycmVudCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8ubWV0YWRhdGEgfHwgKCh0aGlzLnF1ZXVlIGFzIGFueSkuX19jdXJyZW50IGFzIFRyYWNrIHwgbnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG5leHRUcmFjaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUudHJhY2tzLmF0KDApIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBwcmV2aW91c1RyYWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3MuYXQoMCkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBoaXN0b3J5IGlzIGRpc2FibGVkXG4gICAgICovXG4gICAgcHVibGljIGdldCBkaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlSGlzdG9yeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgaGlzdG9yeSBpcyBlbXB0eVxuICAgICAqL1xuICAgIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA8IDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIHRyYWNrIHRvIHRyYWNrIGhpc3RvcnlcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGFkZFxuICAgICAqL1xuICAgIHB1YmxpYyBwdXNoKHRyYWNrOiBUcmFjayB8IFRyYWNrW10pIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy50cmFja3MuYWRkKHRyYWNrKTtcblxuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIGhpc3RvcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGUgbmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgbmV4dCgpIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSB0aGlzLm5leHRUcmFjaztcbiAgICAgICAgaWYgKCF0cmFjaykge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdObyBuZXh0IHRyYWNrIGluIHRoZSBxdWV1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5ub2RlLnNraXAoe1xuICAgICAgICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uSGlzdG9yeU5leHQsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1NraXBwZWQgYnkgR3VpbGRRdWV1ZUhpc3RvcnkubmV4dCgpJ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IHRoZSBwcmV2aW91cyB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcHJldmlvdXMocHJlc2VydmVDdXJyZW50ID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCB0cmFjayA9IHRoaXMudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgICAgIGlmICghdHJhY2spIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnTm8gcHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50VHJhY2s7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5ub2RlLnBsYXkodHJhY2ssIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICBpZiAoY3VycmVudCAmJiBwcmVzZXJ2ZUN1cnJlbnQpIHRoaXMucXVldWUubm9kZS5pbnNlcnQoY3VycmVudCwgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgdG8gW0d1aWxkUXVldWVIaXN0b3J5XS5wcmV2aW91cygpXG4gICAgICovXG4gICAgcHVibGljIGJhY2socHJlc2VydmVDdXJyZW50ID0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmV2aW91cyhwcmVzZXJ2ZUN1cnJlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2l6ZSBoaXN0b3J5IHN0b3JlXG4gICAgICovXG4gICAgcHVibGljIHJlc2l6ZSgpIHtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodGhpcy5xdWV1ZS5tYXhIaXN0b3J5U2l6ZSkpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMudHJhY2tzLnN0b3JlLmxlbmd0aCA8IHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpIHJldHVybjtcbiAgICAgICAgdGhpcy50cmFja3Muc3RvcmUuc3BsaWNlKHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBBdWRpb1Jlc291cmNlLCBTdHJlYW1UeXBlIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFBsYXllclByb2dyZXNzYmFyT3B0aW9ucywgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgUXVlcnlSZXNvbHZlciB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuaW1wb3J0IHsgVXRpbCwgVkFMSURBVEVfUVVFVUVfQ0FQIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBUcmFjaywgVHJhY2tSZXNvbHZhYmxlIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCwgVHJhY2tTa2lwUmVhc29uIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IHNldFRpbWVvdXQgYXMgd2FpdEZvciB9IGZyb20gJ3RpbWVycy9wcm9taXNlcyc7XG5pbXBvcnQgeyBBc3luY1F1ZXVlIH0gZnJvbSAnLi4vdXRpbHMvQXN5bmNRdWV1ZSc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgQ3JlYXRlU3RyZWFtT3BzIH0gZnJvbSAnLi4vVm9pY2VJbnRlcmZhY2UvU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBFeHRyYWN0b3JTdHJlYW1hYmxlIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCAqIGFzIHByaXNtIGZyb20gJ3ByaXNtLW1lZGlhJztcbmltcG9ydCB7IE9wdXNEZWNvZGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL29wdXMnO1xuXG5leHBvcnQgY29uc3QgRkZNUEVHX1NSQVRFX1JFR0VYID0gL2FzZXRyYXRlPVxcZCtcXCooXFxkKFxcLlxcZCk/KS87XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VQbGF5T3B0aW9ucyB7XG4gICAgcXVldWU/OiBib29sZWFuO1xuICAgIHNlZWs/OiBudW1iZXI7XG4gICAgdHJhbnNpdGlvbk1vZGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNraXBPcHRpb25zIHtcbiAgICByZWFzb246IFRyYWNrU2tpcFJlYXNvbjtcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclRpbWVzdGFtcCB7XG4gICAgY3VycmVudDoge1xuICAgICAgICBsYWJlbDogc3RyaW5nO1xuICAgICAgICB2YWx1ZTogbnVtYmVyO1xuICAgIH07XG4gICAgdG90YWw6IHtcbiAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgdmFsdWU6IG51bWJlcjtcbiAgICB9O1xuICAgIHByb2dyZXNzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtQ29uZmlnIHtcbiAgICBkaXNwYXRjaGVyQ29uZmlnOiBDcmVhdGVTdHJlYW1PcHM7XG4gICAgcGxheWVyQ29uZmlnOiBSZXNvdXJjZVBsYXlPcHRpb25zO1xufVxuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YSA9IHVua25vd24+IHtcbiAgICAjcHJvZ3Jlc3MgPSAwO1xuICAgICNoYXNGRm1wZWdPcHRpbWl6YXRpb24gPSBmYWxzZTtcbiAgICBwdWJsaWMgdGFza3NRdWV1ZSA9IG5ldyBBc3luY1F1ZXVlKCk7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge1xuICAgICAgICB0aGlzLiNoYXNGRm1wZWdPcHRpbWl6YXRpb24gPSAvbGlib3B1czogKHllc3x0cnVlKS8udGVzdCh0aGlzLnF1ZXVlLnBsYXllci5zY2FuRGVwcygpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpbiBpZGxlIG1vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNJZGxlKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzSWRsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGJ1ZmZlcmluZyB0aGUgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNCdWZmZXJpbmcoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNCdWZmZXJpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBwbGF5aW5nIGEgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNQbGF5aW5nKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzUGxheWluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1BhdXNlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc1BhdXNlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0IHByb2dyZXNzIGhpc3RvcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXRQcm9ncmVzcygpIHtcbiAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBwbGF5ZXIgcHJvZ3Jlc3NcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0UHJvZ3Jlc3MocHJvZ3Jlc3M6IG51bWJlcikge1xuICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IHByb2dyZXNzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlYW0gdGltZSBmb3IgY3VycmVudCBzZXNzaW9uXG4gICAgICovXG4gICAgcHVibGljIGdldCBzdHJlYW1UaW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5zdHJlYW1UaW1lID8/IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3VycmVudCBwbGF5YmFjayBkdXJhdGlvbiB3aXRoIGhpc3RvcnkgaW5jbHVkZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBsYXliYWNrVGltZSgpIHtcbiAgICAgICAgY29uc3QgZHVyID0gdGhpcy4jcHJvZ3Jlc3MgKyB0aGlzLnN0cmVhbVRpbWU7XG5cbiAgICAgICAgcmV0dXJuIGR1cjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZHVyYXRpb24gbXVsdGlwbGllclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREdXJhdGlvbk11bHRpcGxpZXIoKSB7XG4gICAgICAgIGNvbnN0IHNyYXRlRmlsdGVycyA9IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcudG9BcnJheSgpLmZpbHRlcigoZmYpID0+IEZGTVBFR19TUkFURV9SRUdFWC50ZXN0KGZmKSk7XG4gICAgICAgIGNvbnN0IG11bHRpcGxpZXJzID0gc3JhdGVGaWx0ZXJzXG4gICAgICAgICAgICAubWFwKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoRkZNUEVHX1NSQVRFX1JFR0VYLmV4ZWMobSk/LlsxXSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5maWx0ZXIoKGYpID0+ICFpc05hTihmKSk7XG5cbiAgICAgICAgcmV0dXJuICFtdWx0aXBsaWVycy5sZW5ndGggPyAxIDogbXVsdGlwbGllcnMucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gY3VycmVudCArIGFjY3VtdWxhdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc3RpbWF0ZWQgcHJvZ3Jlc3Mgb2YgdGhlIHBsYXllclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXN0aW1hdGVkUGxheWJhY2tUaW1lKCkge1xuICAgICAgICBjb25zdCBkdXIgPSB0aGlzLnBsYXliYWNrVGltZTtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy5nZXREdXJhdGlvbk11bHRpcGxpZXIoKSAqIGR1cik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0aW1hdGVkIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBwbGF5ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgICAgICBjb25zdCBkdXIgPSB0aGlzLnRvdGFsRHVyYXRpb247XG5cbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoZHVyIC8gdGhpcy5nZXREdXJhdGlvbk11bHRpcGxpZXIoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG90YWwgZHVyYXRpb24gb2YgdGhlIGN1cnJlbnQgYXVkaW8gdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRvdGFsRHVyYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IHByZWZlcnNCcmlkZ2VkTWV0YWRhdGEgPSB0aGlzLnF1ZXVlLm9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhO1xuICAgICAgICBjb25zdCB0cmFjayA9IHRoaXMucXVldWUuY3VycmVudFRyYWNrO1xuXG4gICAgICAgIGlmIChwcmVmZXJzQnJpZGdlZE1ldGFkYXRhICYmIHRyYWNrPy5tZXRhZGF0YSAhPSBudWxsICYmIHR5cGVvZiB0cmFjay5tZXRhZGF0YSA9PT0gJ29iamVjdCcgJiYgJ2JyaWRnZScgaW4gdHJhY2subWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gKFxuICAgICAgICAgICAgICAgIHRyYWNrIGFzIFRyYWNrPHtcbiAgICAgICAgICAgICAgICAgICAgYnJpZGdlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0+XG4gICAgICAgICAgICApLm1ldGFkYXRhPy5icmlkZ2UuZHVyYXRpb247XG5cbiAgICAgICAgICAgIGlmIChUeXBlVXRpbC5pc051bWJlcihkdXJhdGlvbikpIHJldHVybiBkdXJhdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cmFjaz8uZHVyYXRpb25NUyA/PyAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzdHJlYW0gcHJvZ3Jlc3NcbiAgICAgKiBAcGFyYW0gaWdub3JlRmlsdGVycyBJZ25vcmUgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyA9IGZhbHNlKTogUGxheWVyVGltZXN0YW1wIHwgbnVsbCB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBpZ25vcmVGaWx0ZXJzID8gdGhpcy5wbGF5YmFja1RpbWUgOiB0aGlzLmVzdGltYXRlZFBsYXliYWNrVGltZTtcbiAgICAgICAgY29uc3QgdG90YWwgPSBpZ25vcmVGaWx0ZXJzID8gdGhpcy50b3RhbER1cmF0aW9uIDogdGhpcy5lc3RpbWF0ZWREdXJhdGlvbjtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3VycmVudDoge1xuICAgICAgICAgICAgICAgIGxhYmVsOiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKGN1cnJlbnQpKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogY3VycmVudFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRvdGFsOiB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVModG90YWwpKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdG90YWxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm9ncmVzczogTWF0aC5yb3VuZCgoY3VycmVudCAvIHRvdGFsKSAqIDEwMClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciBjdXJyZW50IHByb2dyZXNzXG4gICAgICogQHBhcmFtIG9wdGlvbnMgUHJvZ3Jlc3MgYmFyIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlUHJvZ3Jlc3NCYXIob3B0aW9ucz86IFBsYXllclByb2dyZXNzYmFyT3B0aW9ucykge1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSB0aGlzLmdldFRpbWVzdGFtcCgpO1xuICAgICAgICBpZiAoIXRpbWVzdGFtcCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHsgaW5kaWNhdG9yID0gJ1xcdXsxRjUxOH0nLCBsZWZ0Q2hhciA9ICdcXHUyNUFDJywgcmlnaHRDaGFyID0gJ1xcdTI1QUMnLCBsZW5ndGggPSAxNSwgdGltZWNvZGVzID0gdHJ1ZSwgc2VwYXJhdG9yID0gJ1xcdTI1MDMnIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBpZiAoaXNOYU4obGVuZ3RoKSB8fCBsZW5ndGggPCAwIHx8ICFOdW1iZXIuaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfT1VUX09GX1JBTkdFKCdbUGxheWVyUHJvZ3Jlc3NCYXJPcHRpb25zLmxlbmd0aF0nLCBTdHJpbmcobGVuZ3RoKSwgJzAnLCAnRmluaXRlIE51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZGV4ID0gTWF0aC5yb3VuZCgodGltZXN0YW1wLmN1cnJlbnQudmFsdWUgLyB0aW1lc3RhbXAudG90YWwudmFsdWUpICogbGVuZ3RoKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDEgJiYgaW5kZXggPD0gbGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBiYXIgPSBsZWZ0Q2hhci5yZXBlYXQoaW5kZXggLSAxKS5zcGxpdCgnJyk7XG4gICAgICAgICAgICBiYXIucHVzaChpbmRpY2F0b3IpO1xuICAgICAgICAgICAgYmFyLnB1c2gocmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSBpbmRleCkpO1xuICAgICAgICAgICAgaWYgKHRpbWVjb2Rlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aW1lc3RhbXAuY3VycmVudC5sYWJlbH0gJHtzZXBhcmF0b3J9ICR7YmFyLmpvaW4oJycpfSAke3NlcGFyYXRvcn0gJHt0aW1lc3RhbXAudG90YWwubGFiZWx9YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke2Jhci5qb2luKCcnKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRpbWVjb2Rlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aW1lc3RhbXAuY3VycmVudC5sYWJlbH0gJHtzZXBhcmF0b3J9ICR7aW5kaWNhdG9yfSR7cmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSAxKX0gJHtzZXBhcmF0b3J9ICR7dGltZXN0YW1wLnRvdGFsLmxhYmVsfWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHtpbmRpY2F0b3J9JHtyaWdodENoYXIucmVwZWF0KGxlbmd0aCAtIDEpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWVrIHRoZSBwbGF5ZXJcbiAgICAgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIHRvIHNlZWsgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VlayhkdXJhdGlvbjogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGR1cmF0aW9uID09PSB0aGlzLmVzdGltYXRlZFBsYXliYWNrVGltZSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChkdXJhdGlvbiA+IHRoaXMudG90YWxEdXJhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCh7XG4gICAgICAgICAgICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uU0VFS19PVkVSX1RIUkVTSE9MRCxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogRXhjZXB0aW9ucy5FUlJfT1VUX09GX1JBTkdFKCdbZHVyYXRpb25dJywgU3RyaW5nKGR1cmF0aW9uKSwgJzAnLCBTdHJpbmcodGhpcy50b3RhbER1cmF0aW9uKSkubWVzc2FnZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGR1cmF0aW9uIDwgMCkgZHVyYXRpb24gPSAwO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5xdWV1ZS5maWx0ZXJzLnRyaWdnZXJSZXBsYXkoZHVyYXRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgdm9sdW1lXG4gICAgICovXG4gICAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnZvbHVtZSA/PyAxMDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHZvbHVtZVxuICAgICAqIEBwYXJhbSB2b2wgVm9sdW1lIGFtb3VudCB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Vm9sdW1lKHZvbDogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlcyA9IHRoaXMucXVldWUuZGlzcGF0Y2hlci5zZXRWb2x1bWUodm9sKTtcbiAgICAgICAgaWYgKHJlcykgdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHZvbDtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgYml0IHJhdGVcbiAgICAgKiBAcGFyYW0gcmF0ZSBUaGUgYml0IHJhdGUgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldEJpdHJhdGUocmF0ZTogbnVtYmVyIHwgJ2F1dG8nKSB7XG4gICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8uZW5jb2Rlcj8uc2V0Qml0cmF0ZShyYXRlID09PSAnYXV0bycgPyB0aGlzLnF1ZXVlLmNoYW5uZWw/LmJpdHJhdGUgPz8gNjQwMDAgOiByYXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcGF1c2VkIHN0YXRlXG4gICAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRQYXVzZWQoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHN0YXRlKSByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5wYXVzZSh0cnVlKSB8fCBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucmVzdW1lKCkgfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGF1c2UgdGhlIHBsYXliYWNrXG4gICAgICovXG4gICAgcHVibGljIHBhdXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRQYXVzZWQodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdW1lIHRoZSBwbGF5YmFja1xuICAgICAqL1xuICAgIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldFBhdXNlZChmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2tpcCBjdXJyZW50IHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHNraXAob3B0aW9ucz86IFNraXBPcHRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2s7XG4gICAgICAgIGlmICghdHJhY2spIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmVuZCgpO1xuICAgICAgICBjb25zdCB7IHJlYXNvbiwgZGVzY3JpcHRpb24gfSA9IG9wdGlvbnMgfHwge1xuICAgICAgICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uTWFudWFsLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgdHJhY2sgd2FzIHNraXBwZWQgbWFudWFsbHknXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyU2tpcCwgdGhpcy5xdWV1ZSwgdHJhY2ssIHJlYXNvbiwgZGVzY3JpcHRpb24pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIHRyYWNrIGZyb20gcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlbW92ZVxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmUodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCBmb3VuZFRyYWNrID0gdGhpcy5xdWV1ZS50cmFja3MuZmluZCgodCwgaWR4KSA9PiB7XG4gICAgICAgICAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjayB8fCB0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnID8gdHJhY2sgOiB0cmFjay5pZCkgPT09IHQuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykgcmV0dXJuIHRyYWNrID09PSB0LmlkO1xuICAgICAgICAgICAgcmV0dXJuIGlkeCA9PT0gdHJhY2s7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWZvdW5kVHJhY2spIHJldHVybiBudWxsO1xuXG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnJlbW92ZU9uZSgodCkgPT4gdC5pZCA9PT0gZm91bmRUcmFjay5pZCk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb1RyYWNrUmVtb3ZlLCB0aGlzLnF1ZXVlLCBmb3VuZFRyYWNrKTtcblxuICAgICAgICByZXR1cm4gZm91bmRUcmFjaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKdW1wIHRvIHNwZWNpZmljIHRyYWNrIG9uIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8ganVtcCB0byB3aXRob3V0IHJlbW92aW5nIG90aGVyIHRyYWNrc1xuICAgICAqL1xuICAgIHB1YmxpYyBqdW1wKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKHRyYWNrKTtcbiAgICAgICAgaWYgKCFyZW1vdmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnVuc2hpZnQocmVtb3ZlZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uSnVtcCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHRyYWNrIHdhcyBqdW1wZWQgdG8gbWFudWFsbHknXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0cmFjayBwb3NpdGlvblxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VHJhY2tQb3NpdGlvbih0cmFjazogVHJhY2tSZXNvbHZhYmxlKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUudHJhY2tzLnRvQXJyYXkoKS5maW5kSW5kZXgoKHQsIGlkeCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRyYWNrIGluc3RhbmNlb2YgVHJhY2sgfHwgdHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJyA/IHRyYWNrIDogdHJhY2suaWQpID09PSB0LmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHJldHVybiB0cmFjayA9PT0gdC5pZDtcbiAgICAgICAgICAgIHJldHVybiBpZHggPT09IHRyYWNrO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTa2lwIHRvIHRoZSBnaXZlbiB0cmFjaywgcmVtb3Zpbmcgb3RoZXJzIG9uIHRoZSB3YXlcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHNraXAgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgc2tpcFRvKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKHRyYWNrKTtcbiAgICAgICAgaWYgKGlkeCA8IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKGlkeCk7XG4gICAgICAgIGlmICghcmVtb3ZlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCB0b1JlbW92ZSA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlLmZpbHRlcigoXywgaSkgPT4gaSA8PSBpZHgpO1xuICAgICAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS5zcGxpY2UoMCwgaWR4LCByZW1vdmVkKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb1RyYWNrc1JlbW92ZSwgdGhpcy5xdWV1ZSwgdG9SZW1vdmUpO1xuICAgICAgICByZXR1cm4gdGhpcy5za2lwKHtcbiAgICAgICAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLlNraXBUbyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHBsYXllciB3YXMgc2tpcHBlZCB0byBhbm90aGVyIHRyYWNrIG1hbnVhbGx5J1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnQgYSB0cmFjayBvbiB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGluc2VydFxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRvLCBkZWZhdWx0cyB0byAwLlxuICAgICAqL1xuICAgIHB1YmxpYyBpbnNlcnQodHJhY2s6IFRyYWNrLCBpbmRleCA9IDApIHtcbiAgICAgICAgaWYgKCEodHJhY2sgaW5zdGFuY2VvZiBUcmFjaykpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3RyYWNrIHZhbHVlJywgJ2luc3RhbmNlIG9mIFRyYWNrJywgU3RyaW5nKHRyYWNrKSk7XG4gICAgICAgIFZBTElEQVRFX1FVRVVFX0NBUCh0aGlzLnF1ZXVlLCB0cmFjayk7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZShpbmRleCwgMCwgdHJhY2spO1xuICAgICAgICBpZiAoIXRoaXMucXVldWUub3B0aW9ucy5ub0VtaXRJbnNlcnQpIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYXVkaW9UcmFja0FkZCwgdGhpcy5xdWV1ZSwgdHJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIG1vdmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZShmcm9tOiBUcmFja1Jlc29sdmFibGUsIHRvOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKGZyb20pO1xuICAgICAgICBpZiAoIXJlbW92ZWQpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnaW52YWxpZCB0cmFjayB0byBtb3ZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnNlcnQocmVtb3ZlZCwgdG8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcHkgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gY2xvbmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIGNsb25lIGF0XG4gICAgICovXG4gICAgcHVibGljIGNvcHkoZnJvbTogVHJhY2tSZXNvbHZhYmxlLCB0bzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHNyYyA9IHRoaXMucXVldWUudHJhY2tzLmF0KHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihmcm9tKSk7XG4gICAgICAgIGlmICghc3JjKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ2ludmFsaWQgdHJhY2sgdG8gY29weScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5zZXJ0KHNyYywgdG8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN3YXAgdHdvIHRyYWNrcyBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZmlyc3QgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICAgKiBAcGFyYW0gc2Vjb25kIFRoZSBzZWNvbmQgdHJhY2sgdG8gc3dhcFxuICAgICAqL1xuICAgIHB1YmxpYyBzd2FwKGZpcnN0OiBUcmFja1Jlc29sdmFibGUsIHNlY29uZDogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHNyYyA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihmaXJzdCk7XG4gICAgICAgIGlmIChzcmMgPCAwKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ2ludmFsaWQgc3JjIHRyYWNrIHRvIHN3YXAnKTtcblxuICAgICAgICBjb25zdCBkZXN0ID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKHNlY29uZCk7XG4gICAgICAgIGlmIChkZXN0IDwgMCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdpbnZhbGlkIGRlc3QgdHJhY2sgdG8gc3dhcCcpO1xuXG4gICAgICAgIGNvbnN0IHNyY1QgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtzcmNdO1xuICAgICAgICBjb25zdCBkZXN0VCA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlW2Rlc3RdO1xuXG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY10gPSBkZXN0VDtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbZGVzdF0gPSBzcmNUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3AgdGhlIHBsYXliYWNrXG4gICAgICogQHBhcmFtIGZvcmNlIFdoZXRoZXIgb3Igbm90IHRvIGZvcmNlZnVsbHkgc3RvcCB0aGUgcGxheWJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RvcChmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMucXVldWUuaGlzdG9yeS5jbGVhcigpO1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZW5kKCk7XG4gICAgICAgIGlmIChmb3JjZSkge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLm9wdGlvbnMubGVhdmVPblN0b3ApIHtcbiAgICAgICAgICAgIGNvbnN0IHRtOiBOb2RlSlMuVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUGxheWluZygpIHx8IHRoaXMucXVldWUudHJhY2tzLnNpemUpIHJldHVybiBjbGVhclRpbWVvdXQodG0pO1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZGVzdHJveSgpO1xuICAgICAgICAgICAgfSwgdGhpcy5xdWV1ZS5vcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24pLnVucmVmKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSByYXcgYXVkaW8gcmVzb3VyY2VcbiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGF1ZGlvIHJlc291cmNlIHRvIHBsYXlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheVJhdyhyZXNvdXJjZTogQXVkaW9SZXNvdXJjZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnBsYXlTdHJlYW0ocmVzb3VyY2UgYXMgQXVkaW9SZXNvdXJjZTxUcmFjaz4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhlIGdpdmVuIHRyYWNrXG4gICAgICogQHBhcmFtIHJlcyBUaGUgdHJhY2sgdG8gcGxheVxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHBsYXlpbmcgdGhlIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXkocmVzPzogVHJhY2sgfCBudWxsLCBvcHRpb25zPzogUmVzb3VyY2VQbGF5T3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19WT0lDRV9DT05ORUNUSU9OKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgUmVjZWl2ZWQgcGxheSByZXF1ZXN0IGZyb20gZ3VpbGQgJHt0aGlzLnF1ZXVlLmd1aWxkLm5hbWV9IChJRDogJHt0aGlzLnF1ZXVlLmd1aWxkLmlkfSlgKTtcblxuICAgICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHF1ZXVlOiB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjayAhPSBudWxsLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25Nb2RlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZWVrOiAwXG4gICAgICAgICAgICB9IGFzIFJlc291cmNlUGxheU9wdGlvbnMsXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICkhO1xuXG4gICAgICAgIGlmIChyZXMgJiYgb3B0aW9ucy5xdWV1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1JlcXVlc3RlZCBvcHRpb24gcmVxdWlyZXMgdG8gcXVldWUgdGhlIHRyYWNrLCBhZGRpbmcgdGhlIGdpdmVuIHRyYWNrIHRvIHF1ZXVlIGluc3RlYWQuLi4nKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmFkZFRyYWNrKHJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFjayA9IHJlcyB8fCB0aGlzLnF1ZXVlLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnUGxheSByZXF1ZXN0IHJlY2VpdmVkIGJ1dCB0cmFjayB3YXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVycm9yLCB0aGlzLnF1ZXVlLCBlcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnUmVxdWVzdGVkIG9wdGlvbiByZXF1aXJlcyB0byBwbGF5IHRoZSB0cmFjaywgaW5pdGlhbGl6aW5nLi4uJyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBJbml0aWF0aW5nIHN0cmVhbSBleHRyYWN0aW9uIHByb2Nlc3MuLi5gKTtcbiAgICAgICAgICAgIGNvbnN0IHNyYyA9IHRyYWNrLnJhdz8uc291cmNlIHx8IHRyYWNrLnNvdXJjZTtcbiAgICAgICAgICAgIGNvbnN0IHF0OiBTZWFyY2hRdWVyeVR5cGUgPSB0cmFjay5xdWVyeVR5cGUgfHwgKHNyYyA9PT0gJ3Nwb3RpZnknID8gJ3Nwb3RpZnlTb25nJyA6IHNyYyA9PT0gJ2FwcGxlX211c2ljJyA/ICdhcHBsZU11c2ljU29uZycgOiBzcmMpO1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYEV4ZWN1dGluZyBvbkJlZm9yZUNyZWF0ZVN0cmVhbSBob29rIChRdWVyeVR5cGU6ICR7cXR9KS4uLmApO1xuXG4gICAgICAgICAgICBjb25zdCBzdHJlYW1TcmMgPSB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IG51bGwgYXMgRXJyb3IgfCBudWxsLFxuICAgICAgICAgICAgICAgIHN0cmVhbTogbnVsbCBhcyBFeHRyYWN0b3JTdHJlYW1hYmxlIHwgbnVsbFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5vbkJlZm9yZUNyZWF0ZVN0cmVhbT8uKHRyYWNrLCBxdCB8fCAnYXJiaXRyYXJ5JywgdGhpcy5xdWV1ZSkudGhlbihcbiAgICAgICAgICAgICAgICAocykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlOiBFcnJvcikgPT4gKHN0cmVhbVNyYy5lcnJvciA9IGUpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyB0aHJvdyBpZiAnb25CZWZvcmVDcmVhdGVTdHJlYW0nIHBhbmljc1xuICAgICAgICAgICAgaWYgKCFzdHJlYW1TcmMuc3RyZWFtICYmIHN0cmVhbVNyYy5lcnJvcikgcmV0dXJuIHRoaXMuI3Rocm93KHRyYWNrLCBzdHJlYW1TcmMuZXJyb3IpO1xuXG4gICAgICAgICAgICAvLyBkZWZhdWx0IGJlaGF2aW9yIHdoZW4gJ29uQmVmb3JlQ3JlYXRlU3RyZWFtJyBkaWQgbm90IHBhbmljXG4gICAgICAgICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnRmFpbGVkIHRvIGdldCBzdHJlYW0gZnJvbSBvbkJlZm9yZUNyZWF0ZVN0cmVhbSEnKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNjcmVhdGVHZW5lcmljU3RyZWFtKHRyYWNrKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAocikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHI/LnJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gPSA8UmVhZGFibGU+ci5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocj8uZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuZXJyb3IgPSByLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IHN0cmVhbVNyYy5lcnJvciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIChlOiBFcnJvcikgPT4gKHN0cmVhbVNyYy5lcnJvciA9IGUpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFzdHJlYW1TcmMuc3RyZWFtKSByZXR1cm4gdGhpcy4jdGhyb3codHJhY2ssIHN0cmVhbVNyYy5lcnJvcik7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zZWVrID09PSAnbnVtYmVyJyAmJiBvcHRpb25zLnNlZWsgPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuI3Byb2dyZXNzID0gb3B0aW9ucy5zZWVrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICBjb25zdCBjb29raWVzID0gdHJhY2sucmF3Py5zb3VyY2UgPT09ICd5b3V0dWJlJyA/ICg8YW55PnRoaXMucXVldWUucGxheWVyLm9wdGlvbnMueXRkbE9wdGlvbnM/LnJlcXVlc3RPcHRpb25zKT8uaGVhZGVycz8uY29va2llIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBjb25zdCB0cmFja1N0cmVhbUNvbmZpZzogU3RyZWFtQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoZXJDb25maWc6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUJpcXVhZDogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVCaXF1YWQsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVFcXVhbGl6ZXI6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyLFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlVm9sdW1lOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZVZvbHVtZSxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUZpbHRlcnM6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVSZXNhbXBsZXI6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlUmVzYW1wbGVyLFxuICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlOiB0eXBlb2YgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA9PT0gJ251bWJlcicgJiYgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA+IDAgPyB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBiaXF1YWRGaWx0ZXI6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBlcTogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplcixcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnM6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLFxuICAgICAgICAgICAgICAgICAgICB2b2x1bWU6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHRyYWNrLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTdHJlYW1UeXBlLlJhdyxcbiAgICAgICAgICAgICAgICAgICAgc2tpcEZGbXBlZzogdGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwbGF5ZXJDb25maWc6IG9wdGlvbnNcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGxldCByZXNvbHZlcjogKCkgPT4gdm9pZCA9IFV0aWwubm9vcDtcbiAgICAgICAgICAgIGNvbnN0IGRvbmVQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IChyZXNvbHZlciA9IHJlc29sdmUpKTtcblxuICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQud2lsbFBsYXlUcmFjaywgdGhpcy5xdWV1ZSwgdHJhY2ssIHRyYWNrU3RyZWFtQ29uZmlnLCByZXNvbHZlciEpO1xuXG4gICAgICAgICAgICAvLyBwcmV2ZW50IGRhbmdsaW5nIHByb21pc2VcbiAgICAgICAgICAgIGlmICghc3VjY2VzcykgcmVzb2x2ZXIoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1dhaXRpbmcgZm9yIHdpbGxQbGF5VHJhY2sgZXZlbnQgdG8gcmVzb2x2ZS4uLicpO1xuXG4gICAgICAgICAgICBhd2FpdCBkb25lUHJvbWlzZTtcblxuICAgICAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgICAgICBjb25zdCBkYXNwRGlzYWJsZWQgPSBbXG4gICAgICAgICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlQmlxdWFkLFxuICAgICAgICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVGaWx0ZXJzLFxuICAgICAgICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZVJlc2FtcGxlcixcbiAgICAgICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVWb2x1bWVcbiAgICAgICAgICAgIF0uZXZlcnkoKGUpID0+ICEhZSA9PT0gdHJ1ZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG5lZWRzRmlsdGVycyA9ICEhdHJhY2tTdHJlYW1Db25maWcucGxheWVyQ29uZmlnLnNlZWsgfHwgISF0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLmFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3Qgc2hvdWxkU2tpcEZGbXBlZyA9ICEhdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5za2lwRkZtcGVnICYmICFuZWVkc0ZpbHRlcnM7XG5cbiAgICAgICAgICAgIGxldCBmaW5hbFN0cmVhbTogUmVhZGFibGU7XG5cbiAgICAgICAgICAgIGNvbnN0IGRlbXV4YWJsZSA9IChmbXQ6IHN0cmluZykgPT4gW1N0cmVhbVR5cGUuT3B1cywgU3RyZWFtVHlwZS5XZWJtT3B1cywgU3RyZWFtVHlwZS5PZ2dPcHVzXS5pbmNsdWRlcyhmbXQgYXMgU3RyZWFtVHlwZSk7XG5cbiAgICAgICAgICAgIC8vIHNraXAgZmZtcGVnIHdoZW4gcG9zc2libGVcbiAgICAgICAgICAgIGlmIChzaG91bGRTa2lwRkZtcGVnICYmICEoc3RyZWFtU3JjLnN0cmVhbSBpbnN0YW5jZW9mIFJlYWRhYmxlKSAmJiB0eXBlb2Ygc3RyZWFtU3JjLnN0cmVhbSAhPT0gJ3N0cmluZycgJiYgZGVtdXhhYmxlKHN0cmVhbVNyYy5zdHJlYW0uJGZtdCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7ICRmbXQsIHN0cmVhbSB9ID0gc3RyZWFtU3JjLnN0cmVhbTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRQQ00gPSAhZGFzcERpc2FibGVkO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYHNraXBGRm1wZWcgaXMgc2V0IHRvIHRydWUgYW5kIHN0cmVhbSBpcyBkZW11eGFibGUsIGNyZWF0aW5nIHN0cmVhbSB3aXRoIHR5cGUgJHtzaG91bGRQQ00gPyAncGNtJyA6ICdvcHVzJ31gKTtcblxuICAgICAgICAgICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdXNTdHJlYW0gPSAkZm10ID09PSBTdHJlYW1UeXBlLk9wdXMgP1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0gOlxuICAgICAgICAgICAgICAgICAgICAkZm10ID09PSBTdHJlYW1UeXBlLk9nZ09wdXMgP1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucGlwZShuZXcgcHJpc20ub3B1cy5PZ2dEZW11eGVyKCkpIDpcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnBpcGUobmV3IHByaXNtLm9wdXMuV2VibURlbXV4ZXIoKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkUENNKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW55IGZpbHRlcnMgZW5hYmxlZCwgd2UgbmVlZCB0byBkZWNvZGUgdGhlIG9wdXMgc3RyZWFtIHRvIHBjbVxuICAgICAgICAgICAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW0ucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPcHVzRGVjb2Rlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHM6IDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplOiA5NjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZTogNDgwMDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcudHlwZSA9IFN0cmVhbVR5cGUuUmF3O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsU3RyZWFtID0gb3B1c1N0cmVhbTtcbiAgICAgICAgICAgICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gU3RyZWFtVHlwZS5PcHVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc3Qgb3B1cyA9IGRhc3BEaXNhYmxlZCAmJiB0aGlzLiNoYXNGRm1wZWdPcHRpbWl6YXRpb247XG4gICAgICAgICAgICAgICAgLy8gaWYgKG9wdXMgJiYgdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnRGlzYWJsaW5nIFBDTSBvdXRwdXQgc2luY2UgYWxsIGZpbHRlcnMgYXJlIGRpc2FibGVkIGFuZCBvcHVzIGVuY29kaW5nIGlzIHN1cHBvcnRlZC4uLicpO1xuXG4gICAgICAgICAgICAgICAgZmluYWxTdHJlYW0gPSB0aGlzLiNjcmVhdGVGRm1wZWdTdHJlYW0oXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gaW5zdGFuY2VvZiBSZWFkYWJsZSB8fCB0eXBlb2Ygc3RyZWFtU3JjLnN0cmVhbSA9PT0gJ3N0cmluZycgPyBzdHJlYW1TcmMuc3RyZWFtIDogc3RyZWFtU3JjLnN0cmVhbS5zdHJlYW0sXG4gICAgICAgICAgICAgICAgICAgIHRyYWNrLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNlZWsgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgY29va2llc1xuICAgICAgICAgICAgICAgICAgICAvLyBvcHVzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgICAgICAgICAvLyBGSVhNRTogT2dnT3B1cyByZXN1bHRzIGluIHN0YXRpYyBub2lzZVxuICAgICAgICAgICAgICAgIC8vIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcudHlwZSA9IG9wdXMgPyBTdHJlYW1UeXBlLk9nZ09wdXMgOiBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMudHJhbnNpdGlvbk1vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgVHJhbnNpdGlvbiBtb2RlIGRldGVjdGVkLCBwbGF5ZXIgd2lsbCB3YWl0IGZvciBidWZmZXJpbmcgdGltZW91dCB0byBleHBpcmUgKFRpbWVvdXQ6ICR7dGhpcy5xdWV1ZS5vcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXR9bXMpYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgd2FpdEZvcih0aGlzLnF1ZXVlLm9wdGlvbnMuYnVmZmVyaW5nVGltZW91dCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0J1ZmZlcmluZyB0aW1lb3V0IGhhcyBleHBpcmVkIScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgUHJlcGFyaW5nIGZpbmFsIHN0cmVhbSBjb25maWc6ICR7SlNPTi5zdHJpbmdpZnkodHJhY2tTdHJlYW1Db25maWcsIG51bGwsIDIpfWApO1xuXG4gICAgICAgICAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IHRoaXMucXVldWUuZGlzcGF0Y2hlci5jcmVhdGVTdHJlYW0oZmluYWxTdHJlYW0sIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcpO1xuXG4gICAgICAgICAgICB0aGlzLnF1ZXVlLnNldFRyYW5zaXRpb25pbmcoISFvcHRpb25zLnRyYW5zaXRpb25Nb2RlKTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy4jcGVyZm9ybVBsYXkocmVzb3VyY2UpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgRmFpbGVkIHRvIGluaXRpYWxpemUgYXVkaW8gcGxheWVyOiAke2V9YCk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgI3Rocm93KHRyYWNrOiBUcmFjaywgZXJyb3I/OiBFcnJvciB8IG51bGwpIHtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIGNvbnN0IHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdCA9IChcbiAgICAgICAgICAgIEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVChgQ291bGQgbm90IGV4dHJhY3Qgc3RyZWFtIGZvciB0aGlzIHRyYWNrJHtlcnJvciA/IGBcXG5cXG4ke2Vycm9yLnN0YWNrIHx8IGVycm9yfWAgOiAnJ31gKVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyU2tpcCwgdGhpcy5xdWV1ZSwgdHJhY2ssIFRyYWNrU2tpcFJlYXNvbi5Ob1N0cmVhbSwgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0Lm1lc3NhZ2UpO1xuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllckVycm9yLCB0aGlzLnF1ZXVlLCBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQsIHRyYWNrKTtcbiAgICAgICAgY29uc3QgbmV4dFRyYWNrID0gdGhpcy5xdWV1ZS50cmFja3MuZGlzcGF0Y2goKTtcbiAgICAgICAgaWYgKG5leHRUcmFjaykgdGhpcy5wbGF5KG5leHRUcmFjaywgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhc3luYyAjcGVyZm9ybVBsYXkocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdJbml0aWFsaXppbmcgYXVkaW8gcGxheWVyLi4uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMucXVldWUuZGlzcGF0Y2hlciEucGxheVN0cmVhbShyZXNvdXJjZSk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdEaXNwYXRjaGluZyBhdWRpby4uLicpO1xuICAgIH1cblxuICAgIGFzeW5jICNjcmVhdGVHZW5lcmljU3RyZWFtKHRyYWNrOiBUcmFjaykge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgQXR0ZW1wdGluZyB0byBleHRyYWN0IHN0cmVhbSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgcmVnaXN0ZXJlZCBleHRyYWN0b3JzYCk7XG4gICAgICAgIGNvbnN0IHN0cmVhbUluZm8gPSBhd2FpdCB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0cmFjdG9yKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5ibG9ja1N0cmVhbUZyb20/LnNvbWUoKGV4dCkgPT4gZXh0ID09PSBleHRyYWN0b3IuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGNhblN0cmVhbSA9IGF3YWl0IGV4dHJhY3Rvci52YWxpZGF0ZSh0cmFjay51cmwsIHRyYWNrLnF1ZXJ5VHlwZSB8fCBRdWVyeVJlc29sdmVyLnJlc29sdmUodHJhY2sudXJsKS50eXBlKTtcbiAgICAgICAgICAgIGlmICghY2FuU3RyZWFtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZXh0cmFjdG9yLnN0cmVhbSh0cmFjayk7XG4gICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgaWYgKCFzdHJlYW1JbmZvIHx8ICFzdHJlYW1JbmZvLnJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYEZhaWxlZCB0byBleHRyYWN0IHN0cmVhbSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgcmVnaXN0ZXJlZCBleHRyYWN0b3JzYCk7XG4gICAgICAgICAgICByZXR1cm4gc3RyZWFtSW5mbyB8fCBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBTdHJlYW0gZXh0cmFjdGlvbiB3YXMgc3VjY2Vzc2Z1bCBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gKEV4dHJhY3RvcjogJHtzdHJlYW1JbmZvLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ30pYCk7XG5cbiAgICAgICAgcmV0dXJuIHN0cmVhbUluZm87XG4gICAgfVxuXG4gICAgI2NyZWF0ZUZGbXBlZ1N0cmVhbShzdHJlYW06IFJlYWRhYmxlIHwgc3RyaW5nLCB0cmFjazogVHJhY2ssIHNlZWsgPSAwLCBjb29raWVzPzogc3RyaW5nLCBvcHVzPzogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBmZm1wZWdTdHJlYW0gPSB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnXG4gICAgICAgICAgICAuY3JlYXRlU3RyZWFtKHN0cmVhbSwge1xuICAgICAgICAgICAgICAgIGVuY29kZXJBcmdzOiB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLmFyZ3MsXG4gICAgICAgICAgICAgICAgc2Vlazogc2VlayAvIDEwMDAsXG4gICAgICAgICAgICAgICAgZm10OiBvcHVzID8gJ29wdXMnIDogJ3MxNmxlJyxcbiAgICAgICAgICAgICAgICBjb29raWVzLFxuICAgICAgICAgICAgICAgIHVzZUxlZ2FjeUZGbXBlZzogISF0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLnVzZUxlZ2FjeUZGbXBlZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbSA9IGAke2Vycn1gLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgU3RyZWFtIGNsb3NlZCBkdWUgdG8gYW4gZXJyb3IgZnJvbSBGRm1wZWcgc3RyZWFtOiAke2Vyci5zdGFjayB8fCBlcnIubWVzc2FnZSB8fCBlcnJ9YCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobS5pbmNsdWRlcygncHJlbWF0dXJlIGNsb3NlJykgfHwgbS5pbmNsdWRlcygnZXBpcGUnKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJFcnJvciwgdGhpcy5xdWV1ZSwgZXJyLCB0cmFjayk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmZtcGVnU3RyZWFtO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4vVHlwZVV0aWwnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBmZXRjaCB9IGZyb20gJ3VuZGljaSc7XG5cbi8vICNyZWdpb24gc2NhcnkgdGhpbmdzIGJlbG93ICpzaWdoKlxuY29uc3Qgc3BvdGlmeVNvbmdSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoaW50bC0oW2Etel18W0EtWl0pK1xcLyk/KD86dHJhY2tcXC98XFw/dXJpPXNwb3RpZnk6dHJhY2s6KSgoXFx3fC0pezIyfSkoXFw/c2k9LispPyQvO1xuY29uc3Qgc3BvdGlmeVBsYXlsaXN0UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OnBsYXlsaXN0XFwvfFxcP3VyaT1zcG90aWZ5OnBsYXlsaXN0OikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHNwb3RpZnlBbGJ1bVJlZ2V4ID0gL15odHRwcz86XFwvXFwvKD86ZW1iZWRcXC58b3BlblxcLikoPzpzcG90aWZ5XFwuY29tXFwvKShpbnRsLShbYS16XXxbQS1aXSkrXFwvKT8oPzphbGJ1bVxcL3xcXD91cmk9c3BvdGlmeTphbGJ1bTopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCB2aW1lb1JlZ2V4ID0gL14oaHR0cHxodHRwcyk/OlxcL1xcLyh3d3dcXC58cGxheWVyXFwuKT92aW1lb1xcLmNvbVxcLyg/OmNoYW5uZWxzXFwvKD86XFx3K1xcLyk/fGdyb3Vwc1xcLyhbXi9dKilcXC92aWRlb3NcXC98dmlkZW9cXC98KShcXGQrKSg/OnxcXC9cXD8pJC87XG5jb25zdCByZXZlcmJuYXRpb25SZWdleCA9IC9eaHR0cHM6XFwvXFwvKHd3dy4pP3JldmVyYm5hdGlvbi5jb21cXC8oLispXFwvc29uZ1xcLyguKykkLztcbmNvbnN0IGF0dGFjaG1lbnRSZWdleCA9IC9eaHR0cHM/OlxcL1xcLy4rJC87XG5jb25zdCBhcHBsZU11c2ljU29uZ1JlZ2V4ID0gL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcLyhzb25nfGFsYnVtKVxcLy4rPyhcXC8uKz9cXD9pPXxcXC8pKFswLTldKykkLztcbmNvbnN0IGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4ID0gL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL3BsYXlsaXN0XFwvLitcXC9wbFxcLih1LXxwbS0pP1thLXpBLVowLTldKyQvO1xuY29uc3QgYXBwbGVNdXNpY0FsYnVtUmVnZXggPSAvXmh0dHBzPzpcXC9cXC9tdXNpY1xcLmFwcGxlXFwuY29tXFwvLis/XFwvYWxidW1cXC8uK1xcLyhbMC05XSspJC87XG5jb25zdCBzb3VuZGNsb3VkVHJhY2tSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyhtLnx3d3cuKT9zb3VuZGNsb3VkLmNvbVxcLyhcXHd8LSkrXFwvKFxcd3wtKSsoLispPyQvO1xuY29uc3Qgc291bmRjbG91ZFBsYXlsaXN0UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8obS58d3d3Lik/c291bmRjbG91ZC5jb21cXC8oXFx3fC0pK1xcL3NldHNcXC8oXFx3fC0pKyguKyk/JC87XG5jb25zdCB5b3V0dWJlUGxheWxpc3RSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyh3d3cuKT95b3V0dWJlLmNvbVxcL3BsYXlsaXN0XFw/bGlzdD0oKFBMfEZMfFVVfExMfFJEfE9MKVthLXpBLVowLTktX117MTYsNDF9KSQvO1xuY29uc3QgeW91dHViZVZpZGVvVVJMUmVnZXggPSAvXigoPzpodHRwcz86KT9cXC9cXC8pPygoPzp3d3d8bSlcXC4pPygoPzp5b3V0dWJlXFwuY29tfHlvdXR1LmJlKSkoXFwvKD86W1xcdy1dK1xcP3Y9fGVtYmVkXFwvfHZcXC8pPykoW1xcdy1dKykoXFxTKyk/JC87XG5jb25zdCB5b3V0dWJlVmlkZW9JZFJlZ2V4ID0gL15bYS16QS1aMC05LV9dezExfSQvO1xuLy8gI2VuZHJlZ2lvbiBzY2FyeSB0aGluZ3MgYWJvdmUgKnNpZ2gqXG5cbmNvbnN0IERvbWFpbnNNYXAgPSB7XG4gICAgWW91VHViZTogWyd5b3V0dWJlLmNvbScsICd5b3V0dS5iZScsICdtdXNpYy55b3V0dWJlLmNvbScsICdnYW1pbmcueW91dHViZS5jb20nLCAnd3d3LnlvdXR1YmUuY29tJywgJ20ueW91dHViZS5jb20nXSxcbiAgICBTcG90aWZ5OiBbJ29wZW4uc3BvdGlmeS5jb20nLCAnZW1iZWQuc3BvdGlmeS5jb20nXSxcbiAgICBWaW1lbzogWyd2aW1lby5jb20nLCAncGxheWVyLnZpbWVvLmNvbSddLFxuICAgIFJldmVyYk5hdGlvbjogWydyZXZlcmJuYXRpb24uY29tJ10sXG4gICAgU291bmRDbG91ZDogWydzb3VuZGNsb3VkLmNvbSddLFxuICAgIEFwcGxlTXVzaWM6IFsnbXVzaWMuYXBwbGUuY29tJ11cbn07XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgcmVkaXJlY3REb21haW5zID0gbmV3IFNldChbXG4gICAgL15odHRwcz86XFwvXFwvc3BvdGlmeS5saW5rXFwvW0EtWmEtejAtOV0rJC8sXG5dKTtcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFF1ZXJ5IHtcbiAgICB0eXBlOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG4gICAgcXVlcnk6IHN0cmluZztcbn1cblxuY2xhc3MgUXVlcnlSZXNvbHZlciB7XG4gICAgLyoqXG4gICAgICogUXVlcnkgcmVzb2x2ZXJcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cblxuICAgIHN0YXRpYyBnZXQgcmVnZXgoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzcG90aWZ5QWxidW1SZWdleCxcbiAgICAgICAgICAgIHNwb3RpZnlQbGF5bGlzdFJlZ2V4LFxuICAgICAgICAgICAgc3BvdGlmeVNvbmdSZWdleCxcbiAgICAgICAgICAgIHZpbWVvUmVnZXgsXG4gICAgICAgICAgICByZXZlcmJuYXRpb25SZWdleCxcbiAgICAgICAgICAgIGF0dGFjaG1lbnRSZWdleCxcbiAgICAgICAgICAgIGFwcGxlTXVzaWNBbGJ1bVJlZ2V4LFxuICAgICAgICAgICAgYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXgsXG4gICAgICAgICAgICBhcHBsZU11c2ljU29uZ1JlZ2V4LFxuICAgICAgICAgICAgc291bmRjbG91ZFRyYWNrUmVnZXgsXG4gICAgICAgICAgICBzb3VuZGNsb3VkUGxheWxpc3RSZWdleCxcbiAgICAgICAgICAgIHlvdXR1YmVQbGF5bGlzdFJlZ2V4XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlLXJlc29sdmUgcmVkaXJlY3QgdXJsc1xuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBwcmVSZXNvbHZlKHF1ZXJ5OiBzdHJpbmcsIG1heERlcHRoID0gNSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKHF1ZXJ5LCAnc3RyaW5nJywgdHlwZW9mIHF1ZXJ5KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGRvbWFpbiBvZiByZWRpcmVjdERvbWFpbnMpIHtcbiAgICAgICAgICAgIGlmIChkb21haW4udGVzdChxdWVyeSkpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChxdWVyeSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnZm9sbG93J1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcy5vaykgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gc3BvdGlmeSBkb2VzIG5vdCBcInJlZGlyZWN0XCIsIGl0IHJldHVybnMgYSBwYWdlIHdpdGgganMgdGhhdCByZWRpcmVjdHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9eaHR0cHM/OlxcL1xcL3Nwb3RpZnkuYXBwLmxpbmtcXC8oLispJC8udGVzdChyZXMudXJsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBib2R5LnNwbGl0KCdodHRwczovL29wZW4uc3BvdGlmeS5jb20vdHJhY2svJylbMV0uc3BsaXQoJz9zaT0nKVswXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQpIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYGh0dHBzOi8vb3Blbi5zcG90aWZ5LmNvbS90cmFjay8ke3RhcmdldH1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXhEZXB0aCA8IDEgPyByZXMudXJsIDogdGhpcy5wcmVSZXNvbHZlKHJlcy51cmwsIG1heERlcHRoIC0gMSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBxdWVyeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gc2VhcmNoIHF1ZXJ5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IFRoZSBxdWVyeVxuICAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlKHF1ZXJ5OiBzdHJpbmcsIGZhbGxiYWNrU2VhcmNoRW5naW5lOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV0gPSBRdWVyeVR5cGUuQVVUT19TRUFSQ0gpOiBSZXNvbHZlZFF1ZXJ5IHtcbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc1N0cmluZyhxdWVyeSkpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUocXVlcnksICdzdHJpbmcnLCB0eXBlb2YgcXVlcnkpO1xuICAgICAgICBpZiAoIXF1ZXJ5Lmxlbmd0aCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5GT19SRVFVSVJFRCgncXVlcnknLCBTdHJpbmcocXVlcnkpKTtcblxuICAgICAgICBjb25zdCByZXNvbHZlciA9ICh0eXBlOiB0eXBlb2YgZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5OiBzdHJpbmcpID0+ICh7IHR5cGUsIHF1ZXJ5IH0pO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHF1ZXJ5KTtcblxuICAgICAgICAgICAgaWYgKERvbWFpbnNNYXAuWW91VHViZS5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2UoLyhtKHVzaWMpP3xnYW1pbmcpXFwuLywgJycpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwbGF5bGlzdElkID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoJ2xpc3QnKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWRlb0lkID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoJ3YnKTtcbiAgICAgICAgICAgICAgICBpZiAocGxheWxpc3RJZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9JZCAmJiBwbGF5bGlzdElkLnN0YXJ0c1dpdGgoJ1JEJykpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuWU9VVFVCRV9QTEFZTElTVCwgYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9JHt2aWRlb0lkfSZsaXN0PSR7cGxheWxpc3RJZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5ZT1VUVUJFX1BMQVlMSVNULCBgaHR0cHM6Ly93d3cueW91dHViZS5jb20vcGxheWxpc3Q/bGlzdD0ke3BsYXlsaXN0SWR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChRdWVyeVJlc29sdmVyLnZhbGlkYXRlSWQocXVlcnkpIHx8IFF1ZXJ5UmVzb2x2ZXIudmFsaWRhdGVVUkwocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLllPVVRVQkVfVklERU8sIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5TcG90aWZ5LmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkucmVwbGFjZSgvaW50bC0oW2EtekEtWl0rKVxcLy8sICcnKTtcbiAgICAgICAgICAgICAgICBpZiAoc3BvdGlmeVBsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICAgICAgICAgIGlmIChzcG90aWZ5QWxidW1SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TUE9USUZZX0FMQlVNLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgaWYgKHNwb3RpZnlTb25nUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9TT05HLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuVmltZW8uaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZpbWVvUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuVklNRU8sIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5SZXZlcmJOYXRpb24uaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJldmVyYm5hdGlvblJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlJFVkVSQk5BVElPTiwgcXVlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlNvdW5kQ2xvdWQuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNvdW5kY2xvdWRQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNPVU5EQ0xPVURfUExBWUxJU1QsIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICBpZiAoc291bmRjbG91ZFRyYWNrUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU09VTkRDTE9VRF9UUkFDSywgcXVlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLkFwcGxlTXVzaWMuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFwcGxlTXVzaWNBbGJ1bVJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX0FMQlVNLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgaWYgKGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX1BMQVlMSVNULCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgaWYgKGFwcGxlTXVzaWNTb25nUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVBQTEVfTVVTSUNfU09ORywgcXVlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFSQklUUkFSWSwgcXVlcnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHZpbWVvIGlkIGZyb20gdXJsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IFRoZSBxdWVyeVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldFZpbWVvSUQocXVlcnk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gUXVlcnlSZXNvbHZlci5yZXNvbHZlKHF1ZXJ5KS50eXBlID09PSBRdWVyeVR5cGUuVklNRU8gPyBxdWVyeS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKS5wb3AoKSA6IG51bGw7XG4gICAgfVxuXG4gICAgc3RhdGljIHZhbGlkYXRlSWQocTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB5b3V0dWJlVmlkZW9JZFJlZ2V4LnRlc3QocSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHZhbGlkYXRlVVJMKHE6IHN0cmluZykge1xuICAgICAgICByZXR1cm4geW91dHViZVZpZGVvVVJMUmVnZXgudGVzdChxKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFF1ZXJ5UmVzb2x2ZXIgfTtcbiIsICJpbXBvcnQgeyBTbm93Zmxha2VVdGlsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQWJvcnRTaWduYWwgdG8gY2FuY2VsIHRoaXMgZW50cnlcbiAgICAgKi9cbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuZXhwb3J0IHR5cGUgQXN5bmNRdWV1ZUV4Y2VwdGlvbkhhbmRsZXIgPSAoZXhjZXB0aW9uOiBFcnJvcikgPT4gdm9pZDtcblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBxdWV1ZWQgZW50cmllc1xuICAgICAqL1xuICAgIHB1YmxpYyBlbnRyaWVzOiBBcnJheTxBc3luY1F1ZXVlRW50cnk+ID0gW107XG5cbiAgICBwdWJsaWMgZXhjZXB0aW9uSGFuZGxlcj86IEFzeW5jUXVldWVFeGNlcHRpb25IYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgZW50cmllcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBjb25zdW1lIFdoZXRoZXIgb3Igbm90IHRvIGNvbnN1bWUgYWxsIGVudHJpZXMgYmVmb3JlIGNsZWFyaW5nXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKGNvbnN1bWUgPSBmYWxzZSkge1xuICAgICAgICBpZiAoY29uc3VtZSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiBlbnRyeS5jb25zdW1lKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnRyaWVzID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgcXVldWUuIFJldHVybnMgYDBgIGlmIG5vIGVudHJpZXMgYXJlIGF2YWlsYWJsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFjcXVpcmUgYW4gZW50cnkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSAvLyBsb2NrIHRoZSBxdWV1ZVxuICAgICAqIGNvbnN0IGVudHJ5ID0gYXN5bmNRdWV1ZS5hY3F1aXJlKCk7XG4gICAgICogLy8gd2FpdCB1bnRpbCBwcmV2aW91cyB0YXNrIGlzIGNvbXBsZXRlZFxuICAgICAqIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgKiAvLyBkbyBzb21ldGhpbmcgZXhwZW5zaXZlXG4gICAgICogYXdhaXQgcGVyZm9ybVNvbWV0aGluZ0V4cGVuc2l2ZSgpO1xuICAgICAqIC8vIG1ha2Ugc3VyZSB0byByZWxlYXNlIHRoZSBsb2NrIG9uY2UgZG9uZVxuICAgICAqIGFzeW5jUXVldWUucmVsZWFzZSgpO1xuICAgICAqXG4gICAgICovXG4gICAgcHVibGljIGFjcXVpcmUob3B0aW9ucz86IEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSBuZXcgQXN5bmNRdWV1ZUVudHJ5KHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmICh0aGlzLmV4Y2VwdGlvbkhhbmRsZXIpIGVudHJ5LmdldFRhc2soKS5jYXRjaCh0aGlzLmV4Y2VwdGlvbkhhbmRsZXIpO1xuXG4gICAgICAgIGlmICh0aGlzLmVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgICAgICBlbnRyeS5jb25zdW1lKCk7XG4gICAgICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlIHRoZSBjdXJyZW50IGFjcXVpc2l0aW9uIGFuZCBtb3ZlIHRvIG5leHQgZW50cnkuXG4gICAgICovXG4gICAgcHVibGljIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5lbnRyaWVzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuZW50cmllcy5zaGlmdCgpO1xuICAgICAgICB0aGlzLmVudHJpZXNbMF0/LmNvbnN1bWUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgYWxsIGVudHJpZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FuY2VsQWxsKCkge1xuICAgICAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IGVudHJ5LmNhbmNlbCgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIGVudHJ5IGZyb20gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGVudHJ5IFRoZSBlbnRyeSB0byByZW1vdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlRW50cnkoZW50cnk6IEFzeW5jUXVldWVFbnRyeSkge1xuICAgICAgICBjb25zdCBlbnRyeUlkeCA9IHRoaXMuZW50cmllcy5pbmRleE9mKGVudHJ5KTtcblxuICAgICAgICBpZiAoZW50cnlJZHggIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc3BsaWNlKGVudHJ5SWR4LCAxKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWVFbnRyeSB7XG4gICAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICAgIHB1YmxpYyBzaWduYWw6IEFib3J0U2lnbmFsIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIG9uQWJvcnQ6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcmVzb2x2ZSE6ICgpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSByZWplY3QhOiAoZXJyOiBFcnJvcikgPT4gdm9pZDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEFzeW5jUXVldWUsIHB1YmxpYyBvcHRpb25zPzogQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucykge1xuICAgICAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgdGhpcy5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnM/LnNpZ25hbCkge1xuICAgICAgICAgICAgdGhpcy5zZXRBYm9ydFNpZ25hbCh0aGlzLm9wdGlvbnMuc2lnbmFsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRBYm9ydFNpZ25hbChzaWduYWw6IEFib3J0U2lnbmFsKSB7XG4gICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNpZ25hbCA9IHNpZ25hbDtcbiAgICAgICAgdGhpcy5vbkFib3J0ID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5yZW1vdmVFbnRyeSh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25zdW1lKCkge1xuICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgICAgdGhpcy5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbGVhc2UoKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpO1xuICAgICAgICB0aGlzLnF1ZXVlLnJlbGVhc2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuY2VsKCkge1xuICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgICAgdGhpcy5yZWplY3QobmV3IEVycm9yKCdDYW5jZWxsZWQnKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFudXAoKSB7XG4gICAgICAgIGlmICh0aGlzLm9uQWJvcnQpIHRoaXMuc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIHRoaXMub25BYm9ydCk7XG4gICAgICAgIHRoaXMuc2lnbmFsID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbkFib3J0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VGFzaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRmlsdGVyc05hbWUsIFF1ZXVlRmlsdGVycyB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IEF1ZGlvRmlsdGVycyB9IGZyb20gJy4uL3V0aWxzL0F1ZGlvRmlsdGVycyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgQmlxdWFkRmlsdGVycywgRXF1YWxpemVyLCBFcXVhbGl6ZXJCYW5kLCBQQ01GaWx0ZXJzIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBGRm1wZWdTdHJlYW1PcHRpb25zLCBjcmVhdGVGRm1wZWdTdHJlYW0gfSBmcm9tICcuLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbnR5cGUgRmlsdGVycyA9IGtleW9mIHR5cGVvZiBBdWRpb0ZpbHRlcnMuZmlsdGVycztcblxuY29uc3QgbWFrZUJhbmRzID0gKGFycjogbnVtYmVyW10pID0+IHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgICAge1xuICAgICAgICAgICAgbGVuZ3RoOiBFcXVhbGl6ZXIuQkFORF9DT1VOVFxuICAgICAgICB9LFxuICAgICAgICAoXywgaSkgPT4gKHtcbiAgICAgICAgICAgIGJhbmQ6IGksXG4gICAgICAgICAgICBnYWluOiBhcnJbaV0gPyBhcnJbaV0gLyAzMCA6IDBcbiAgICAgICAgfSlcbiAgICApIGFzIEVxdWFsaXplckJhbmRbXTtcbn07XG5cbnR5cGUgRVFQcmVzZXQgPSB7XG4gICAgRmxhdDogRXF1YWxpemVyQmFuZFtdO1xuICAgIENsYXNzaWNhbDogRXF1YWxpemVyQmFuZFtdO1xuICAgIENsdWI6IEVxdWFsaXplckJhbmRbXTtcbiAgICBEYW5jZTogRXF1YWxpemVyQmFuZFtdO1xuICAgIEZ1bGxCYXNzOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgRnVsbEJhc3NUcmVibGU6IEVxdWFsaXplckJhbmRbXTtcbiAgICBGdWxsVHJlYmxlOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgSGVhZHBob25lczogRXF1YWxpemVyQmFuZFtdO1xuICAgIExhcmdlSGFsbDogRXF1YWxpemVyQmFuZFtdO1xuICAgIExpdmU6IEVxdWFsaXplckJhbmRbXTtcbiAgICBQYXJ0eTogRXF1YWxpemVyQmFuZFtdO1xuICAgIFBvcDogRXF1YWxpemVyQmFuZFtdO1xuICAgIFJlZ2dhZTogRXF1YWxpemVyQmFuZFtdO1xuICAgIFJvY2s6IEVxdWFsaXplckJhbmRbXTtcbiAgICBTa2E6IEVxdWFsaXplckJhbmRbXTtcbiAgICBTb2Z0OiBFcXVhbGl6ZXJCYW5kW107XG4gICAgU29mdFJvY2s6IEVxdWFsaXplckJhbmRbXTtcbiAgICBUZWNobm86IEVxdWFsaXplckJhbmRbXTtcbn07XG5cbmV4cG9ydCBjb25zdCBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0OiBSZWFkb25seTxFUVByZXNldD4gPSBPYmplY3QuZnJlZXplKHtcbiAgICBGbGF0OiBtYWtlQmFuZHMoW10pLFxuICAgIENsYXNzaWNhbDogbWFrZUJhbmRzKFstMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNy4yLCAtNy4yLCAtOS42XSksXG4gICAgQ2x1YjogbWFrZUJhbmRzKFstMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgOC4wLCA1LjYsIDUuNiwgNS42LCAzLjIsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdKSxcbiAgICBEYW5jZTogbWFrZUJhbmRzKFs5LjYsIDcuMiwgMi40LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTcuMiwgLTcuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdKSxcbiAgICBGdWxsQmFzczogbWFrZUJhbmRzKFstOC4wLCA5LjYsIDkuNiwgNS42LCAxLjYsIC00LjAsIC04LjAsIC0xMC40LCAtMTEuMiwgLTExLjJdKSxcbiAgICBGdWxsQmFzc1RyZWJsZTogbWFrZUJhbmRzKFs3LjIsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNC44LCAxLjYsIDguMCwgMTEuMiwgMTIuMCwgMTIuMF0pLFxuICAgIEZ1bGxUcmVibGU6IG1ha2VCYW5kcyhbLTkuNiwgLTkuNiwgLTkuNiwgLTQuMCwgMi40LCAxMS4yLCAxNi4wLCAxNi4wLCAxNi4wLCAxNi44XSksXG4gICAgSGVhZHBob25lczogbWFrZUJhbmRzKFs0LjgsIDExLjIsIDUuNiwgLTMuMiwgLTIuNCwgMS42LCA0LjgsIDkuNiwgMTIuOCwgMTQuNF0pLFxuICAgIExhcmdlSGFsbDogbWFrZUJhbmRzKFsxMC40LCAxMC40LCA1LjYsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNC44LCAtNC44LCAtNC44LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV0pLFxuICAgIExpdmU6IG1ha2VCYW5kcyhbLTQuOCwgLTEuMTEwMjJlLTE1LCA0LjAsIDUuNiwgNS42LCA1LjYsIDQuMCwgMi40LCAyLjQsIDIuNF0pLFxuICAgIFBhcnR5OiBtYWtlQmFuZHMoWzcuMiwgNy4yLCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCA3LjIsIDcuMl0pLFxuICAgIFBvcDogbWFrZUJhbmRzKFstMS42LCA0LjgsIDcuMiwgOC4wLCA1LjYsIC0xLjExMDIyZS0xNSwgLTIuNCwgLTIuNCwgLTEuNiwgLTEuNl0pLFxuICAgIFJlZ2dhZTogbWFrZUJhbmRzKFstMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtNS42LCAtMS4xMTAyMmUtMTUsIDYuNCwgNi40LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1XSksXG4gICAgUm9jazogbWFrZUJhbmRzKFs4LjAsIDQuOCwgLTUuNiwgLTguMCwgLTMuMiwgNC4wLCA4LjgsIDExLjIsIDExLjIsIDExLjJdKSxcbiAgICBTa2E6IG1ha2VCYW5kcyhbLTIuNCwgLTQuOCwgLTQuMCwgLTEuMTEwMjJlLTE1LCA0LjAsIDUuNiwgOC44LCA5LjYsIDExLjIsIDkuNl0pLFxuICAgIFNvZnQ6IG1ha2VCYW5kcyhbNC44LCAxLjYsIC0xLjExMDIyZS0xNSwgLTIuNCwgLTEuMTEwMjJlLTE1LCA0LjAsIDguMCwgOS42LCAxMS4yLCAxMi4wXSksXG4gICAgU29mdFJvY2s6IG1ha2VCYW5kcyhbNC4wLCA0LjAsIDIuNCwgLTEuMTEwMjJlLTE1LCAtNC4wLCAtNS42LCAtMy4yLCAtMS4xMTAyMmUtMTUsIDIuNCwgOC44XSksXG4gICAgVGVjaG5vOiBtYWtlQmFuZHMoWzguMCwgNS42LCAtMS4xMTAyMmUtMTUsIC01LjYsIC00LjgsIC0xLjExMDIyZS0xNSwgOC4wLCA5LjYsIDkuNiwgOC44XSlcbn0pO1xuXG5leHBvcnQgY2xhc3MgRkZtcGVnRmlsdGVyZXI8TWV0YSA9IHVua25vd24+IHtcbiAgICAjZmZtcGVnRmlsdGVyczogRmlsdGVyc1tdID0gW107XG4gICAgI2lucHV0QXJnczogc3RyaW5nW10gPSBbXTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGFmOiBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgZmZtcGVnIG1heSBiZSBza2lwcGVkXG4gICAgICovXG4gICAgcHVibGljIGdldCBza2lwcGFibGUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuYWYucXVldWUucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZztcbiAgICB9XG5cbiAgICAjc2V0RmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJzW10pIHtcbiAgICAgICAgY29uc3QgeyBxdWV1ZSB9ID0gdGhpcy5hZjtcbiAgICAgICAgLy8gc2tpcCBpZiBmaWx0ZXJzIGFyZSB0aGUgc2FtZVxuICAgICAgICBpZiAoZmlsdGVycy5ldmVyeSgoZikgPT4gdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmKSkgJiYgdGhpcy4jZmZtcGVnRmlsdGVycy5ldmVyeSgoZikgPT4gZmlsdGVycy5pbmNsdWRlcyhmKSkpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgICAgICBjb25zdCBpZ25vcmVGaWx0ZXJzID0gdGhpcy5maWx0ZXJzLnNvbWUoKGZmKSA9PiBmZiA9PT0gJ25pZ2h0Y29yZScgfHwgZmYgPT09ICd2YXBvcndhdmUnKSAmJiAhZmlsdGVycy5zb21lKChmZikgPT4gZmYgPT09ICduaWdodGNvcmUnIHx8IGZmID09PSAndmFwb3J3YXZlJyk7XG4gICAgICAgIGNvbnN0IHNlZWtUaW1lID0gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyk/LmN1cnJlbnQudmFsdWUgfHwgMDtcbiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuc2xpY2UoKTtcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IFsuLi5uZXcgU2V0KGZpbHRlcnMpXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hZi50cmlnZ2VyUmVwbGF5KHNlZWtUaW1lKS50aGVuKCh0KSA9PiB7XG4gICAgICAgICAgICBxdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb0ZpbHRlcnNVcGRhdGUsIHF1ZXVlLCBwcmV2LCB0aGlzLiNmZm1wZWdGaWx0ZXJzLnNsaWNlKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBpbnB1dCBhcmdzIGZvciBGRm1wZWdcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0SW5wdXRBcmdzKGFyZ3M6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghYXJncy5ldmVyeSgoYXJnKSA9PiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJykpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2FyZ3MnLCAnQXJyYXk8c3RyaW5nPicsICdpbnZhbGlkIGl0ZW0ocyknKTtcbiAgICAgICAgdGhpcy4jaW5wdXRBcmdzID0gYXJncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgaW5wdXQgYXJnc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaW5wdXRBcmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaW5wdXRBcmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBlbmNvZGVyIGFyZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVuY29kZXJBcmdzKCkge1xuICAgICAgICBpZiAoIXRoaXMuZmlsdGVycy5sZW5ndGgpIHJldHVybiBbXTtcblxuICAgICAgICByZXR1cm4gWyctYWYnLCB0aGlzLnRvU3RyaW5nKCldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBmaW5hbCBmZm1wZWcgYXJnc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYXJncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRBcmdzLmNvbmNhdCh0aGlzLmVuY29kZXJBcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZmZtcGVnIHN0cmVhbVxuICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIHN0cmVhbSBzb3VyY2VcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgc3RyZWFtIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlU3RyZWFtKHNvdXJjZTogc3RyaW5nIHwgUmVhZGFibGUsIG9wdGlvbnM6IEZGbXBlZ1N0cmVhbU9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRoaXMuI2lucHV0QXJncy5sZW5ndGgpIG9wdGlvbnMuZW5jb2RlckFyZ3MgPSBbLi4udGhpcy4jaW5wdXRBcmdzLCAuLi4ob3B0aW9ucy5lbmNvZGVyQXJncyB8fCBbXSldO1xuICAgICAgICByZXR1cm4gY3JlYXRlRkZtcGVnU3RyZWFtKHNvdXJjZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGZmbXBlZyBmaWx0ZXJzXG4gICAgICogQHBhcmFtIGZpbHRlcnMgVGhlIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJzW10gfCBSZWNvcmQ8RmlsdGVycywgYm9vbGVhbj4gfCBib29sZWFuKSB7XG4gICAgICAgIGxldCBfZmlsdGVyczogRmlsdGVyc1tdID0gW107XG4gICAgICAgIGlmICh0eXBlb2YgZmlsdGVycyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBfZmlsdGVycyA9ICFmaWx0ZXJzID8gW10gOiAoT2JqZWN0LmtleXMoQXVkaW9GaWx0ZXJzLmZpbHRlcnMpIGFzIEZpbHRlcnNbXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkge1xuICAgICAgICAgICAgX2ZpbHRlcnMgPSBmaWx0ZXJzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX2ZpbHRlcnMgPSBPYmplY3QuZW50cmllcyhmaWx0ZXJzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHJlcykgPT4gcmVzWzFdID09PSB0cnVlKVxuICAgICAgICAgICAgICAgIC5tYXAoKG0pID0+IG1bMF0pIGFzIEZpbHRlcnNbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLiNzZXRGaWx0ZXJzKF9maWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50bHkgYWN0aXZlIGZmbXBlZyBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZmZtcGVnRmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdKSB7XG4gICAgICAgIHRoaXMuc2V0RmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgZ2l2ZW4gZmZtcGVnIGZpbHRlcihzKVxuICAgICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBmaWx0ZXIocylcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKGZpbHRlcnM6IEZpbHRlcnNbXSB8IEZpbHRlcnMpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSBmaWx0ZXJzID0gW2ZpbHRlcnNdO1xuICAgICAgICBjb25zdCBmcmVzaDogRmlsdGVyc1tdID0gW107XG5cbiAgICAgICAgZmlsdGVycy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLmluY2x1ZGVzKGYpKSByZXR1cm47XG4gICAgICAgICAgICBmcmVzaC5wdXNoKGYpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyh0aGlzLiNmZm1wZWdGaWx0ZXJzLmZpbHRlcigocikgPT4gIWZpbHRlcnMuaW5jbHVkZXMocikpLmNvbmNhdChmcmVzaCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBkZWZhdWx0IGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gZmYgRmlsdGVycyBsaXN0XG4gICAgICovXG4gICAgcHVibGljIHNldERlZmF1bHRzKGZmOiBGaWx0ZXJzW10pIHtcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IGZmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBsaXN0IG9mIGVuYWJsZWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXJzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGxpc3Qgb2YgZGlzYWJsZWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXJzRGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb0ZpbHRlcnMubmFtZXMuZmlsdGVyKChmKSA9PiAhdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBlbmFibGVkXG4gICAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyXG4gICAgICovXG4gICAgcHVibGljIGlzRW5hYmxlZDxUIGV4dGVuZHMgRmlsdGVycz4oZmlsdGVyOiBUKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGZpbHRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBkaXNhYmxlZFxuICAgICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlclxuICAgICAqL1xuICAgIHB1YmxpYyBpc0Rpc2FibGVkPFQgZXh0ZW5kcyBGaWx0ZXJzPihmaWx0ZXI6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzRW5hYmxlZChmaWx0ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgYSB2YWxpZCBmaWx0ZXJcbiAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gdGVzdFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1ZhbGlkRmlsdGVyKGZpbHRlcjogc3RyaW5nKTogZmlsdGVyIGlzIEZpbHRlcnNOYW1lIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5oYXMoZmlsdGVyIGFzIEZpbHRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgY3VycmVudCBmaWx0ZXJzIHRvIGFycmF5XG4gICAgICovXG4gICAgcHVibGljIHRvQXJyYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcnMubWFwKChmaWx0ZXIpID0+IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBjdXJyZW50IGZpbHRlcnMgdG8gSlNPTiBvYmplY3RcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9KU09OKCkge1xuICAgICAgICBjb25zdCBvYmogPSB7fSBhcyBSZWNvcmQ8a2V5b2YgUXVldWVGaWx0ZXJzLCBzdHJpbmc+O1xuXG4gICAgICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChmaWx0ZXIpID0+IChvYmpbZmlsdGVyXSA9IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSkpO1xuXG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGN1cnJlbnQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5jcmVhdGUodGhpcy5maWx0ZXJzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUge1xuICAgIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICAgIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IG51bGw7XG4gICAgZmlsdGVyczogUENNRmlsdGVyc1tdO1xuICAgIHZvbHVtZTogbnVtYmVyO1xuICAgIHNhbXBsZVJhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgZ3JhcGggPSBuZXcgQUZpbHRlckdyYXBoPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBmZm1wZWcgPSBuZXcgRkZtcGVnRmlsdGVyZXI8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIGVxdWFsaXplclByZXNldHMgPSBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0O1xuICAgIHB1YmxpYyBfbGFzdEZpbHRlcnNDYWNoZTogR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUgPSB7XG4gICAgICAgIGJpcXVhZDogbnVsbCxcbiAgICAgICAgZXF1YWxpemVyOiBbXSxcbiAgICAgICAgZmlsdGVyczogW10sXG4gICAgICAgIHZvbHVtZTogMTAwLFxuICAgICAgICBzYW1wbGVSYXRlOiAtMVxuICAgIH07XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy52b2x1bWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHRoaXMucXVldWUub3B0aW9ucy52b2x1bWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBlbmFibGUgdGhpcyBpbiB0aGUgZnV0dXJlXG4gICAgLy8gcHVibGljIGdldCBmZm1wZWcoKTogRkZtcGVnRmlsdGVyZXI8TWV0YT4gfCBudWxsIHtcbiAgICAvLyAgICAgaWYgKHRoaXMucXVldWUucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZykge1xuICAgIC8vICAgICAgICAgaWYgKHRoaXMuI2ZmbXBlZykgdGhpcy4jZmZtcGVnID0gbnVsbDtcbiAgICAvLyAgICAgICAgIHJldHVybiBudWxsO1xuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgaWYgKCF0aGlzLiNmZm1wZWcpIHtcbiAgICAvLyAgICAgICAgIHRoaXMuI2ZmbXBlZyA9IG5ldyBGRm1wZWdGaWx0ZXJlcjxNZXRhPih0aGlzKTtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIHJldHVybiB0aGlzLiNmZm1wZWc7XG4gICAgLy8gfVxuXG4gICAgLyoqXG4gICAgICogVm9sdW1lIHRyYW5zZm9ybWVyXG4gICAgICovXG4gICAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmRzcD8udm9sdW1lIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogMTUgQmFuZCBFcXVhbGl6ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZXF1YWxpemVyIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlnaXRhbCBiaXF1YWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5iaXF1YWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEU1AgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZmlsdGVycyB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF1ZGlvIHJlc2FtcGxlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5yZXNhbXBsZXIgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYXkgY3VycmVudCB0cmFjayBpbiB0cmFuc2l0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gc2VlayBUaGUgZHVyYXRpb24gdG8gc2VlayB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB0cmlnZ2VyUmVwbGF5KHNlZWsgPSAwKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLnF1ZXVlLm5vZGUudGFza3NRdWV1ZS5hY3F1aXJlKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLm5vZGUucGxheSh0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaywge1xuICAgICAgICAgICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZWVrLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25Nb2RlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFGaWx0ZXJHcmFwaDxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYWY6IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4pIHt9XG5cbiAgICBwdWJsaWMgZ2V0IGZmbXBlZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWYuZmZtcGVnPy5maWx0ZXJzID8/IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuYWYuZXF1YWxpemVyPy5iYW5kTXVsdGlwbGllcnMgfHwgW10pLm1hcCgobSwgaSkgPT4gKHtcbiAgICAgICAgICAgIGJhbmQ6IGksXG4gICAgICAgICAgICBnYWluOiBtXG4gICAgICAgIH0pKSBhcyBFcXVhbGl6ZXJCYW5kW107XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5hZi5iaXF1YWQ/LmdldEZpbHRlck5hbWUoKSBhcyBFeGNsdWRlPEJpcXVhZEZpbHRlcnMsIG51bWJlcj4gfCBudWxsKSB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWYuZmlsdGVycz8uZmlsdGVycyB8fCBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWYudm9sdW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi5yZXNhbXBsZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGR1bXAoKTogRmlsdGVyR3JhcGgge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmZtcGVnOiB0aGlzLmZmbXBlZyxcbiAgICAgICAgICAgIGVxdWFsaXplcjogdGhpcy5lcXVhbGl6ZXIsXG4gICAgICAgICAgICBiaXF1YWQ6IHRoaXMuYmlxdWFkLFxuICAgICAgICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzLFxuICAgICAgICAgICAgc2FtcGxlUmF0ZTogdGhpcy5yZXNhbXBsZXI/LnRhcmdldFNhbXBsZVJhdGUgfHwgdGhpcy5yZXNhbXBsZXI/LnNhbXBsZVJhdGUgfHwgNDgwMDAsXG4gICAgICAgICAgICB2b2x1bWU6IHRoaXMudm9sdW1lPy52b2x1bWUgPz8gMTAwXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckdyYXBoIHtcbiAgICBmZm1wZWc6IEZpbHRlcnNbXTtcbiAgICBlcXVhbGl6ZXI6IEVxdWFsaXplckJhbmRbXTtcbiAgICBiaXF1YWQ6IEV4Y2x1ZGU8QmlxdWFkRmlsdGVycywgbnVtYmVyPiB8IG51bGw7XG4gICAgZmlsdGVyczogUENNRmlsdGVyc1tdO1xuICAgIHZvbHVtZTogbnVtYmVyO1xuICAgIHNhbXBsZVJhdGU6IG51bWJlcjtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IER1cGxleCwgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0ICogYXMgcHJpc20gZnJvbSAncHJpc20tbWVkaWEnO1xuaW1wb3J0IHsgRkZtcGVnIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRkZtcGVnU3RyZWFtT3B0aW9ucyB7XG4gICAgZm10Pzogc3RyaW5nO1xuICAgIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gICAgc2Vlaz86IG51bWJlcjtcbiAgICBza2lwPzogYm9vbGVhbjtcbiAgICBjb29raWVzPzogc3RyaW5nO1xuICAgIHVzZUxlZ2FjeUZGbXBlZz86IGJvb2xlYW47XG59XG5cbmNvbnN0IGdldEZGbXBlZ1Byb3ZpZGVyID0gKGxlZ2FjeSA9IGZhbHNlKSA9PiAobGVnYWN5ID8gKHByaXNtIGFzIHR5cGVvZiBwcmlzbSAmIHsgZGVmYXVsdDogdHlwZW9mIHByaXNtIH0pLmRlZmF1bHQ/LkZGbXBlZyB8fCBwcmlzbS5GRm1wZWcgOiBGRm1wZWcpO1xuXG5leHBvcnQgZnVuY3Rpb24gRkZNUEVHX0FSR1NfU1RSSU5HKHN0cmVhbTogc3RyaW5nLCBmbXQ/OiBzdHJpbmcsIGNvb2tpZXM/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgICAnLXJlY29ubmVjdCcsXG4gICAgICAgICcxJyxcbiAgICAgICAgJy1yZWNvbm5lY3Rfc3RyZWFtZWQnLFxuICAgICAgICAnMScsXG4gICAgICAgICctcmVjb25uZWN0X2RlbGF5X21heCcsXG4gICAgICAgICc1JyxcbiAgICAgICAgJy1pJyxcbiAgICAgICAgc3RyZWFtLFxuICAgICAgICAnLWFuYWx5emVkdXJhdGlvbicsXG4gICAgICAgICcwJyxcbiAgICAgICAgJy1sb2dsZXZlbCcsXG4gICAgICAgICcwJyxcbiAgICAgICAgJy1hcicsXG4gICAgICAgICc0ODAwMCcsXG4gICAgICAgICctYWMnLFxuICAgICAgICAnMicsXG4gICAgICAgICctZicsXG4gICAgICAgIGAke3R5cGVvZiBmbXQgPT09ICdzdHJpbmcnID8gZm10IDogJ3MxNmxlJ31gXG4gICAgXTtcblxuICAgIGlmIChmbXQgPT09ICdvcHVzJykge1xuICAgICAgICBhcmdzLnB1c2goJy1hY29kZWMnLCAnbGlib3B1cycpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29va2llcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9mZm1wZWcub3JnL2ZmbXBlZy1wcm90b2NvbHMuaHRtbCNIVFRQLUNvb2tpZXNcbiAgICAgICAgYXJncy5wdXNoKCctY29va2llcycsIGNvb2tpZXMuc3RhcnRzV2l0aCgnXCInKSA/IGNvb2tpZXMgOiBgXCIke2Nvb2tpZXN9XCJgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZGTVBFR19BUkdTX1BJUEVEKGZtdD86IHN0cmluZykge1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIGNvbnN0IGFyZ3MgPSBbXG4gICAgICAgICctYW5hbHl6ZWR1cmF0aW9uJyxcbiAgICAgICAgJzAnLFxuICAgICAgICAnLWxvZ2xldmVsJyxcbiAgICAgICAgJzAnLFxuICAgICAgICAnLWFyJyxcbiAgICAgICAgJzQ4MDAwJyxcbiAgICAgICAgJy1hYycsXG4gICAgICAgICcyJyxcbiAgICAgICAgJy1mJyxcbiAgICAgICAgYCR7dHlwZW9mIGZtdCA9PT0gJ3N0cmluZycgPyBmbXQgOiAnczE2bGUnfWAsXG4gICAgXTtcblxuICAgIGlmIChmbXQgPT09ICdvcHVzJykge1xuICAgICAgICBhcmdzLnB1c2goJy1hY29kZWMnLCAnbGlib3B1cycpO1xuICAgIH1cblxuICAgIHJldHVybiBhcmdzO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgRkZtcGVnIHN0cmVhbVxuICogQHBhcmFtIHN0cmVhbSBUaGUgc291cmNlIHN0cmVhbVxuICogQHBhcmFtIG9wdGlvbnMgRkZtcGVnIHN0cmVhbSBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGRm1wZWdTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZSB8IER1cGxleCB8IHN0cmluZywgb3B0aW9ucz86IEZGbXBlZ1N0cmVhbU9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucz8uc2tpcCAmJiB0eXBlb2Ygc3RyZWFtICE9PSAnc3RyaW5nJykgcmV0dXJuIHN0cmVhbTtcbiAgICBvcHRpb25zID8/PSB7fTtcbiAgICBjb25zdCBhcmdzID0gdHlwZW9mIHN0cmVhbSA9PT0gJ3N0cmluZycgPyBGRk1QRUdfQVJHU19TVFJJTkcoc3RyZWFtLCBvcHRpb25zLmZtdCwgb3B0aW9ucy5jb29raWVzKSA6IEZGTVBFR19BUkdTX1BJUEVEKG9wdGlvbnMuZm10KTtcblxuICAgIGlmICghTnVtYmVyLmlzTmFOKG9wdGlvbnMuc2VlaykpIGFyZ3MudW5zaGlmdCgnLXNzJywgU3RyaW5nKG9wdGlvbnMuc2VlaykpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuZW5jb2RlckFyZ3MpKSBhcmdzLnB1c2goLi4ub3B0aW9ucy5lbmNvZGVyQXJncyk7XG5cbiAgICBjb25zdCBGRk1QRUcgPSBnZXRGRm1wZWdQcm92aWRlcighIW9wdGlvbnMudXNlTGVnYWN5RkZtcGVnKTtcblxuICAgIGNvbnN0IHRyYW5zY29kZXIgPSBuZXcgRkZNUEVHKHsgc2hlbGw6IGZhbHNlLCBhcmdzIH0pO1xuXG4gICAgdHJhbnNjb2Rlci5vbignY2xvc2UnLCAoKSA9PiB0cmFuc2NvZGVyLmRlc3Ryb3koKSk7XG5cbiAgICBpZiAodHlwZW9mIHN0cmVhbSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3RyZWFtLm9uKCdlcnJvcicsICgpID0+IHRyYW5zY29kZXIuZGVzdHJveSgpKTtcbiAgICAgICAgc3RyZWFtLnBpcGUodHJhbnNjb2Rlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zY29kZXI7XG59XG4iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSB7XG4gICAgbGF0ZW5jeToge1xuICAgICAgICBldmVudExvb3A6IG51bWJlcjtcbiAgICAgICAgdm9pY2VDb25uZWN0aW9uOiBudW1iZXI7XG4gICAgfTtcbiAgICBzdGF0dXM6IHtcbiAgICAgICAgYnVmZmVyaW5nOiBib29sZWFuO1xuICAgICAgICBwbGF5aW5nOiBib29sZWFuO1xuICAgICAgICBwYXVzZWQ6IGJvb2xlYW47XG4gICAgICAgIGlkbGU6IGJvb2xlYW47XG4gICAgfTtcbiAgICB0cmFja3NDb3VudDogbnVtYmVyO1xuICAgIGhpc3RvcnlTaXplOiBudW1iZXI7XG4gICAgZXh0cmFjdG9yczogbnVtYmVyO1xuICAgIGxpc3RlbmVyczogbnVtYmVyO1xuICAgIG1lbW9yeVVzYWdlOiBOb2RlSlMuTWVtb3J5VXNhZ2U7XG4gICAgdmVyc2lvbnM6IHtcbiAgICAgICAgbm9kZTogc3RyaW5nO1xuICAgICAgICBwbGF5ZXI6IHN0cmluZztcbiAgICB9O1xufVxuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgc3RhdGlzdGljcyBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdlbmVyYXRlKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGF0ZW5jeToge1xuICAgICAgICAgICAgICAgIGV2ZW50TG9vcDogdGhpcy5xdWV1ZS5wbGF5ZXIuZXZlbnRMb29wTGFnLFxuICAgICAgICAgICAgICAgIHZvaWNlQ29ubmVjdGlvbjogdGhpcy5xdWV1ZS5waW5nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgYnVmZmVyaW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNCdWZmZXJpbmcoKSxcbiAgICAgICAgICAgICAgICBwbGF5aW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNQbGF5aW5nKCksXG4gICAgICAgICAgICAgICAgcGF1c2VkOiB0aGlzLnF1ZXVlLm5vZGUuaXNQYXVzZWQoKSxcbiAgICAgICAgICAgICAgICBpZGxlOiB0aGlzLnF1ZXVlLm5vZGUuaXNJZGxlKClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cmFja3NDb3VudDogdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSxcbiAgICAgICAgICAgIGhpc3RvcnlTaXplOiB0aGlzLnF1ZXVlLmhpc3RvcnkudHJhY2tzLnNpemUsXG4gICAgICAgICAgICBleHRyYWN0b3JzOiB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnNpemUsXG4gICAgICAgICAgICBsaXN0ZW5lcnM6IHRoaXMucXVldWUuZ3VpbGQubWVtYmVycy5tZT8udm9pY2UuY2hhbm5lbD8ubWVtYmVycy5maWx0ZXIoKG0pID0+ICFtLnVzZXIuYm90KS5zaXplIHx8IDAsXG4gICAgICAgICAgICBtZW1vcnlVc2FnZTogcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLFxuICAgICAgICAgICAgdmVyc2lvbnM6IHtcbiAgICAgICAgICAgICAgICBub2RlOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgICAgICAgICAgICAgcGxheWVyOiAnNi42LjgtZGV2LjMnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gYXMgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQbGF5ZXIgfSBmcm9tICcuLi8uLi9QbGF5ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBpbnN0YW5jZXMgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIFBsYXllcj4oKTtcbmV4cG9ydCBjb25zdCBnbG9iYWxSZWdpc3RyeSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgdW5rbm93bj4oKTtcbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi8uLi9QbGF5ZXInO1xuaW1wb3J0IHsgaW5zdGFuY2VzIH0gZnJvbSAnLi9fY29udGFpbmVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFBsYXllcihwbGF5ZXI6IFBsYXllcikge1xuICAgIGlmIChpbnN0YW5jZXMuaGFzKHBsYXllci5pZCkpIHJldHVybiB0cnVlO1xuXG4gICAgaW5zdGFuY2VzLnNldChwbGF5ZXIuaWQsIHBsYXllcik7XG5cbiAgICByZXR1cm4gaW5zdGFuY2VzLmhhcyhwbGF5ZXIuaWQpO1xufVxuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uLy4uL1BsYXllcic7XG5pbXBvcnQgeyBpbnN0YW5jZXMgfSBmcm9tICcuL19jb250YWluZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJQbGF5ZXIocGxheWVyOiBQbGF5ZXIpIHtcbiAgICByZXR1cm4gaW5zdGFuY2VzLmRlbGV0ZShwbGF5ZXIuaWQpO1xufVxuIiwgImltcG9ydCB7IGluc3RhbmNlcyB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQbGF5ZXJzKCkge1xuICAgIHJldHVybiBpbnN0YW5jZXMuYXJyYXkoKTtcbn1cbiIsICJpbXBvcnQgeyBnbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxSZWdpc3RyeSgpIHtcbiAgICByZXR1cm4gZ2xvYmFsUmVnaXN0cnk7XG59XG4iLCAiaW1wb3J0IHsgVm9pY2VDaGFubmVsLCBTdGFnZUNoYW5uZWwsIFNub3dmbGFrZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciwgam9pblZvaWNlQ2hhbm5lbCwgVm9pY2VDb25uZWN0aW9uLCBnZXRWb2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cywgQXVkaW9QbGF5ZXIgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4vU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5jbGFzcyBWb2ljZVV0aWxzIHtcbiAgICAvKipcbiAgICAgKiBWb2ljZSBjb25uZWN0aW9uIGNhY2hlIHRvIHN0b3JlIHZvaWNlIGNvbm5lY3Rpb25zIG9mIHRoZSBQbGF5ZXIgY29tcG9uZW50cy5cbiAgICAgKiBUaGlzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLlxuICAgICAqIEl0IG9ubHkgZXhpc3RzIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FjaGU6IENvbGxlY3Rpb248U25vd2ZsYWtlLCBTdHJlYW1EaXNwYXRjaGVyPiA9IG5ldyBDb2xsZWN0aW9uPFNub3dmbGFrZSwgU3RyZWFtRGlzcGF0Y2hlcj4oKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSB1dGlscyBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge31cblxuICAgIC8qKlxuICAgICAqIEpvaW5zIGEgdm9pY2UgY2hhbm5lbCwgY3JlYXRpbmcgYmFzaWMgc3RyZWFtIGRpc3BhdGNoIG1hbmFnZXJcbiAgICAgKiBAcGFyYW0ge1N0YWdlQ2hhbm5lbHxWb2ljZUNoYW5uZWx9IGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIEpvaW4gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+fVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBjb25uZWN0KFxuICAgICAgICBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgICBkZWFmPzogYm9vbGVhbjtcbiAgICAgICAgICAgIG1heFRpbWU/OiBudW1iZXI7XG4gICAgICAgICAgICBxdWV1ZTogR3VpbGRRdWV1ZTtcbiAgICAgICAgICAgIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG4gICAgICAgICAgICBncm91cD86IHN0cmluZztcbiAgICAgICAgfVxuICAgICk6IFByb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj4ge1xuICAgICAgICBpZiAoIW9wdGlvbnM/LnF1ZXVlKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19HVUlMRF9RVUVVRSgpO1xuICAgICAgICBjb25zdCBjb25uID0gYXdhaXQgdGhpcy5qb2luKGNoYW5uZWwsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBzdWIgPSBuZXcgU3RyZWFtRGlzcGF0Y2hlcihjb25uLCBjaGFubmVsLCBvcHRpb25zLnF1ZXVlLCBvcHRpb25zLm1heFRpbWUsIG9wdGlvbnMuYXVkaW9QbGF5ZXIpO1xuICAgICAgICByZXR1cm4gc3ViO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEpvaW5zIGEgdm9pY2UgY2hhbm5lbFxuICAgICAqIEBwYXJhbSB7U3RhZ2VDaGFubmVsfFZvaWNlQ2hhbm5lbH0gW2NoYW5uZWxdIFRoZSB2b2ljZS9zdGFnZSBjaGFubmVsIHRvIGpvaW5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIEpvaW4gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtWb2ljZUNvbm5lY3Rpb259XG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGpvaW4oXG4gICAgICAgIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgICAgICAgb3B0aW9ucz86IHtcbiAgICAgICAgICAgIGRlYWY/OiBib29sZWFuO1xuICAgICAgICAgICAgbWF4VGltZT86IG51bWJlcjtcbiAgICAgICAgICAgIGdyb3VwPzogc3RyaW5nO1xuICAgICAgICB9XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGNvbm4gPSBqb2luVm9pY2VDaGFubmVsKHtcbiAgICAgICAgICAgIGd1aWxkSWQ6IGNoYW5uZWwuZ3VpbGQuaWQsXG4gICAgICAgICAgICBjaGFubmVsSWQ6IGNoYW5uZWwuaWQsXG4gICAgICAgICAgICBhZGFwdGVyQ3JlYXRvcjogY2hhbm5lbC5ndWlsZC52b2ljZUFkYXB0ZXJDcmVhdG9yIGFzIHVua25vd24gYXMgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvcixcbiAgICAgICAgICAgIHNlbGZEZWFmOiBCb29sZWFuKG9wdGlvbnM/LmRlYWYpLFxuICAgICAgICAgICAgZGVidWc6IHRoaXMucGxheWVyLmV2ZW50cy5saXN0ZW5lckNvdW50KCdkZWJ1ZycpID4gMCxcbiAgICAgICAgICAgIGdyb3VwOiBvcHRpb25zPy5ncm91cFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY29ubjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0cyB2b2ljZSBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIHtWb2ljZUNvbm5lY3Rpb259IGNvbm5lY3Rpb24gVGhlIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzY29ubmVjdChjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24gfCBTdHJlYW1EaXNwYXRjaGVyKSB7XG4gICAgICAgIGlmIChjb25uZWN0aW9uIGluc3RhbmNlb2YgU3RyZWFtRGlzcGF0Y2hlcikgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24udm9pY2VDb25uZWN0aW9uO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHJldHVybiBjb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvL1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBEaXNjb3JkIFBsYXllciB2b2ljZSBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIHtTbm93Zmxha2V9IGd1aWxkIFRoZSBndWlsZCBpZFxuICAgICAqIEByZXR1cm5zIHtTdHJlYW1EaXNwYXRjaGVyfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb25uZWN0aW9uKGd1aWxkOiBTbm93Zmxha2UsIGdyb3VwPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBnZXRWb2ljZUNvbm5lY3Rpb24oZ3VpbGQsIGdyb3VwKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFZvaWNlVXRpbHMgfTtcbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi4vZmFicmljL1NlYXJjaFJlc3VsdCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDYWNoZU9wdGlvbnMge1xuICAgIGNoZWNrSW50ZXJ2YWw/OiBudW1iZXI7XG59XG5cbi8vIDVoXG5jb25zdCBERUZBVUxUX0VYUElSWV9USU1FT1VUID0gMThfMDAwXzAwMDtcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlUHJvdmlkZXI8VD4ge1xuICAgIGdldERhdGEoKTogUHJvbWlzZTxEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUPltdPjtcbiAgICBhZGREYXRhKGRhdGE6IFNlYXJjaFJlc3VsdCk6IFByb21pc2U8dm9pZD47XG4gICAgcmVzb2x2ZShjb250ZXh0OiBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0KTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xufVxuXG5leHBvcnQgY2xhc3MgUXVlcnlDYWNoZSBpbXBsZW1lbnRzIFF1ZXJ5Q2FjaGVQcm92aWRlcjxUcmFjaz4ge1xuICAgICNkZWZhdWx0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VHJhY2s+PigpO1xuICAgIHB1YmxpYyB0aW1lcjogTm9kZUpTLlRpbWVyO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHBsYXllcjogUGxheWVyLFxuICAgICAgICBwdWJsaWMgb3B0aW9uczogUXVlcnlDYWNoZU9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjaGVja0ludGVydmFsOiBERUZBVUxUX0VYUElSWV9USU1FT1VUXG4gICAgICAgIH1cbiAgICApIHtcbiAgICAgICAgdGhpcy50aW1lciA9IHNldEludGVydmFsKHRoaXMuY2xlYW51cC5iaW5kKHRoaXMpLCB0aGlzLmNoZWNrSW50ZXJ2YWwpLnVucmVmKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjaGVja0ludGVydmFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNoZWNrSW50ZXJ2YWwgPz8gREVGQVVMVF9FWFBJUllfVElNRU9VVDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2xlYW51cCgpIHtcbiAgICAgICAgZm9yIChjb25zdCBbaWQsIHZhbHVlXSBvZiB0aGlzLiNkZWZhdWx0Q2FjaGUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5oYXNFeHBpcmVkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy4jZGVmYXVsdENhY2hlLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldERhdGEoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy4jZGVmYXVsdENhY2hlLnZhbHVlcygpXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYWRkRGF0YShkYXRhOiBTZWFyY2hSZXN1bHQpIHtcbiAgICAgICAgZGF0YS50cmFja3MuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2RlZmF1bHRDYWNoZS5oYXMoZC51cmwpKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuc2V0KGQudXJsLCBuZXcgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGUoZCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVzb2x2ZShjb250ZXh0OiBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI2RlZmF1bHRDYWNoZS5nZXQoY29udGV4dC5xdWVyeSk7XG4gICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcy5wbGF5ZXIsIHtcbiAgICAgICAgICAgICAgICBxdWVyeTogY29udGV4dC5xdWVyeSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogY29udGV4dC5yZXF1ZXN0ZWRCeSxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGU6IGNvbnRleHQucXVlcnlUeXBlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLnBsYXllciwge1xuICAgICAgICAgICAgcXVlcnk6IGNvbnRleHQucXVlcnksXG4gICAgICAgICAgICB0cmFja3M6IFtyZXN1bHQuZGF0YV0sXG4gICAgICAgICAgICBwbGF5bGlzdDogbnVsbCxcbiAgICAgICAgICAgIHF1ZXJ5VHlwZTogY29udGV4dC5xdWVyeVR5cGUsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogY29udGV4dC5yZXF1ZXN0ZWRCeVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBleHBpcmVBZnRlciA9IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQ7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBkYXRhOiBULCBleHBpcmVBZnRlcjogbnVtYmVyID0gREVGQVVMVF9FWFBJUllfVElNRU9VVCkge1xuICAgICAgICBpZiAodHlwZW9mIGV4cGlyZUFmdGVyID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5leHBpcmVBZnRlciA9IERhdGUubm93KCkgKyBleHBpcmVBZnRlcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoYXNFeHBpcmVkKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZXhwaXJlQWZ0ZXIgIT09ICdudW1iZXInIHx8IGlzTmFOKHRoaXMuZXhwaXJlQWZ0ZXIpIHx8IHRoaXMuZXhwaXJlQWZ0ZXIgPCAxKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdygpIDw9IHRoaXMuZXhwaXJlQWZ0ZXI7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQge1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyO1xuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IGBleHQ6JHtzdHJpbmd9YDtcbn1cbiIsICJpbXBvcnQgeyBGRm1wZWcgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcbmltcG9ydCB7IENsaWVudCwgU25vd2ZsYWtlVXRpbCwgVm9pY2VTdGF0ZSwgSW50ZW50c0JpdEZpZWxkLCBVc2VyLCBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsIHZlcnNpb24gYXMgZGpzVmVyc2lvbiB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGxheWxpc3QsIFRyYWNrLCBTZWFyY2hSZXN1bHQgfSBmcm9tICcuL2ZhYnJpYyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlRXZlbnRzLCBWb2ljZUNvbm5lY3RDb25maWcsIEd1aWxkTm9kZUNyZWF0ZU9wdGlvbnMsIEd1aWxkTm9kZU1hbmFnZXIsIEd1aWxkUXVldWUsIFJlc291cmNlUGxheU9wdGlvbnMsIEd1aWxkUXVldWVFdmVudCB9IGZyb20gJy4vbWFuYWdlcic7XG5pbXBvcnQgeyBWb2ljZVV0aWxzIH0gZnJvbSAnLi9Wb2ljZUludGVyZmFjZS9Wb2ljZVV0aWxzJztcbmltcG9ydCB7IFBsYXllckV2ZW50cywgUXVlcnlUeXBlLCBTZWFyY2hPcHRpb25zLCBQbGF5ZXJJbml0T3B0aW9ucywgUGxheWxpc3RJbml0RGF0YSwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBRdWVyeVJlc29sdmVyLCBSZXNvbHZlZFF1ZXJ5IH0gZnJvbSAnLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEZXBlbmRlbmN5UmVwb3J0LCB2ZXJzaW9uIGFzIGRWb2ljZVZlcnNpb24gfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4vZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0JztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IgfSBmcm9tICcuL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgKiBhcyBfaW50ZXJuYWxzIGZyb20gJy4vdXRpbHMvX19pbnRlcm5hbF9fJztcbmltcG9ydCB7IFF1ZXJ5Q2FjaGUgfSBmcm9tICcuL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzRW1pdHRlciB9IGZyb20gJy4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgZGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyIH0gZnJvbSAnLi9EZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXInO1xuaW1wb3J0IHsgSVBSb3RhdG9yIH0gZnJvbSAnLi91dGlscy9JUFJvdGF0b3InO1xuaW1wb3J0IHsgQ29udGV4dCwgY3JlYXRlQ29udGV4dCB9IGZyb20gJy4vaG9va3MnO1xuaW1wb3J0IHsgSG9va3NDdHggfSBmcm9tICcuL2hvb2tzL2NvbW1vbic7XG5cbmNvbnN0IGtTaW5nbGV0b24gPSBTeW1ib2woJ0luc3RhbmNlRGlzY29yZFBsYXllclNpbmdsZXRvbicpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUID0gdW5rbm93bj4ge1xuICAgIHRyYWNrOiBUcmFjaztcbiAgICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsO1xuICAgIHNlYXJjaFJlc3VsdDogU2VhcmNoUmVzdWx0O1xuICAgIHF1ZXVlOiBHdWlsZFF1ZXVlPFQ+O1xufVxuXG5leHBvcnQgdHlwZSBUcmFja0xpa2UgPSBzdHJpbmcgfCBUcmFjayB8IFNlYXJjaFJlc3VsdCB8IFRyYWNrW10gfCBQbGF5bGlzdDtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+IGV4dGVuZHMgU2VhcmNoT3B0aW9ucyB7XG4gICAgbm9kZU9wdGlvbnM/OiBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQ+O1xuICAgIGNvbm5lY3Rpb25PcHRpb25zPzogVm9pY2VDb25uZWN0Q29uZmlnO1xuICAgIGF1ZGlvUGxheWVyT3B0aW9ucz86IFJlc291cmNlUGxheU9wdGlvbnM7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gICAgYWZ0ZXJTZWFyY2g/OiAocmVzdWx0OiBTZWFyY2hSZXN1bHQpID0+IFByb21pc2U8U2VhcmNoUmVzdWx0Pjtcbn1cblxuZXhwb3J0IHR5cGUgVm9pY2VTdGF0ZUhhbmRsZXIgPSAocGxheWVyOiBQbGF5ZXIsIHF1ZXVlOiBHdWlsZFF1ZXVlLCBvbGRWb2ljZVN0YXRlOiBWb2ljZVN0YXRlLCBuZXdWb2ljZVN0YXRlOiBWb2ljZVN0YXRlKSA9PiBBd2FpdGVkPHZvaWQ+O1xuXG5leHBvcnQgY2xhc3MgUGxheWVyIGV4dGVuZHMgUGxheWVyRXZlbnRzRW1pdHRlcjxQbGF5ZXJFdmVudHM+IHtcbiAgICAjbGFzdExhdGVuY3kgPSAtMTtcbiAgICAjdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyID0gdGhpcy5oYW5kbGVWb2ljZVN0YXRlLmJpbmQodGhpcyk7XG4gICAgI2xhZ01vbml0b3JUaW1lb3V0ITogTm9kZUpTLlRpbWVvdXQ7XG4gICAgI2xhZ01vbml0b3JJbnRlcnZhbCE6IE5vZGVKUy5UaW1lcjtcbiAgICAjb25Wb2ljZVN0YXRlVXBkYXRlOiBWb2ljZVN0YXRlSGFuZGxlciA9IGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcjtcbiAgICAjaG9va3NDdHg6IENvbnRleHQ8SG9va3NDdHg+IHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmcgPSAnNi42LjgtZGV2LjMnO1xuICAgIHB1YmxpYyBzdGF0aWMgX3NpbmdsZXRvbktleSA9IGtTaW5nbGV0b247XG4gICAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gICAgcHVibGljIHJlYWRvbmx5IGNsaWVudCE6IENsaWVudDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9ucyE6IFBsYXllckluaXRPcHRpb25zO1xuICAgIHB1YmxpYyBub2RlcyA9IG5ldyBHdWlsZE5vZGVNYW5hZ2VyKHRoaXMpO1xuICAgIHB1YmxpYyByZWFkb25seSB2b2ljZVV0aWxzID0gbmV3IFZvaWNlVXRpbHModGhpcyk7XG4gICAgcHVibGljIGV4dHJhY3RvcnMgPSBuZXcgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCh0aGlzKTtcbiAgICBwdWJsaWMgZXZlbnRzID0gbmV3IFBsYXllckV2ZW50c0VtaXR0ZXI8R3VpbGRRdWV1ZUV2ZW50cz4oWydlcnJvcicsICdwbGF5ZXJFcnJvciddKTtcbiAgICBwdWJsaWMgcm91dGVQbGFubmVyOiBJUFJvdGF0b3IgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IERpc2NvcmQgUGxheWVyXG4gICAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCBUaGUgRGlzY29yZCBDbGllbnRcbiAgICAgKiBAcGFyYW0ge1BsYXllckluaXRPcHRpb25zfSBbb3B0aW9uc10gVGhlIHBsYXllciBpbml0IG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IFBsYXllckluaXRPcHRpb25zID0ge30pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUluc3RhbmNlICYmIGtTaW5nbGV0b24gaW4gUGxheWVyKSByZXR1cm4gKDxhbnk+UGxheWVyKVtrU2luZ2xldG9uXSBhcyBQbGF5ZXI7XG5cbiAgICAgICAgc3VwZXIoWydlcnJvciddKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRpc2NvcmQuanMgY2xpZW50XG4gICAgICAgICAqIEB0eXBlIHtDbGllbnR9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcblxuICAgICAgICBjb25zdCBpYmYgPSB0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMgaW5zdGFuY2VvZiBJbnRlbnRzQml0RmllbGQgPyB0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMgOiBuZXcgSW50ZW50c0JpdEZpZWxkKHRoaXMuY2xpZW50Lm9wdGlvbnMuaW50ZW50cyk7XG5cbiAgICAgICAgaWYgKCFpYmYuaGFzKEludGVudHNCaXRGaWVsZC5GbGFncy5HdWlsZFZvaWNlU3RhdGVzKSkge1xuICAgICAgICAgICAgVXRpbC53YXJuKCdjbGllbnQgaXMgbWlzc2luZyBcIkd1aWxkVm9pY2VTdGF0ZXNcIiBpbnRlbnQnLCAnSW52YWxpZEludGVudHNCaXRGaWVsZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICAgICAgbG9ja1ZvaWNlU3RhdGVIYW5kbGVyOiBmYWxzZSxcbiAgICAgICAgICAgIGJsb2NrRXh0cmFjdG9yczogW10sXG4gICAgICAgICAgICBibG9ja1N0cmVhbUZyb206IFtdLFxuICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IDIwMDAwLFxuICAgICAgICAgICAgbGFnTW9uaXRvcjogMzAwMDAsXG4gICAgICAgICAgICBxdWVyeUNhY2hlOiBvcHRpb25zLnF1ZXJ5Q2FjaGUgPT09IG51bGwgPyBudWxsIDogb3B0aW9ucy5xdWVyeUNhY2hlIHx8IG5ldyBRdWVyeUNhY2hlKHRoaXMpLFxuICAgICAgICAgICAgdXNlTGVnYWN5RkZtcGVnOiBmYWxzZSxcbiAgICAgICAgICAgIHNraXBGRm1wZWc6IHRydWUsXG4gICAgICAgICAgICBwcm9iZVRpbWVvdXQ6IDUwMDAsXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgeXRkbE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBoaWdoV2F0ZXJNYXJrOiAxIDw8IDI1LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMueXRkbE9wdGlvbnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBQbGF5ZXJJbml0T3B0aW9ucztcblxuICAgICAgICB0aGlzLmNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIHRoaXMuI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lcik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMubGFnTW9uaXRvciA9PT0gJ251bWJlcicgJiYgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNsYWdNb25pdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNsYXN0TGF0ZW5jeSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbTGFnIE1vbml0b3JdIEV2ZW50IGxvb3AgbGF0ZW5jeTogJHt0aGlzLiNsYXN0TGF0ZW5jeX1tc2ApO1xuICAgICAgICAgICAgICAgIH0sIDApLnVucmVmKCk7XG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMubGFnTW9uaXRvcikudW5yZWYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaXBjb25maWcpIHtcbiAgICAgICAgICAgIHRoaXMucm91dGVQbGFubmVyID0gbmV3IElQUm90YXRvcih0aGlzLm9wdGlvbnMuaXBjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgX2ludGVybmFscy5hZGRQbGF5ZXIodGhpcyk7XG5cbiAgICAgICAgaWYgKCEoa1NpbmdsZXRvbiBpbiBQbGF5ZXIpKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUGxheWVyLCBrU2luZ2xldG9uLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBob29rcyBjb250ZXh0IGZvciB0aGlzIHBsYXllciBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbnRleHQoKSB7XG4gICAgICAgIGlmICghdGhpcy4jaG9va3NDdHgpIHtcbiAgICAgICAgICAgIHRoaXMuI2hvb2tzQ3R4ID0gY3JlYXRlQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuI2hvb2tzQ3R4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXJcbiAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBvblZvaWNlU3RhdGVVcGRhdGUoaGFuZGxlcjogVm9pY2VTdGF0ZUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy4jb25Wb2ljZVN0YXRlVXBkYXRlID0gaGFuZGxlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2RlYnVnJywgbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBkaXNjb3JkLXBsYXllciBzaW5nbGV0b24gaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIGNsaWVudCBUaGUgY2xpZW50IHRoYXQgaW5zdGFudGlhdGVkIHBsYXllclxuICAgICAqIEBwYXJhbSBvcHRpb25zIFBsYXllciBpbml0aWFsaXplciBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzaW5nbGV0b24oY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IE9taXQ8UGxheWVySW5pdE9wdGlvbnMsICdpZ25vcmVJbnN0YW5jZSc+ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQbGF5ZXIoY2xpZW50LCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgaWdub3JlSW5zdGFuY2U6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IGRpc2NvcmQtcGxheWVyIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBjbGllbnQgVGhlIGNsaWVudCB0aGF0IGluc3RhbnRpYXRlZCBwbGF5ZXJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBQbGF5ZXIgaW5pdGlhbGl6ZXIgb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBPbWl0PFBsYXllckluaXRPcHRpb25zLCAnaWdub3JlSW5zdGFuY2UnPiA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgUGxheWVyKGNsaWVudCwge1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIGlnbm9yZUluc3RhbmNlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgYWN0aXZlIG1hc3RlciBwbGF5ZXIgaW5zdGFuY2VzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbGxQbGF5ZXJzKCkge1xuICAgICAgICByZXR1cm4gX2ludGVybmFscy5nZXRQbGF5ZXJzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIG1hc3RlciBwbGF5ZXIgaW5zdGFuY2VzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjbGVhckFsbFBsYXllcnMoKSB7XG4gICAgICAgIHJldHVybiBfaW50ZXJuYWxzLmluc3RhbmNlcy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHF1ZXJ5IGNhY2hlIHByb3ZpZGVyIGluIHVzZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcXVlcnlDYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5xdWVyeUNhY2hlID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgdG8gYFBsYXllci5ub2Rlc2AuXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWV1ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGxvb3AgbGF0ZW5jeSBpbiBtcy4gSWYgeW91ciBib3QgaXMgbGFnZ3kgYW5kIHRoaXMgcmV0dXJucyBhIG51bWJlciBhYm92ZSAyMG1zIGZvciBleGFtcGxlLFxuICAgICAqIHNvbWUgZXhwZW5zaXZlIHRhc2sgaXMgYmVpbmcgZXhlY3V0ZWQgb24gdGhlIGN1cnJlbnQgdGhyZWFkIHdoaWNoIGlzIHNsb3dpbmcgZG93biB0aGUgZXZlbnQgbG9vcC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXZlbnRMb29wTGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbGFzdExhdGVuY3k7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHN0YXRpc3RpY3MgdGhhdCBjb3VsZCBiZSB1c2VmdWwuIFN0YXRpc3RpY3MgZ2VuZXJhdG9yIGlzIHN0aWxsIGV4cGVyaW1lbnRhbC5cbiAgICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc3RhdHMgPSBwbGF5ZXIuZ2VuZXJhdGVTdGF0aXN0aWNzKCk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhzdGF0cyk7XG4gICAgICpcbiAgICAgKiAvLyBvdXRwdXRzIHNvbWV0aGluZyBsaWtlXG4gICAgICogLy8ge1xuICAgICAqIC8vICAgaW5zdGFuY2VzOiBudW1iZXIsXG4gICAgICogLy8gICBxdWV1ZXNDb3VudDogbnVtYmVyLFxuICAgICAqIC8vICAgcXVlcnlDYWNoZUVuYWJsZWQ6IGJvb2xlYW4sXG4gICAgICogLy8gICBxdWV1ZXM6IFtcbiAgICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICAgKiAvLyAgICAgIC4uLlxuICAgICAqIC8vICAgXVxuICAgICAqIC8vIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2VuZXJhdGVTdGF0aXN0aWNzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5zdGFuY2VzOiBfaW50ZXJuYWxzLmluc3RhbmNlcy5zaXplLFxuICAgICAgICAgICAgcXVldWVzQ291bnQ6IHRoaXMucXVldWVzLmNhY2hlLnNpemUsXG4gICAgICAgICAgICBxdWVyeUNhY2hlRW5hYmxlZDogdGhpcy5xdWVyeUNhY2hlICE9IG51bGwsXG4gICAgICAgICAgICBxdWV1ZXM6IHRoaXMucXVldWVzLmNhY2hlLm1hcCgobSkgPT4gbS5zdGF0cy5nZW5lcmF0ZSgpKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgZXZlcnkgc2luZ2xlIHF1ZXVlcyBtYW5hZ2VkIGJ5IHRoaXMgbWFzdGVyIHBsYXllciBpbnN0YW5jZVxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyB1c2UgbWUgd2hlbiB5b3Ugd2FudCB0byBpbW1lZGlhdGVseSB0ZXJtaW5hdGUgZXZlcnkgc2luZ2xlIHF1ZXVlcyBpbiBleGlzdGVuY2UgXHVEODNEXHVERDJBXG4gICAgICogYXdhaXQgcGxheWVyLmRlc3Ryb3koKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5ub2Rlcy5jYWNoZS5mb3JFYWNoKChub2RlKSA9PiBub2RlLmRlbGV0ZSgpKTtcbiAgICAgICAgdGhpcy5jbGllbnQub2ZmKCd2b2ljZVN0YXRlVXBkYXRlJywgdGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5ldmVudHMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZXh0cmFjdG9ycy51bnJlZ2lzdGVyQWxsKCk7XG4gICAgICAgIGlmICh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvckludGVydmFsKTtcbiAgICAgICAgaWYgKHRoaXMuI2xhZ01vbml0b3JUaW1lb3V0KSBjbGVhckludGVydmFsKHRoaXMuI2xhZ01vbml0b3JUaW1lb3V0KTtcbiAgICAgICAgX2ludGVybmFscy5jbGVhclBsYXllcih0aGlzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkge1xuICAgICAgICBjb25zdCBxdWV1ZSA9IHRoaXMubm9kZXMuZ2V0KG9sZFN0YXRlLmd1aWxkLmlkKTtcbiAgICAgICAgaWYgKCFxdWV1ZSB8fCAhcXVldWUuY29ubmVjdGlvbiB8fCAhcXVldWUuY2hhbm5lbCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIGRpc3BhdGNoIHZvaWNlIHN0YXRlIHVwZGF0ZVxuICAgICAgICBjb25zdCB3YXNIYW5kbGVkID0gdGhpcy5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQudm9pY2VTdGF0ZVVwZGF0ZSwgcXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgICAgIC8vIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgcmV0dXJuIGFzc3VtaW5nIHRoZSBsaXN0ZW5lciBpbXBsZW1lbnRlZCBhbGwgb2YgdGhlIGxvZ2ljIGJlbG93XG4gICAgICAgIGlmICh3YXNIYW5kbGVkICYmICF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKSByZXR1cm47XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuI29uVm9pY2VTdGF0ZVVwZGF0ZSh0aGlzLCBxdWV1ZSwgb2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHZvaWNlIHN0YXRlIHVwZGF0ZVxuICAgICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBwYXNzaW5nIHZvaWNlIHN0YXRlIHVwZGF0ZSBkYXRhIHRvIHRoaXMgbWV0aG9kIHdpbGwgdHJpZ2dlciB2b2ljZSBzdGF0ZSBoYW5kbGVyXG4gICAgICpcbiAgICAgKiBjbGllbnQub24oJ3ZvaWNlU3RhdGVVcGRhdGUnLCAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICogICAvLyB0aGlzIGlzIGRlZmluaXRlbHkgYSByb2NrZXQgc2NpZW5jZSwgcmlnaHQgaGVyZVxuICAgICAqICAgcGxheWVyLmhhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvY2sgdm9pY2Ugc3RhdGUgaGFuZGxlci4gV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGRpc2NvcmQtcGxheWVyIHdpbGwga2VlcCB1c2luZyB0aGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciwgZXZlbiBpZiBjdXN0b20gaW1wbGVtZW50YXRpb24gZXhpc3RzLlxuICAgICAqL1xuICAgIHB1YmxpYyBsb2NrVm9pY2VTdGF0ZUhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVubG9jayB2b2ljZSBzdGF0ZSBoYW5kbGVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgd2lsbCBzdG9wIHVzaW5nIHRoZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBleGlzdHMuXG4gICAgICovXG4gICAgcHVibGljIHVubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHZvaWNlIHN0YXRlIGhhbmRsZXIgaXMgbG9ja2VkLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYXRlIGF1ZGlvIHBsYXllclxuICAgICAqIEBwYXJhbSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoZSBtdXNpYyBzaG91bGQgYmUgcGxheWVkXG4gICAgICogQHBhcmFtIHF1ZXJ5IFRoZSB0cmFjayBvciBzb3VyY2UgdG8gcGxheVxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHBsYXllclxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHF1ZXVlIG1hbmFnZW1lbnQsIGp1c3QgdXNlIHRoaXMgbWV0aG9kIFx1RDgzRFx1REUwNFxuICAgICAqIGNvbnN0IHF1ZXJ5ID0gJ3RoaXMgaXMgbXkgc3VwZXIgY29vbCBzZWFyY2ggcXVlcnkgdGhhdCBJIHdhbnQgdG8gcGxheSc7XG4gICAgICpcbiAgICAgKiB0cnkge1xuICAgICAqICAgIGNvbnN0IHsgdHJhY2sgfSA9IGF3YWl0IHBsYXllci5wbGF5KHZvaWNlQ2hhbm5lbCwgcXVlcnkpO1xuICAgICAqICAgY29uc29sZS5sb2coYFx1RDgzQ1x1REY4OSBJIGFtIHBsYXlpbmcgJHt0cmFjay50aXRsZX0gXHVEODNDXHVERjg5YCk7XG4gICAgICogfSBjYXRjaChlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgXHVEODNEXHVERTJEIEZhaWxlZCB0byBwbGF5IGVycm9yIG9oIG5vOlxcblxcbiR7ZX1gKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgcXVlcnk6IFRyYWNrTGlrZSwgb3B0aW9uczogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPiA9IHt9KTogUHJvbWlzZTxQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VD4+IHtcbiAgICAgICAgY29uc3QgdmMgPSB0aGlzLmNsaWVudC5jaGFubmVscy5yZXNvbHZlKGNoYW5uZWwpO1xuICAgICAgICBpZiAoIXZjPy5pc1ZvaWNlQmFzZWQoKSkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnY2hhbm5lbCcsICdWb2ljZUJhc2VkQ2hhbm5lbCcsICF2YyA/ICd1bmRlZmluZWQnIDogYGNoYW5uZWwgdHlwZSAke3ZjLnR5cGV9YCk7XG5cbiAgICAgICAgY29uc3Qgb3JpZ2luYWxSZXN1bHQgPSBxdWVyeSBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdCA/IHF1ZXJ5IDogYXdhaXQgdGhpcy5zZWFyY2gocXVlcnksIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgb3B0aW9ucy5hZnRlclNlYXJjaD8uKG9yaWdpbmFsUmVzdWx0KSkgfHwgb3JpZ2luYWxSZXN1bHQ7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoYE5vIHJlc3VsdHMgZm91bmQgZm9yIFwiJHtxdWVyeX1cIiAoRXh0cmFjdG9yOiAke3Jlc3VsdC5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVldWUgPSB0aGlzLm5vZGVzLmNyZWF0ZSh2Yy5ndWlsZCwgb3B0aW9ucy5ub2RlT3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBBY3F1aXJpbmcgYW4gZW50cnkuLi5gKTtcbiAgICAgICAgY29uc3QgZW50cnkgPSBxdWV1ZS50YXNrc1F1ZXVlLmFjcXVpcmUoeyBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0pO1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyBhY3F1aXJlZCBzdWNjZXNzZnVsbHkhYCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBXYWl0aW5nIGZvciB0aGUgcXVldWUgdG8gcmVzb2x2ZS4uLmApO1xuICAgICAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gRW50cnkgJHtlbnRyeS5pZH0gd2FzIHJlc29sdmVkIWApO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXF1ZXVlLmNoYW5uZWwpIGF3YWl0IHF1ZXVlLmNvbm5lY3QodmMsIG9wdGlvbnMuY29ubmVjdGlvbk9wdGlvbnMpO1xuXG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5wbGF5bGlzdCkge1xuICAgICAgICAgICAgICAgIHF1ZXVlLmFkZFRyYWNrKHJlc3VsdC50cmFja3NbMF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5hZGRUcmFjayhyZXN1bHQucGxheWxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFxdWV1ZS5pc1BsYXlpbmcoKSkgYXdhaXQgcXVldWUubm9kZS5wbGF5KG51bGwsIG9wdGlvbnMuYXVkaW9QbGF5ZXJPcHRpb25zKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gUmVsZWFzaW5nIGFuIGVudHJ5IGZyb20gdGhlIHF1ZXVlLi4uYCk7XG4gICAgICAgICAgICBxdWV1ZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0cmFjazogcmVzdWx0LnRyYWNrc1swXSxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogcmVzdWx0LmV4dHJhY3RvcixcbiAgICAgICAgICAgIHNlYXJjaFJlc3VsdDogcmVzdWx0LFxuICAgICAgICAgICAgcXVldWVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWFyY2ggdHJhY2tzXG4gICAgICogQHBhcmFtIHtzdHJpbmcgfCBUcmFjayB8IFRyYWNrW10gfCBQbGF5bGlzdCB8IFNlYXJjaFJlc3VsdH0gcXVlcnkgVGhlIHNlYXJjaCBxdWVyeVxuICAgICAqIEBwYXJhbSB7U2VhcmNoT3B0aW9uc30gb3B0aW9ucyBUaGUgc2VhcmNoIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZWFyY2hSZXN1bHQ+fVxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzZWFyY2hRdWVyeSA9ICdwYXNzIHVybCBvciB0ZXh0IG9yIGRpc2NvcmQtcGxheWVyIHRyYWNrIGNvbnN0cnVjdGFibGUgb2JqZWN0cywgd2UgZ290IHlvdSBjb3ZlcmVkIFx1RDgzRFx1REUwRSc7XG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgcGxheWVyLnNlYXJjaChzZWFyY2hRdWVyeSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvLyBMb2dzIGBTZWFyY2hSZXN1bHRgIG9iamVjdFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZWFyY2goc2VhcmNoUXVlcnk6IHN0cmluZyB8IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0IHwgU2VhcmNoUmVzdWx0LCBvcHRpb25zOiBTZWFyY2hPcHRpb25zID0ge30pOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgICAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQpIHJldHVybiBzZWFyY2hRdWVyeTtcblxuICAgICAgICBpZiAob3B0aW9ucy5yZXF1ZXN0ZWRCeSAhPSBudWxsKSBvcHRpb25zLnJlcXVlc3RlZEJ5ID0gdGhpcy5jbGllbnQudXNlcnMucmVzb2x2ZShvcHRpb25zLnJlcXVlc3RlZEJ5KSE7XG4gICAgICAgIG9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzID8/PSB0aGlzLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzO1xuICAgICAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICAgICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgVHJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBwbGF5bGlzdDogc2VhcmNoUXVlcnkucGxheWxpc3QgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICB0cmFja3M6IFtzZWFyY2hRdWVyeV0sXG4gICAgICAgICAgICAgICAgcXVlcnk6IHNlYXJjaFF1ZXJ5LnRpdGxlLFxuICAgICAgICAgICAgICAgIGV4dHJhY3Rvcjogc2VhcmNoUXVlcnkuZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZTogc2VhcmNoUXVlcnkucXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWFyY2hRdWVyeSBpbnN0YW5jZW9mIFBsYXlsaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IHNlYXJjaFF1ZXJ5LFxuICAgICAgICAgICAgICAgIHRyYWNrczogc2VhcmNoUXVlcnkudHJhY2tzLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiBzZWFyY2hRdWVyeS50aXRsZSxcbiAgICAgICAgICAgICAgICBleHRyYWN0b3I6IHNlYXJjaFF1ZXJ5LnRyYWNrc1swXT8uZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZTogUXVlcnlUeXBlLkFVVE8sXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VhcmNoUXVlcnkpKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFja3MgPSBzZWFyY2hRdWVyeS5maWx0ZXIoKHQpID0+IHQgaW5zdGFuY2VvZiBUcmFjayk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IG51bGwsXG4gICAgICAgICAgICAgICAgdHJhY2tzLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiAnQEAjJXt7VXNlckxvYWRlZENvbnRlbnR9fSUjQEAnLFxuICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogbnVsbCxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGU6IFF1ZXJ5VHlwZS5BVVRPLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBTZWFyY2hpbmcgJHtzZWFyY2hRdWVyeX1gKTtcblxuICAgICAgICBsZXQgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGwsXG4gICAgICAgICAgICBwcm90b2NvbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgb3B0aW9ucy5zZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPO1xuICAgICAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFNlYXJjaCBlbmdpbmUgc2V0IHRvICR7b3B0aW9ucy5zZWFyY2hFbmdpbmV9LCBmYWxsYmFjayBzZWFyY2ggZW5naW5lIHNldCB0byAke29wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmV9YCk7XG5cbiAgICAgICAgaWYgKC9eXFx3KzovLnRlc3Qoc2VhcmNoUXVlcnkpKSB7XG4gICAgICAgICAgICBjb25zdCBbcHJvdG9jb2xOYW1lLCAuLi5xdWVyeV0gPSBzZWFyY2hRdWVyeS5zcGxpdCgnOicpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFByb3RvY29sICR7cHJvdG9jb2xOYW1lfSBkZXRlY3RlZCBpbiBxdWVyeWApO1xuXG4gICAgICAgICAgICBjb25zdCBtYXRjaGluZ0V4dHJhY3RvciA9IHRoaXMuZXh0cmFjdG9ycy5zdG9yZS5maW5kKChlKSA9PiAhdGhpcy5leHRyYWN0b3JzLmlzRGlzYWJsZWQoZS5pZGVudGlmaWVyKSAmJiBlLnByb3RvY29scy5pbmNsdWRlcyhwcm90b2NvbE5hbWUpKTtcblxuICAgICAgICAgICAgaWYgKG1hdGNoaW5nRXh0cmFjdG9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFByb3RvY29sICR7cHJvdG9jb2xOYW1lfSBpcyBzdXBwb3J0ZWQgYnkgJHttYXRjaGluZ0V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IhYCk7XG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yID0gbWF0Y2hpbmdFeHRyYWN0b3I7XG4gICAgICAgICAgICAgICAgc2VhcmNoUXVlcnkgPSBxdWVyeS5qb2luKCc6Jyk7XG4gICAgICAgICAgICAgICAgcHJvdG9jb2wgPSBwcm90b2NvbE5hbWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDb3VsZCBub3QgZmluZCBhbiBleHRyYWN0b3IgdGhhdCBzdXBwb3J0cyAke3Byb3RvY29sTmFtZX0gcHJvdG9jb2wuIEZhbGxpbmcgYmFjayB0byBkZWZhdWx0IGJlaGF2aW9yLi4uYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWRpcmVjdGVkID0gYXdhaXQgUXVlcnlSZXNvbHZlci5wcmVSZXNvbHZlKHNlYXJjaFF1ZXJ5KTtcbiAgICAgICAgY29uc3QgeyB0eXBlOiBxdWVyeVR5cGUsIHF1ZXJ5IH0gPVxuICAgICAgICAgICAgb3B0aW9ucy5zZWFyY2hFbmdpbmUgPT09IFF1ZXJ5VHlwZS5BVVRPID8gUXVlcnlSZXNvbHZlci5yZXNvbHZlKHJlZGlyZWN0ZWQsIG9wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmUpIDogKHsgdHlwZTogb3B0aW9ucy5zZWFyY2hFbmdpbmUsIHF1ZXJ5OiByZWRpcmVjdGVkIH0gYXMgUmVzb2x2ZWRRdWVyeSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFF1ZXJ5IHR5cGUgaWRlbnRpZmllZCBhcyAke3F1ZXJ5VHlwZX0ke2V4dHJhY3RvciAmJiBwcm90b2NvbCA/ICcgYnV0IG1pZ2h0IG5vdCBiZSB1c2VkIGR1ZSB0byB0aGUgcHJlc2VuY2Ugb2YgcHJvdG9jb2wnIDogJyd9YCk7XG5cbiAgICAgICAgLy8gZm9yY2UgcGFydGljdWxhciBleHRyYWN0b3JcbiAgICAgICAgaWYgKG9wdGlvbnMuc2VhcmNoRW5naW5lLnN0YXJ0c1dpdGgoJ2V4dDonKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEZvcmNpbmcgJHtvcHRpb25zLnNlYXJjaEVuZ2luZS5zdWJzdHJpbmcoNCl9IGV4dHJhY3Rvci4uLmApO1xuICAgICAgICAgICAgZXh0cmFjdG9yID0gdGhpcy5leHRyYWN0b3JzLmdldChvcHRpb25zLnNlYXJjaEVuZ2luZS5zdWJzdHJpbmcoNCkpITtcbiAgICAgICAgICAgIGlmICghZXh0cmFjdG9yKVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcXVlcnkgYWxsIGV4dHJhY3RvcnNcbiAgICAgICAgaWYgKCFleHRyYWN0b3IpIHtcbiAgICAgICAgICAgIC8vIGNhY2hlIHZhbGlkYXRpb25cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDaGVja2luZyBjYWNoZS4uLmApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMucXVlcnlDYWNoZT8ucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gY2FjaGUgaGl0XG4gICAgICAgICAgICAgICAgaWYgKHJlcz8uaGFzVHJhY2tzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYENhY2hlIGhpdCBmb3IgcXVlcnkgJHtxdWVyeX1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgbWlzcyBmb3IgcXVlcnkgJHtxdWVyeX1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3JzLi4uYCk7XG5cbiAgICAgICAgICAgIC8vIGNhY2hlIG1pc3NcbiAgICAgICAgICAgIGV4dHJhY3RvciA9XG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2NrRXh0cmFjdG9ycz8uaW5jbHVkZXMoZXh0LmlkZW50aWZpZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXh0LnZhbGlkYXRlKHF1ZXJ5LCBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApPy5leHRyYWN0b3IgfHwgbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vIGV4dHJhY3RvcnMgYXZhaWxhYmxlXG4gICAgICAgIGlmICghZXh0cmFjdG9yKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRmFpbGVkIHRvIGZpbmQgYXBwcm9wcmlhdGUgZXh0cmFjdG9yJyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBFeGVjdXRpbmcgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yLi4uYCk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGV4dHJhY3RvclxuICAgICAgICAgICAgLmhhbmRsZShxdWVyeSwge1xuICAgICAgICAgICAgICAgIHR5cGU6IHF1ZXJ5VHlwZSBhcyBTZWFyY2hRdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnkgYXMgVXNlcixcbiAgICAgICAgICAgICAgICByZXF1ZXN0T3B0aW9uczogb3B0aW9ucy5yZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgICAgICBwcm90b2NvbFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKTtcblxuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnTWV0YWRhdGEgcXVlcnkgd2FzIHN1Y2Nlc3NmdWwhJyk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IHJlcy5wbGF5bGlzdCxcbiAgICAgICAgICAgICAgICB0cmFja3M6IHJlcy50cmFja3MsXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5xdWVyeUNhY2hlPy5hZGREYXRhKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRmFpbGVkIHRvIGZpbmQgcmVzdWx0IHVzaW5nIGFwcHJvcHJpYXRlIGV4dHJhY3Rvci4gUXVlcnlpbmcgYWxsIGV4dHJhY3RvcnMuLi4nKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leHRyYWN0b3JzLnJ1bihcbiAgICAgICAgICAgIGFzeW5jIChleHQpID0+XG4gICAgICAgICAgICAgICAgIW9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzPy5pbmNsdWRlcyhleHQuaWRlbnRpZmllcikgJiZcbiAgICAgICAgICAgICAgICAoYXdhaXQgZXh0LnZhbGlkYXRlKHF1ZXJ5KSkgJiZcbiAgICAgICAgICAgICAgICBleHQuaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHF1ZXJ5VHlwZSBhcyBTZWFyY2hRdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5IGFzIFVzZXIsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RPcHRpb25zOiBvcHRpb25zLnJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBwcm90b2NvbFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVzdWx0Py5yZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBGYWlsZWQgdG8gcXVlcnkgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtyZXN1bHQ/LmV4dHJhY3Rvci5pZGVudGlmaWVyIHx8ICdOL0EnfSBleHRyYWN0b3IuYCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5LFxuICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogcmVzdWx0Py5leHRyYWN0b3JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYE1ldGFkYXRhIHF1ZXJ5IHdhcyBzdWNjZXNzZnVsIHVzaW5nICR7cmVzdWx0LmV4dHJhY3Rvci5pZGVudGlmaWVyfSFgKTtcblxuICAgICAgICBjb25zdCBkYXRhID0gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHBsYXlsaXN0OiByZXN1bHQucmVzdWx0LnBsYXlsaXN0LFxuICAgICAgICAgICAgdHJhY2tzOiByZXN1bHQucmVzdWx0LnRyYWNrcyxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogcmVzdWx0LmV4dHJhY3RvcixcbiAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2FjaGU/LmFkZERhdGEoZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBgZGlzY29yZC12b2lwYCBtb2R1bGUuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zb2xlLmxvZyhwbGF5ZXIuc2NhbkRlcHMoKSk7XG4gICAgICogLy8gLT4gbG9ncyBkZXBlbmRlbmNpZXMgcmVwb3J0XG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBwdWJsaWMgc2NhbkRlcHMoKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSAnLScucmVwZWF0KDUwKTtcbiAgICAgICAgY29uc3QgcnVudGltZSA9ICdCdW4nIGluIGdsb2JhbFRoaXMgPyAnQnVuJyA6ICdEZW5vJyBpbiBnbG9iYWxUaGlzID8gJ0Rlbm8nIDogJ05vZGUnO1xuICAgICAgICBjb25zdCBkZXBzUmVwb3J0ID0gW1xuICAgICAgICAgICAgJ0Rpc2NvcmQgUGxheWVyJyxcbiAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICBgLSBkaXNjb3JkLXBsYXllcjogJHtQbGF5ZXIudmVyc2lvbn1gLFxuICAgICAgICAgICAgYC0gZGlzY29yZC12b2lwOiAke2RWb2ljZVZlcnNpb259YCxcbiAgICAgICAgICAgIGAtIGRpc2NvcmQuanM6ICR7ZGpzVmVyc2lvbn1gLFxuICAgICAgICAgICAgYC0gTm9kZSB2ZXJzaW9uOiAke3Byb2Nlc3MudmVyc2lvbn0gKERldGVjdGVkIFJ1bnRpbWU6ICR7cnVudGltZX0sIFBsYXRmb3JtOiAke3Byb2Nlc3MucGxhdGZvcm19IFske3Byb2Nlc3MuYXJjaH1dKWAsXG4gICAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudXNlTGVnYWN5RkZtcGVnKSByZXR1cm4gJy0gZmZtcGVnOiBOL0EgKHVzaW5nIGxlZ2FjeSBmZm1wZWcpJztcbiAgICAgICAgICAgICAgICBjb25zdCBpbmZvID0gRkZtcGVnLmxvY2F0ZVNhZmUoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWluZm8pIHJldHVybiAnRkZtcGVnL0F2Y29udiBub3QgZm91bmQnO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtgLSBmZm1wZWc6ICR7aW5mby52ZXJzaW9ufWAsIGAtIGNvbW1hbmQ6ICR7aW5mby5jb21tYW5kfWAsIGAtIHN0YXRpYzogJHtpbmZvLmlzU3RhdGljfWAsIGAtIGxpYm9wdXM6ICR7aW5mby5tZXRhZGF0YSEuaW5jbHVkZXMoJy0tZW5hYmxlLWxpYm9wdXMnKX1gXS5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgIH0pKCksXG4gICAgICAgICAgICAnXFxuJyxcbiAgICAgICAgICAgICdMb2FkZWQgRXh0cmFjdG9yczonLFxuICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgIHRoaXMuZXh0cmFjdG9ycy5zdG9yZVxuICAgICAgICAgICAgICAgIC5tYXAoKG0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0uaWRlbnRpZmllcjtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKSB8fCAnTi9BJyxcbiAgICAgICAgICAgICdcXG5cXG5kaXNjb3JkLXZvaXAnLFxuICAgICAgICAgICAgZ2VuZXJhdGVEZXBlbmRlbmN5UmVwb3J0KClcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gZGVwc1JlcG9ydC5qb2luKCdcXG4nKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICB5aWVsZCogdGhpcy5ub2Rlcy5jYWNoZS52YWx1ZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGBQbGF5bGlzdGAgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBpbml0aWFsaXplIGEgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlUGxheWxpc3QoZGF0YTogUGxheWxpc3RJbml0RGF0YSkge1xuICAgICAgICByZXR1cm4gbmV3IFBsYXlsaXN0KHRoaXMsIGRhdGEpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBDaGFubmVsVHlwZSwgVm9pY2VTdGF0ZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50IH0gZnJvbSAnLi9tYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4vUGxheWVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyKHBsYXllcjogUGxheWVyLCBxdWV1ZTogR3VpbGRRdWV1ZSwgb2xkU3RhdGU6IFZvaWNlU3RhdGUsIG5ld1N0YXRlOiBWb2ljZVN0YXRlKSB7XG4gICAgaWYgKCFxdWV1ZSB8fCAhcXVldWUuY29ubmVjdGlvbiB8fCAhcXVldWUuY2hhbm5lbCkgcmV0dXJuO1xuXG4gICAgaWYgKG9sZFN0YXRlLmNoYW5uZWxJZCAmJiAhbmV3U3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBxdWV1ZS5kZWxldGUoKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvKiBub29wICovXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZvaWQgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5kaXNjb25uZWN0LCBxdWV1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHF1ZXVlLm9wdGlvbnMucGF1c2VPbkVtcHR5KSB7XG4gICAgICAgIGNvbnN0IGlzRW1wdHkgPSBVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsKTtcblxuICAgICAgICBpZiAoaXNFbXB0eSkge1xuICAgICAgICAgICAgcXVldWUubm9kZS5zZXRQYXVzZWQodHJ1ZSk7XG4gICAgICAgICAgICBSZWZsZWN0LnNldChxdWV1ZSwgJ19fcGF1c2VkT25FbXB0eScsIHRydWUpO1xuICAgICAgICAgICAgaWYgKHF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICAgICAgICAgICAgcXVldWUuZGVidWcoJ1ZvaWNlIGNoYW5uZWwgaXMgZW1wdHkgYW5kIG9wdGlvbnMjcGF1c2VPbkVtcHR5IGlzIHRydWUsIHBhdXNpbmcuLi4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChSZWZsZWN0LmdldChxdWV1ZSwgJ19fcGF1c2VkT25FbXB0eScpKSB7XG4gICAgICAgICAgICAgICAgcXVldWUubm9kZS5zZXRQYXVzZWQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIFJlZmxlY3Quc2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JywgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZS5kZWJ1ZygnVm9pY2UgY2hhbm5lbCBpcyBub3QgZW1wdHkgYW5kIG9wdGlvbnMjcGF1c2VPbkVtcHR5IGlzIHRydWUsIHJlc3VtaW5nLi4uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFvbGRTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkKSB7XG4gICAgICAgIGlmIChuZXdTdGF0ZS5zZXJ2ZXJNdXRlICE9IG51bGwgJiYgb2xkU3RhdGUuc2VydmVyTXV0ZSAhPT0gbmV3U3RhdGUuc2VydmVyTXV0ZSkge1xuICAgICAgICAgICAgcXVldWUubm9kZS5zZXRQYXVzZWQobmV3U3RhdGUuc2VydmVyTXV0ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUuY2hhbm5lbD8udHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlICYmIG5ld1N0YXRlLnN1cHByZXNzICE9IG51bGwgJiYgb2xkU3RhdGUuc3VwcHJlc3MgIT09IG5ld1N0YXRlLnN1cHByZXNzKSB7XG4gICAgICAgICAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZChuZXdTdGF0ZS5zdXBwcmVzcyk7XG4gICAgICAgICAgICBpZiAobmV3U3RhdGUuc3VwcHJlc3MpIHtcbiAgICAgICAgICAgICAgICBuZXdTdGF0ZS5ndWlsZC5tZW1iZXJzLm1lPy52b2ljZS5zZXRSZXF1ZXN0VG9TcGVhayh0cnVlKS5jYXRjaChVdGlsLm5vb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFuZXdTdGF0ZS5jaGFubmVsSWQgJiYgb2xkU3RhdGUuY2hhbm5lbElkID09PSBxdWV1ZS5jaGFubmVsLmlkKSB7XG4gICAgICAgIGlmICghVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISkpIHJldHVybjtcbiAgICAgICAgICAgIGlmICghcGxheWVyLm5vZGVzLmhhcyhxdWV1ZS5ndWlsZC5pZCkpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eSkgcXVldWUuZGVsZXRlKCk7XG4gICAgICAgICAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVtcHR5Q2hhbm5lbCwgcXVldWUpO1xuICAgICAgICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gICAgICAgIHF1ZXVlLnRpbWVvdXRzLnNldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gLCB0aW1lb3V0KTtcbiAgICB9XG5cbiAgICBpZiAobmV3U3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLmNoYW5uZWxJZCA9PT0gcXVldWUuY2hhbm5lbC5pZCkge1xuICAgICAgICBjb25zdCBlbXB0eVRpbWVvdXQgPSBxdWV1ZS50aW1lb3V0cy5nZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgIGNvbnN0IGNoYW5uZWxFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpO1xuICAgICAgICBpZiAoIWNoYW5uZWxFbXB0eSAmJiBlbXB0eVRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChlbXB0eVRpbWVvdXQpO1xuICAgICAgICAgICAgcXVldWUudGltZW91dHMuZGVsZXRlKGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5jaGFubmVsUG9wdWxhdGUsIHF1ZXVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvbGRTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUuY2hhbm5lbElkICYmIG9sZFN0YXRlLmNoYW5uZWxJZCAhPT0gbmV3U3RhdGUuY2hhbm5lbElkKSB7XG4gICAgICAgIGlmIChuZXdTdGF0ZS5tZW1iZXI/LmlkID09PSBuZXdTdGF0ZS5ndWlsZC5tZW1iZXJzLm1lPy5pZCkge1xuICAgICAgICAgICAgaWYgKHF1ZXVlLmNvbm5lY3Rpb24gJiYgbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHF1ZXVlLmNoYW5uZWwgPSBuZXdTdGF0ZS5jaGFubmVsITtcbiAgICAgICAgICAgIGNvbnN0IGVtcHR5VGltZW91dCA9IHF1ZXVlLnRpbWVvdXRzLmdldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKTtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpO1xuICAgICAgICAgICAgaWYgKCFjaGFubmVsRW1wdHkgJiYgZW1wdHlUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVtcHR5VGltZW91dCk7XG4gICAgICAgICAgICAgICAgcXVldWUudGltZW91dHMuZGVsZXRlKGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuY2hhbm5lbFBvcHVsYXRlLCBxdWV1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmNvbm5lY3Rpb24gJiYgIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXllci5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eSkgcXVldWUuZGVsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZW1wdHlDaGFubmVsLCBxdWV1ZSk7XG4gICAgICAgICAgICAgICAgfSwgcXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93biB8fCAwKS51bnJlZigpO1xuICAgICAgICAgICAgICAgIHF1ZXVlLnRpbWVvdXRzLnNldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5jaGFubmVsSWQgIT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFubmVsRW1wdHkgPSBVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISk7XG4gICAgICAgICAgICAgICAgaWYgKCFjaGFubmVsRW1wdHkpIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAocXVldWUudGltZW91dHMuaGFzKGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApKSByZXR1cm47XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXllci5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eSkgcXVldWUuZGVsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZW1wdHlDaGFubmVsLCBxdWV1ZSk7XG4gICAgICAgICAgICAgICAgfSwgcXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93biB8fCAwKS51bnJlZigpO1xuICAgICAgICAgICAgICAgIHF1ZXVlLnRpbWVvdXRzLnNldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW1wdHlUaW1lb3V0ID0gcXVldWUudGltZW91dHMuZ2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5uZWxFbXB0eSAmJiBlbXB0eVRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVtcHR5VGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLnRpbWVvdXRzLmRlbGV0ZShgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5jaGFubmVsUG9wdWxhdGUsIHF1ZXVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IGlwIGZyb20gJ2lwJztcblxuZXhwb3J0IGNsYXNzIElQQmxvY2sge1xuICAgIHB1YmxpYyB1c2FnZSA9IDA7XG4gICAgcHVibGljIHJlYWRvbmx5IGNpZHI6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2lkclNpemU6IG51bWJlcjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYmxvY2s6IHN0cmluZykge1xuICAgICAgICBpZiAoaXAuaXNWNEZvcm1hdChibG9jay5zcGxpdCgnLycpWzBdKSAmJiAhYmxvY2suaW5jbHVkZXMoJy8nKSkge1xuICAgICAgICAgICAgYmxvY2sgKz0gJy8zMic7XG4gICAgICAgIH0gZWxzZSBpZiAoaXAuaXNWNkZvcm1hdChibG9jay5zcGxpdCgnLycpWzBdKSAmJiAhYmxvY2suaW5jbHVkZXMoJy8nKSkge1xuICAgICAgICAgICAgYmxvY2sgKz0gJy8xMjgnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaWRyID0gaXAuY2lkcih0aGlzLmJsb2NrKTtcbiAgICAgICAgdGhpcy5jaWRyU2l6ZSA9IGlwLmNpZHJTdWJuZXQodGhpcy5ibG9jaykuc3VibmV0TWFza0xlbmd0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29uc3VtZSgpIHtcbiAgICAgICAgdGhpcy51c2FnZSsrO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUFJvdGF0aW9uQ29uZmlnIHtcbiAgICAvKipcbiAgICAgKiBJUCBibG9ja3MgdG8gdXNlXG4gICAgICovXG4gICAgYmxvY2tzOiBzdHJpbmdbXTtcbiAgICAvKipcbiAgICAgKiBJUHMgdG8gZXhjbHVkZVxuICAgICAqL1xuICAgIGV4Y2x1ZGU/OiBzdHJpbmdbXTtcbiAgICAvKipcbiAgICAgKiBNYXggcmV0cmllcyB0byBmaW5kIGFuIElQIHRoYXQgaXMgbm90IGV4Y2x1ZGVkXG4gICAgICovXG4gICAgbWF4UmV0cmllcz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIElQUm90YXRvciB7XG4gICAgcHVibGljIGJsb2NrczogSVBCbG9ja1tdID0gW107XG4gICAgcHVibGljIGZhaWx1cmVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBwdWJsaWMgTUFYX05FWFRfUkVUUklFUyA9IDMwO1xuICAgICNyZXRyaWVzID0gMDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgY29uZmlnOiBJUFJvdGF0aW9uQ29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5leGNsdWRlID8/PSBbXTtcbiAgICAgICAgdGhpcy5ibG9ja3MgPSBjb25maWcuYmxvY2tzLm1hcCgoYmxvY2spID0+IG5ldyBJUEJsb2NrKGJsb2NrKSk7XG4gICAgICAgIHRoaXMuTUFYX05FWFRfUkVUUklFUyA9IGNvbmZpZy5tYXhSZXRyaWVzID8/IDEwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJUCgpOiB7IGlwOiBzdHJpbmc7IGZhbWlseTogNCB8IDYgfSB7XG4gICAgICAgIGNvbnN0IGJsb2NrID0gdGhpcy5ibG9ja3Muc29ydCgoYSwgYikgPT4gYS51c2FnZSAtIGIudXNhZ2UpWzBdO1xuICAgICAgICBpZiAoIWJsb2NrKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIElQIGJsb2NrcyBhdmFpbGFibGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJhbmRvbSA9IElQUm90YXRvci5nZXRSYW5kb21JUChibG9jay5jaWRyLCBibG9jay5jaWRyU2l6ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNGYWlsZWRPckV4Y2x1ZGVkKHJhbmRvbSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNyZXRyaWVzKysgPiB0aGlzLk1BWF9ORVhUX1JFVFJJRVMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNyZXRyaWVzID0gMDtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIGFuIElQIHRoYXQgaXMgbm90IGV4Y2x1ZGVkJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldElQKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLiNyZXRyaWVzID0gMDtcbiAgICAgICAgYmxvY2suY29uc3VtZSgpO1xuICAgICAgICByZXR1cm4geyBpcDogcmFuZG9tLCBmYW1pbHk6IGlwLmlzVjRGb3JtYXQocmFuZG9tKSA/IDQgOiA2IH07XG4gICAgfVxuXG4gICAgcHVibGljIGlzRmFpbGVkT3JFeGNsdWRlZChpcDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZhaWx1cmVzLmhhcyhpcCkgfHwgISF0aGlzLmNvbmZpZy5leGNsdWRlPy5pbmNsdWRlcyhpcCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZhaWxlZChpcDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGxhc3RGYWlsZWRDb3VudCA9IHRoaXMuZmFpbHVyZXMuZ2V0KGlwKSA/PyAwO1xuXG4gICAgICAgIHRoaXMuZmFpbHVyZXMuc2V0KGlwLCBsYXN0RmFpbGVkQ291bnQgKyAxKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFJhbmRvbUlQKGFkZHJlc3M6IHN0cmluZywgc3RhcnQ/OiBudW1iZXIsIGVuZD86IG51bWJlcikge1xuICAgICAgICAvLyBBdXRob3I6IEplc3NlIFRhbmUgPGplc3NlLnRhbmVAZ21haWwuY29tPlxuICAgICAgICAvLyBOUE1KUzogaHR0cHM6Ly9ucG1qcy5vcmcvcmFuZG9tLWlwXG5cbiAgICAgICAgY29uc3QgYnl0ZXMgPSBpcC50b0J1ZmZlcihhZGRyZXNzKTtcbiAgICAgICAgY29uc3QgaXB2NiA9IGJ5dGVzLmxlbmd0aCA9PT0gMTY7XG4gICAgICAgIGNvbnN0IGJ5dGVzaXplID0gODtcblxuICAgICAgICBzdGFydCA9IHN0YXJ0IHx8IDA7XG4gICAgICAgIGVuZCA9IHR5cGVvZiBlbmQgIT09ICd1bmRlZmluZWQnID8gZW5kIDogYnl0ZXMubGVuZ3RoICogYnl0ZXNpemU7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGJpdCA9IGkgKiBieXRlc2l6ZTtcblxuICAgICAgICAgICAgaWYgKGJpdCArIGJ5dGVzaXplIDwgc3RhcnQgfHwgYml0ID49IGVuZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgYiA9IGJ5dGVzW2ldO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGJ5dGVzaXplOyBuKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoYml0ID49IHN0YXJ0ICYmIGJpdCA8IGVuZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiaXRwb3MgPSBieXRlc2l6ZSAtIG4gLSAxO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiaXRtYXNrID0gMSA8PCBiaXRwb3M7XG4gICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLnJhbmRvbSgpIDwgMC41KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiIHw9IGJpdG1hc2s7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiICY9IH5iaXRtYXNrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJpdCsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBieXRlc1tpXSA9IGI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ZXRzID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGlwdjYpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSAlIDIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGV0c1tpID4+IDFdID0gKChieXRlc1tpXSA8PCBieXRlc2l6ZSkgfCBieXRlc1tpICsgMV0pLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRldHNbaV0gPSBieXRlc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0ZXRzLmpvaW4oaXB2NiA/ICc6JyA6ICcuJyk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEFzeW5jTG9jYWxTdG9yYWdlIH0gZnJvbSAnbm9kZTphc3luY19ob29rcyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG50eXBlIHVuc2FmZSA9IGFueTtcblxuLyoqXG4gKiBUaGUgcmVjZWl2ZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBjb250ZXh0IGlzIHByb3ZpZGVkXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHRSZWNlaXZlcjxSPiA9ICgpID0+IFI7XG5cbmV4cG9ydCBjbGFzcyBDb250ZXh0PFQ+IHtcbiAgICBwcml2YXRlIHN0b3JhZ2UgPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8VD4oKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGRlZmF1bHRWYWx1ZT86IFQpIHt9XG5cbiAgICAvKipcbiAgICAgKiBFeGl0IG91dCBvZiB0aGlzIGNvbnRleHRcbiAgICAgKi9cbiAgICBwdWJsaWMgZXhpdChzY29wZTogQ29udGV4dFJlY2VpdmVyPHZvaWQ+KSB7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5leGl0KHNjb3BlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBjb250ZXh0IGlzIGxvc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzTG9zdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXRTdG9yZSgpID09PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBsb3N0IGFuZCBubyBkZWZhdWx0IHZhbHVlIGlzIHByb3ZpZGVkLCB1bmRlZmluZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3VtZSgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc3RvcmFnZS5nZXRTdG9yZSgpO1xuXG4gICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQgJiYgdGhpcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlO1xuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1biBhIGZ1bmN0aW9uIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGlzIHByb3ZpZGVyXG4gICAgICovXG4gICAgcHVibGljIHByb3ZpZGU8UiA9IHVuc2FmZT4odmFsdWU6IFQsIHJlY2VpdmVyOiBDb250ZXh0UmVjZWl2ZXI8Uj4pOiBSIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29udGV4dCB2YWx1ZSBtYXkgbm90IGJlIHVuZGVmaW5lZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZWNlaXZlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IHJlY2VpdmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5ydW4odmFsdWUsIHJlY2VpdmVyKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGNvbnRleHQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG9wdGlvbmFsLlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29udGV4dFxuICogQGV4YW1wbGUgY29uc3QgdXNlckNvbnRleHQgPSBjcmVhdGVDb250ZXh0KCk7XG4gKlxuICogIC8vIHRoZSB2YWx1ZSB0byBwcm92aWRlXG4gKiAgY29uc3QgdXNlciA9IHtcbiAqICAgaWQ6IDEsXG4gKiAgIG5hbWU6ICdKb2huIERvZSdcbiAqICB9O1xuICpcbiAqICAvLyBwcm92aWRlIHRoZSBjb250ZXh0IHZhbHVlIHRvIHRoZSByZWNlaXZlclxuICogIGNvbnRleHQucHJvdmlkZSh1c2VyLCBoYW5kbGVyKTtcbiAqXG4gKiAgZnVuY3Rpb24gaGFuZGxlcigpIHtcbiAqICAgIC8vIGdldCB0aGUgY29udGV4dCB2YWx1ZVxuICogICAgY29uc3QgeyBpZCwgbmFtZSB9ID0gdXNlQ29udGV4dChjb250ZXh0KTtcbiAqXG4gKiAgICBjb25zb2xlLmxvZyhpZCwgbmFtZSk7IC8vIDEsIEpvaG4gRG9lXG4gKiAgfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29udGV4dDxUID0gdW5zYWZlPihkZWZhdWx0VmFsdWU/OiBUKTogQ29udGV4dDxUPiB7XG4gICAgcmV0dXJuIG5ldyBDb250ZXh0KGRlZmF1bHRWYWx1ZSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBsb3N0IGFuZCBubyBkZWZhdWx0IHZhbHVlIGlzIHByb3ZpZGVkLCB1bmRlZmluZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGdldCB0aGUgdmFsdWUgZnJvbVxuICogQGV4YW1wbGUgY29uc3QgdmFsdWUgPSB1c2VDb250ZXh0KGNvbnRleHQpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29udGV4dDxUID0gdW5zYWZlPihjb250ZXh0OiBDb250ZXh0PFQ+KTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGNvbnRleHQuY29uc3VtZSgpO1xufVxuIiwgImltcG9ydCB7IEd1aWxkIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgaW5zdGFuY2VzIH0gZnJvbSAnLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJy4vY29udGV4dC9hc3luYy1jb250ZXh0JztcblxuY29uc3QgcHJlZmVycmVkSW5zdGFuY2VLZXkgPSAnX19kaXNjb3JkX3BsYXllcl9ob29rX2luc3RhbmNlX2NhY2hlX18nO1xuXG5leHBvcnQgY29uc3QgZ2V0UGxheWVyID0gKCkgPT4ge1xuICAgIHJldHVybiBpbnN0YW5jZXMuZ2V0KHByZWZlcnJlZEluc3RhbmNlS2V5KSB8fCBpbnN0YW5jZXMuZmlyc3QoKSB8fCBudWxsO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBIb29rc0N0eCB7XG4gICAgZ3VpbGQ6IEd1aWxkO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VIb29rc0NvbnRleHQoaG9va05hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHBsYXllciA9IGdldFBsYXllcigpO1xuICAgIGlmICghcGxheWVyKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTignZGlzY29yZC1wbGF5ZXInLCAnUGxheWVyIGluc3RhbmNlIG11c3QgYmUgY3JlYXRlZCBiZWZvcmUgdXNpbmcgaG9va3MnKTtcblxuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KHBsYXllci5jb250ZXh0KTtcblxuICAgIGlmICghY29udGV4dCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSUxMRUdBTF9IT09LX0lOVk9DQVRJT04oaG9va05hbWUsIGAke2hvb2tOYW1lfSBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgYSBwbGF5ZXIgY29udGV4dCBjcmVhdGVkIGJ5IDxQbGF5ZXI+LmNvbnRleHQucHJvdmlkZSgpYCk7XG5cbiAgICByZXR1cm4gY29udGV4dDtcbn1cblxuLyoqXG4gKiBCaW5kIGEgcGxheWVyIGluc3RhbmNlIHRvIHRoZSBob29rIHN5c3RlbSwgZGVmYXVsdHMgdG8gdGhlIGZpcnN0IGluc3RhbmNlLlxuICovXG5leHBvcnQgY29uc3QgYmluZEhvb2sgPSAocGxheWVyOiBQbGF5ZXIpID0+IHtcbiAgICBpbnN0YW5jZXMuc2V0KHByZWZlcnJlZEluc3RhbmNlS2V5LCBwbGF5ZXIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFF1ZXVlID0gPFQgPSB1bmtub3duPihub2RlOiBOb2RlUmVzb2x2YWJsZSkgPT4ge1xuICAgIGNvbnN0IHBsYXllciA9IGdldFBsYXllcigpO1xuICAgIGlmICghcGxheWVyKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiAocGxheWVyLm5vZGVzLnJlc29sdmUobm9kZSkgYXMgR3VpbGRRdWV1ZTxUPikgfHwgbnVsbDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG9va0RlY2xhcmF0aW9uQ29udGV4dCB7XG4gICAgZ2V0UXVldWU6IHR5cGVvZiBnZXRRdWV1ZTtcbiAgICBnZXRQbGF5ZXI6IHR5cGVvZiBnZXRQbGF5ZXI7XG4gICAgaW5zdGFuY2VzOiB0eXBlb2YgaW5zdGFuY2VzO1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5leHBvcnQgdHlwZSBIb29rRGVjbGFyYXRpb248VCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55PiA9IChjb250ZXh0OiBIb29rRGVjbGFyYXRpb25Db250ZXh0KSA9PiBUO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSG9vazxUIGV4dGVuZHMgSG9va0RlY2xhcmF0aW9uPCguLi5hcmdzOiBhbnlbXSkgPT4gYW55Pj4oaG9vazogVCk6IFJldHVyblR5cGU8VD4ge1xuICAgIHJldHVybiBob29rKHtcbiAgICAgICAgZ2V0UXVldWUsXG4gICAgICAgIGdldFBsYXllcixcbiAgICAgICAgaW5zdGFuY2VzXG4gICAgfSkgYXMgUmV0dXJuVHlwZTxUPjtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZUhpc3RvcnksIE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRRdWV1ZSwgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIGd1aWxkIHF1ZXVlIGhpc3RvcnlcbiAqIEBwYXJhbSBub2RlIGd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSGlzdG9yeTxNZXRhID0gdW5rbm93bj4oKTogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+KG5vZGU/OiBOb2RlUmVzb2x2YWJsZSk6IEd1aWxkUXVldWVIaXN0b3J5PE1ldGE+IHwgbnVsbCB7XG4gICAgY29uc3QgX25vZGUgPSBub2RlID8/IHVzZUhvb2tzQ29udGV4dCgndXNlSGlzdG9yeScpLmd1aWxkO1xuXG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxNZXRhPihfbm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gcXVldWUuaGlzdG9yeTtcbn1cbiIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlUGxheWVyTm9kZSwgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IGdldFF1ZXVlLCB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWUgcGxheWVyIG5vZGVcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUGxheWVyPE1ldGEgPSB1bmtub3duPigpOiBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlUGxheWVyPE1ldGEgPSB1bmtub3duPihub2RlOiBOb2RlUmVzb2x2YWJsZSk6IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KG5vZGU/OiBOb2RlUmVzb2x2YWJsZSk6IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbCB7XG4gICAgY29uc3QgX25vZGUgPSBub2RlID8/IHVzZUhvb2tzQ29udGV4dCgndXNlUGxheWVyJykuZ3VpbGQ7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxNZXRhPihfbm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gcXVldWUubm9kZTtcbn1cbiIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0UXVldWUsIHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWV1ZTxNZXRhID0gdW5rbm93bj4oKTogR3VpbGRRdWV1ZTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogR3VpbGRRdWV1ZTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KG5vZGU/OiBOb2RlUmVzb2x2YWJsZSk6IEd1aWxkUXVldWU8TWV0YT4gfCBudWxsIHtcbiAgICBjb25zdCBfbm9kZSA9IG5vZGUgPz8gdXNlSG9va3NDb250ZXh0KCd1c2VRdWV1ZScpLmd1aWxkO1xuICAgIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWU8TWV0YT4oX25vZGUpO1xuICAgIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHF1ZXVlO1xufVxuIiwgImltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgZ2V0UGxheWVyIH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIG1haW4gcGxheWVyIGluc3RhbmNlXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTWFzdGVyUGxheWVyKCkge1xuICAgIFV0aWwud2FybigndXNlTWFzdGVyUGxheWVyKCkgaG9vayBpcyBkZXByZWNhdGVkLCB1c2UgdXNlTWFpblBsYXllcigpIGluc3RlYWQuJywgJ0RlcHJlY2F0aW9uV2FybmluZycpO1xuICAgIHJldHVybiB1c2VNYWluUGxheWVyKCk7XG59XG5cbi8qKlxuICogRmV0Y2ggbWFpbiBwbGF5ZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1haW5QbGF5ZXIoKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRQbGF5ZXIoKTtcbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lMTEVHQUxfSE9PS19JTlZPQ0FUSU9OKCd1c2VNYWluUGxheWVyJywgJ1RoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSBjYWxsaW5nIFwidXNlTWFpblBsYXllclwiIGhvb2sgYmVmb3JlIGNyZWF0aW5nIGEgcGxheWVyIGluc3RhbmNlLicpO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZTtcbn1cbiIsICJpbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRRdWV1ZSwgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgdHlwZSBTZXR0ZXJGTjxULCBQPiA9IChwcmV2aW91czogUCkgPT4gVDtcbmV4cG9ydCB0eXBlIE1ldGFkYXRhRGlzcGF0Y2g8VD4gPSByZWFkb25seSBbKCkgPT4gVCwgKG1ldGFkYXRhOiBUIHwgU2V0dGVyRk48VCwgVD4pID0+IHZvaWRdO1xuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgZ3VpbGQgcXVldWUgbWV0YWRhdGFcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KCk6IE1ldGFkYXRhRGlzcGF0Y2g8VD47XG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogTWV0YWRhdGFEaXNwYXRjaDxUPjtcbmV4cG9ydCBmdW5jdGlvbiB1c2VNZXRhZGF0YTxUID0gdW5rbm93bj4obm9kZT86IE5vZGVSZXNvbHZhYmxlKTogTWV0YWRhdGFEaXNwYXRjaDxUPiB7XG4gICAgY29uc3QgX25vZGUgPSBub2RlID8/IHVzZUhvb2tzQ29udGV4dCgndXNlTWV0YWRhdGEnKS5ndWlsZDtcbiAgICBjb25zdCBxdWV1ZSA9IGdldFF1ZXVlPFQ+KF9ub2RlKTtcbiAgICBjb25zdCBzZXR0ZXIgPSAobWV0YWRhdGE6IFQgfCBTZXR0ZXJGTjxULCBUPikgPT4ge1xuICAgICAgICBpZiAocXVldWUpIHtcbiAgICAgICAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG1ldGFkYXRhKSkgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKHF1ZXVlLm1ldGFkYXRhKSk7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUuc2V0TWV0YWRhdGEobWV0YWRhdGEpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGdldHRlciA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHF1ZXVlPy5tZXRhZGF0YSBhcyBUO1xuICAgIH07XG5cbiAgICByZXR1cm4gW2dldHRlciwgc2V0dGVyXSBhcyBjb25zdDtcbn1cbiIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0UXVldWUsIHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zIHtcbiAgICBpZ25vcmVGaWx0ZXJzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgY3VycmVudCB0cmFja1xuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aW1lbGluZSBkaXNwYXRjaGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lbGluZShub2RlPzogTm9kZVJlc29sdmFibGUsIG9wdGlvbnM/OiBQYXJ0aWFsPFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnM+KSB7XG4gICAgY29uc3QgX25vZGUgPSBub2RlID8/IHVzZUhvb2tzQ29udGV4dCgndXNlVGltZWxpbmUnKS5ndWlsZDtcbiAgICBjb25zdCBxdWV1ZSA9IGdldFF1ZXVlKF9ub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe1xuICAgICAgICBnZXQgdGltZXN0YW1wKCkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuZ2V0VGltZXN0YW1wKG9wdGlvbnM/Lmlnbm9yZUZpbHRlcnMpITtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnZvbHVtZTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHBhdXNlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLmlzUGF1c2VkKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCB0cmFjaygpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5jdXJyZW50VHJhY2s7XG4gICAgICAgIH0sXG4gICAgICAgIHBhdXNlKCkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUucGF1c2UoKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzdW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUucmVzdW1lKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldFZvbHVtZSh2b2w6IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2V0Vm9sdW1lKHZvbCk7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIHNldFBvc2l0aW9uKHRpbWU6IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2Vlayh0aW1lKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwgImltcG9ydCB7IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyIH0gZnJvbSAnLi4vLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbi8qKlxuICogR2xvYmFsIG9uQWZ0ZXJDcmVhdGVTdHJlYW0gaGFuZGxlclxuICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQWZ0ZXJDcmVhdGVTdHJlYW0oaGFuZGxlcjogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIpIHtcbiAgICBnZXRHbG9iYWxSZWdpc3RyeSgpLnNldCgnQFtvbkFmdGVyQ3JlYXRlU3RyZWFtXScsIGhhbmRsZXIpO1xufVxuIiwgImltcG9ydCB7IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4uLy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi8uLi91dGlscy9fX2ludGVybmFsX18nO1xuXG4vKipcbiAqIEdsb2JhbCBvbkJlZm9yZUNyZWF0ZVN0cmVhbSBoYW5kbGVyXG4gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25CZWZvcmVDcmVhdGVTdHJlYW0oaGFuZGxlcjogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyKSB7XG4gICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0Bbb25CZWZvcmVDcmVhdGVTdHJlYW1dJywgaGFuZGxlcik7XG59XG4iLCAiaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0UXVldWUsIHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxudHlwZSBTZXR0ZXJGTiA9IChwcmV2aW91czogbnVtYmVyKSA9PiBudW1iZXI7XG50eXBlIFZvbHVtZURpc3BhdGNoID0gcmVhZG9ubHkgWygpID0+IG51bWJlciwgKHZvbHVtZTogbnVtYmVyIHwgU2V0dGVyRk4pID0+IGJvb2xlYW4gfCB1bmRlZmluZWRdO1xuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgcGxheWVyIHZvbHVtZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VWb2x1bWUoKTogVm9sdW1lRGlzcGF0Y2g7XG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogVm9sdW1lRGlzcGF0Y2g7XG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKG5vZGU/OiBOb2RlUmVzb2x2YWJsZSk6IFZvbHVtZURpc3BhdGNoIHtcbiAgICBjb25zdCBfbm9kZSA9IG5vZGUgPz8gdXNlSG9va3NDb250ZXh0KCd1c2VWb2x1bWUnKS5ndWlsZDtcbiAgICBjb25zdCBxdWV1ZSA9IGdldFF1ZXVlKF9ub2RlKTtcbiAgICBjb25zdCBzZXR0ZXIgPSAodm9sdW1lOiBudW1iZXIgfCBTZXR0ZXJGTikgPT4ge1xuICAgICAgICBpZiAocXVldWUpIHtcbiAgICAgICAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKHZvbHVtZSkpIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2x1bWUocXVldWUubm9kZS52b2x1bWUpKTtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2x1bWUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGdldHRlciA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHF1ZXVlPy5ub2RlLnZvbHVtZSBhcyBudW1iZXI7XG4gICAgfTtcblxuICAgIHJldHVybiBbZ2V0dGVyLCBzZXR0ZXJdIGFzIGNvbnN0O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQUFBQTtBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsa0JBQXNDOzs7QUNFdEMsbUJBQTZCOzs7QUNBN0Isc0JBQTJCOzs7QUNGM0IscUJBQTBGOzs7QUNBbkYsSUFBTSxZQUFOLE1BQU0sVUFBUztBQUFBLEVBQ1YsY0FBYztBQUNsQixXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUEsRUFHQSxPQUFjLFdBQVcsR0FBMkI7QUFDaEQsV0FBTyxPQUFPLE1BQU07QUFBQSxFQUN4QjtBQUFBLEVBRUEsT0FBYyxTQUFT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USxZQUFZLGVBQWUsZ0JBQUFBLE9BQVUseUNBQXlDLE9BQU8sb0NBQW9DO0FBQ3JJOyIsCiAgIm5hbWVzIjogWyJHdWlsZFF1ZXVlIiwgImltcG9ydF9kaXNjb3JkIiwgInRhcmdldCIsICJTZXJpYWxpemVkVHlwZSIsICJQbGF5ZXJFdmVudCIsICJRdWV1ZVJlcGVhdE1vZGUiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfc3RyZWFtIiwgInRhcmdldCIsICJxdWVyeSIsICJpbXBvcnRfcHJvbWlzZXMiLCAiaW1wb3J0X2Rpc2NvcmQiLCAicHJpc20iLCAid2FpdEZvciIsICJvcHVzIiwgImltcG9ydF9lcXVhbGl6ZXIiLCAicHJpc20iLCAiVHJhY2tTa2lwUmVhc29uIiwgInRhcmdldCIsICJHdWlsZFF1ZXVlIiwgImltcG9ydF91dGlscyIsICJHdWlsZFF1ZXVlIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9mZm1wZWciLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfZGlzY29yZCIsICJpcCIsICJoYW5kbGVyIiwgImhhbmRsZXIiLCAiaGFuZGxlciIsICJxdWVyeSIsICJyZXMiLCAicmVzdWx0IiwgImRWb2ljZVZlcnNpb24iLCAiZGpzVmVyc2lvbiIsICJpbXBvcnRfZXF1YWxpemVyIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiZGpzVmVyc2lvbiJdCn0K
5499
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyLnRzIiwgIi4uL3NyYy91dGlscy9VdGlsLnRzIiwgIi4uL3NyYy9mYWJyaWMvVHJhY2sudHMiLCAiLi4vc3JjL3V0aWxzL1R5cGVVdGlsLnRzIiwgIi4uL3NyYy9lcnJvcnMvaW5kZXgudHMiLCAiLi4vc3JjL3V0aWxzL3NlcmRlLnRzIiwgIi4uL3NyYy9mYWJyaWMvUGxheWxpc3QudHMiLCAiLi4vc3JjL3R5cGVzL3R5cGVzLnRzIiwgIi4uL3NyYy9mYWJyaWMvU2VhcmNoUmVzdWx0LnRzIiwgIi4uL3NyYy91dGlscy9BdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvci50cyIsICIuLi9zcmMvZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LnRzIiwgIi4uL3NyYy9tYW5hZ2VyL0d1aWxkTm9kZU1hbmFnZXIudHMiLCAiLi4vc3JjL21hbmFnZXIvR3VpbGRRdWV1ZS50cyIsICIuLi9zcmMvVm9pY2VJbnRlcmZhY2UvU3RyZWFtRGlzcGF0Y2hlci50cyIsICIuLi9zcmMvbWFuYWdlci9Wb2ljZVJlY2VpdmVyTm9kZS50cyIsICIuLi9zcmMvbWFuYWdlci9HdWlsZFF1ZXVlSGlzdG9yeS50cyIsICIuLi9zcmMvbWFuYWdlci9HdWlsZFF1ZXVlUGxheWVyTm9kZS50cyIsICIuLi9zcmMvdXRpbHMvUXVlcnlSZXNvbHZlci50cyIsICIuLi9zcmMvdXRpbHMvQXN5bmNRdWV1ZS50cyIsICIuLi9zcmMvbWFuYWdlci9HdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzLnRzIiwgIi4uL3NyYy91dGlscy9GRm1wZWdTdHJlYW0udHMiLCAiLi4vc3JjL21hbmFnZXIvR3VpbGRRdWV1ZVN0YXRpc3RpY3MudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9fY29udGFpbmVyLnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vYWRkUGxheWVyLnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vY2xlYXJQbGF5ZXIudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9nZXRQbGF5ZXJzLnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vZ2V0R2xvYmFsUmVnaXN0cnkudHMiLCAiLi4vc3JjL1ZvaWNlSW50ZXJmYWNlL1ZvaWNlVXRpbHMudHMiLCAiLi4vc3JjL3V0aWxzL1F1ZXJ5Q2FjaGUudHMiLCAiLi4vc3JjL1BsYXllci50cyIsICIuLi9zcmMvRGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyLnRzIiwgIi4uL3NyYy91dGlscy9JUFJvdGF0b3IudHMiLCAiLi4vc3JjL2hvb2tzL2NvbnRleHQvYXN5bmMtY29udGV4dC50cyIsICIuLi9zcmMvaG9va3MvY29tbW9uLnRzIiwgIi4uL3NyYy9ob29rcy91c2VIaXN0b3J5LnRzIiwgIi4uL3NyYy9ob29rcy91c2VQbGF5ZXIudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVF1ZXVlLnRzIiwgIi4uL3NyYy9ob29rcy91c2VNYWluUGxheWVyLnRzIiwgIi4uL3NyYy9ob29rcy91c2VNZXRhZGF0YS50cyIsICIuLi9zcmMvaG9va3MvdXNlVGltZWxpbmUudHMiLCAiLi4vc3JjL2hvb2tzL3N0cmVhbS9vbkFmdGVyQ3JlYXRlU3RyZWFtLnRzIiwgIi4uL3NyYy9ob29rcy9zdHJlYW0vb25CZWZvcmVDcmVhdGVTdHJlYW0udHMiLCAiLi4vc3JjL2hvb2tzL3VzZVZvbHVtZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgdmVyc2lvbiBhcyBkanNWZXJzaW9uIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5cbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0F1ZGlvRmlsdGVycyc7XG5leHBvcnQgKiBmcm9tICcuL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5leHBvcnQgKiBmcm9tICcuL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCc7XG5leHBvcnQgKiBmcm9tICcuL2ZhYnJpYyc7XG5leHBvcnQgKiBmcm9tICcuL21hbmFnZXInO1xuZXhwb3J0ICogZnJvbSAnLi9Wb2ljZUludGVyZmFjZS9Wb2ljZVV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vVm9pY2VJbnRlcmZhY2UvU3RyZWFtRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9UeXBlVXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0FzeW5jUXVldWUnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcy90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0ZGbXBlZ1N0cmVhbSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmV4cG9ydCAqIGZyb20gJ0BkaXNjb3JkLXBsYXllci9mZm1wZWcnO1xuZXhwb3J0ICogZnJvbSAnLi9QbGF5ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9ob29rcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0lQUm90YXRvcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL3NlcmRlJztcbmV4cG9ydCB7XG4gICAgQXVkaW9GaWx0ZXJzIGFzIFBDTUF1ZGlvRmlsdGVycyxcbiAgICB0eXBlIEJpcXVhZEZpbHRlcnMsXG4gICAgRmlsdGVyVHlwZSBhcyBCaXF1YWRGaWx0ZXJUeXBlLFxuICAgIHR5cGUgUENNRmlsdGVycyxcbiAgICBRX0JVVFRFUldPUlRILFxuICAgIFZvbHVtZVRyYW5zZm9ybWVyLFxuICAgIEJBU1NfRVFfQkFORFMsXG4gICAgQUZfTklHSFRDT1JFX1JBVEUsXG4gICAgQUZfVkFQT1JXQVZFX1JBVEUsXG4gICAgRmlsdGVyc0NoYWluXG59IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuZXhwb3J0IHsgY3JlYXRlQXVkaW9QbGF5ZXIsIEF1ZGlvUGxheWVyLCB0eXBlIENyZWF0ZUF1ZGlvUGxheWVyT3B0aW9ucyB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW5mZXJyYWJsZS10eXBlc1xuZXhwb3J0IGNvbnN0IHZlcnNpb246IHN0cmluZyA9ICc2LjYuOCc7XG5cbmlmICghZGpzVmVyc2lvbi5zdGFydHNXaXRoKCcxNCcpKSB7XG4gICAgcHJvY2Vzcy5lbWl0V2FybmluZyhgRGlzY29yZC5qcyB2JHtkanNWZXJzaW9ufSBpcyBpbmNvbXBhdGlibGUgd2l0aCBEaXNjb3JkIFBsYXllciB2JHt2ZXJzaW9ufSEgUGxlYXNlIHVzZSA+PXYxNC54IG9mIERpc2NvcmQuanNgKTtcbn1cbiIsICJpbXBvcnQgeyBEZWZhdWx0TGlzdGVuZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgTGlzdGVuZXJTaWduYXR1cmUgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgY2xhc3MgUGxheWVyRXZlbnRzRW1pdHRlcjxMIGV4dGVuZHMgTGlzdGVuZXJTaWduYXR1cmU8TD4gPSBEZWZhdWx0TGlzdGVuZXI+IGV4dGVuZHMgRXZlbnRFbWl0dGVyPEw+IHtcbiAgICAjaGFzRGVidWdnZXIgPSBmYWxzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlcXVpcmVkRXZlbnRzOiBBcnJheTxrZXlvZiBMPiA9IFtdKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCBsaXN0ZW5lcjogTFtLXSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25jZTxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgICAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdXBlci5vbmNlKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkTGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIuYWRkTGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvZmY8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdGhpcy5saXN0ZW5lckNvdW50KCdkZWJ1ZycgYXMgSykgPiAwO1xuXG4gICAgICAgIHJldHVybiBzdXBlci5vZmYobmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVMaXN0ZW5lcjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0aGlzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJyBhcyBLKSA+IDA7XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlQWxsTGlzdGVuZXJzPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lPzogSykge1xuICAgICAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRoaXMubGlzdGVuZXJDb3VudCgnZGVidWcnIGFzIEspID4gMDtcblxuICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKG5hbWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCAuLi5hcmdzOiBQYXJhbWV0ZXJzPExbS10+KSB7XG4gICAgICAgIGlmICh0aGlzLnJlcXVpcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpICYmICF0aGlzLmV2ZW50TmFtZXMoKS5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoLi4uYXJncyk7XG4gICAgICAgICAgICBVdGlsLndhcm4oXG4gICAgICAgICAgICAgICAgYE5vIGV2ZW50IGxpc3RlbmVyIGZvdW5kIGZvciBldmVudCBcIiR7U3RyaW5nKG5hbWUpfVwiLiBFdmVudHMgJHt0aGlzLnJlcXVpcmVkRXZlbnRzLm1hcCgobSkgPT4gYFwiJHtTdHJpbmcobSl9XCJgKS5qb2luKCcsICcpfSBtdXN0IGhhdmUgZXZlbnQgbGlzdGVuZXJzLmAsXG4gICAgICAgICAgICAgICAgJ1VuaGFuZGxlZEV2ZW50c1dhcm5pbmcnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLmVtaXQobmFtZSwgLi4uYXJncyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNEZWJ1Z2dlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2hhc0RlYnVnZ2VyO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBTdGFnZUNoYW5uZWwsIFZvaWNlQ2hhbm5lbCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgVGltZURhdGEgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgUGxheWxpc3QsIFRyYWNrIH0gZnJvbSAnLi4vZmFicmljJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgcmFuZG9tSW50IH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuXG5jbGFzcyBVdGlsIHtcbiAgICAvKipcbiAgICAgKiBVdGlsc1xuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBkdXJhdGlvbiBzdHJpbmdcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZHVyT2JqIFRoZSBkdXJhdGlvbiBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBkdXJhdGlvblN0cmluZyhkdXJPYmo6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZHVyT2JqKVxuICAgICAgICAgICAgLm1hcCgobSkgPT4gKGlzTmFOKG0pID8gMCA6IG0pKVxuICAgICAgICAgICAgLmpvaW4oJzonKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgbWlsbGlzZWNvbmRzIHRvIGNvbnN1bWFibGUgdGltZSBvYmplY3RcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWlsbGlzZWNvbmRzIFRoZSB0aW1lIGluIG1zXG4gICAgICogQHJldHVybnMge1RpbWVEYXRhfVxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZU1TKG1pbGxpc2Vjb25kczogbnVtYmVyKSB7XG4gICAgICAgIGlmIChpc05hTihtaWxsaXNlY29uZHMpKSBtaWxsaXNlY29uZHMgPSAwO1xuICAgICAgICBjb25zdCByb3VuZCA9IG1pbGxpc2Vjb25kcyA+IDAgPyBNYXRoLmZsb29yIDogTWF0aC5jZWlsO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXlzOiByb3VuZChtaWxsaXNlY29uZHMgLyA4NjQwMDAwMCksXG4gICAgICAgICAgICBob3Vyczogcm91bmQobWlsbGlzZWNvbmRzIC8gMzYwMDAwMCkgJSAyNCxcbiAgICAgICAgICAgIG1pbnV0ZXM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDYwMDAwKSAlIDYwLFxuICAgICAgICAgICAgc2Vjb25kczogcm91bmQobWlsbGlzZWNvbmRzIC8gMTAwMCkgJSA2MFxuICAgICAgICB9IGFzIFRpbWVEYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyB0aW1lIGNvZGVcbiAgICAgKiBAcGFyYW0ge1RpbWVEYXRhfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gb2JqZWN0XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgYnVpbGRUaW1lQ29kZShkdXJhdGlvbjogVGltZURhdGEpIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBPYmplY3Qua2V5cyhkdXJhdGlvbik7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkID0gWydkYXlzJywgJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcyddO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGl0ZW1zLmZpbHRlcigoeCkgPT4gcmVxdWlyZWQuaW5jbHVkZXMoeCkpLm1hcCgobSkgPT4gZHVyYXRpb25bbSBhcyBrZXlvZiBUaW1lRGF0YV0pO1xuICAgICAgICBjb25zdCBmaW5hbCA9IHBhcnNlZFxuICAgICAgICAgICAgLnNsaWNlKHBhcnNlZC5maW5kSW5kZXgoKHgpID0+IHggIT09IDApKVxuICAgICAgICAgICAgLm1hcCgoeCkgPT4geC50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykpXG4gICAgICAgICAgICAuam9pbignOicpO1xuXG4gICAgICAgIHJldHVybiBmaW5hbC5sZW5ndGggPD0gMyA/IGAwOiR7ZmluYWwucGFkU3RhcnQoMiwgJzAnKSB8fCAwfWAgOiBmaW5hbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQaWNrcyBsYXN0IGl0ZW0gb2YgdGhlIGdpdmVuIGFycmF5XG4gICAgICogQHBhcmFtIHthbnlbXX0gYXJyIFRoZSBhcnJheVxuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBzdGF0aWMgbGFzdDxUID0gYW55PihhcnI6IFRbXSk6IFQge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbiAgICAgICAgcmV0dXJuIGFyclthcnIubGVuZ3RoIC0gMV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIGlzVm9pY2VFbXB0eShjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIGNoYW5uZWwgJiYgY2hhbm5lbC5tZW1iZXJzLmZpbHRlcigobWVtYmVyKSA9PiAhbWVtYmVyLnVzZXIuYm90KS5zaXplID09PSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhZmVyIHJlcXVpcmVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgTm9kZSByZXF1aXJlIGlkXG4gICAgICogQHJldHVybnMge2FueX1cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVxdWlyZShpZDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IHJlcXVpcmUoaWQpLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGltcG9ydChpZDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBtb2QsIGVycm9yOiBudWxsIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IG51bGwsIGVycm9yIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3luY2hyb25vdXMgdGltZW91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIFRoZSB0aW1lIGluIG1zIHRvIHdhaXRcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICAgKi9cbiAgICBzdGF0aWMgd2FpdCh0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQodGltZSwgdW5kZWZpbmVkLCB7IHJlZjogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIG5vb3AoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgc3RhdGljIGFzeW5jIGdldEZldGNoKCkge1xuICAgICAgICBpZiAoJ2ZldGNoJyBpbiBnbG9iYWxUaGlzKSByZXR1cm4gZ2xvYmFsVGhpcy5mZXRjaDtcbiAgICAgICAgZm9yIChjb25zdCBsaWIgb2YgWydub2RlLWZldGNoJywgJ3VuZGljaSddKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBpbXBvcnQobGliKS50aGVuKChyZXMpID0+IHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHJlcXVpcmUobGliKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQ7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vP1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgY29kZSA9ICdEZXByZWNhdGlvbldhcm5pbmcnLCBkZXRhaWw/OiBzdHJpbmcpIHtcbiAgICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZyhtZXNzYWdlLCB7XG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgZGV0YWlsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyByYW5kb21DaG9pY2U8VD4oc3JjOiBUW10pOiBUIHtcbiAgICAgICAgcmV0dXJuIHNyY1tyYW5kb21JbnQoc3JjLmxlbmd0aCldO1xuICAgIH1cblxuICAgIHN0YXRpYyBhcnJheUNsb25lU2h1ZmZsZTxUPihzcmM6IFRbXSk6IFRbXSB7XG4gICAgICAgIGNvbnN0IGFyciA9IHNyYy5zbGljZSgpO1xuXG4gICAgICAgIGxldCBtID0gYXJyLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAobSkge1xuICAgICAgICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG0tLSk7XG4gICAgICAgICAgICBbYXJyW21dLCBhcnJbaV1dID0gW2FycltpXSwgYXJyW21dXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgVkFMSURBVEVfUVVFVUVfQ0FQID0gKHF1ZXVlOiBHdWlsZFF1ZXVlLCBpdGVtczogUGxheWxpc3QgfCBUcmFjayB8IFRyYWNrW10pID0+IHtcbiAgICBjb25zdCB0cmFja3MgPSBpdGVtcyBpbnN0YW5jZW9mIFBsYXlsaXN0ID8gaXRlbXMudHJhY2tzIDogQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IFtpdGVtc107XG5cbiAgICBpZiAocXVldWUubWF4U2l6ZSA8IDEgfHwgcXVldWUubWF4U2l6ZSA9PT0gSW5maW5pdHkpIHJldHVybjtcblxuICAgIGNvbnN0IG1heENhcCA9IHF1ZXVlLmdldENhcGFjaXR5KCk7XG5cbiAgICBpZiAobWF4Q2FwIDwgdHJhY2tzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9PVVRfT0ZfU1BBQ0UoJ3RyYWNrcyBxdWV1ZScsIG1heENhcCwgdHJhY2tzLmxlbmd0aCk7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgVXRpbCB9O1xuIiwgImltcG9ydCB7IFVzZXIsIGVzY2FwZU1hcmtkb3duLCBTbm93Zmxha2VVdGlsLCBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsIEFQSVVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciwgUGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0LCBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFJhd1RyYWNrRGF0YSwgU2VhcmNoUXVlcnlUeXBlLCBUcmFja0pTT04gfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL21hbmFnZXIvR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBTZXJpYWxpemVkVHlwZSwgdHJ5SW50b1RodW1ibmFpbFN0cmluZyB9IGZyb20gJy4uL3V0aWxzL3NlcmRlJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgdHlwZSBUcmFja1Jlc29sdmFibGUgPSBUcmFjayB8IHN0cmluZyB8IG51bWJlcjtcblxuZXhwb3J0IHR5cGUgV2l0aE1ldGFkYXRhPFQgZXh0ZW5kcyBvYmplY3QsIE0+ID0gVCAmIHtcbiAgICBtZXRhZGF0YTogTTtcbiAgICByZXF1ZXN0TWV0YWRhdGEoKTogUHJvbWlzZTxNPjtcbn07XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRUcmFjayA9IFJldHVyblR5cGU8VHJhY2tbJ3NlcmlhbGl6ZSddPjtcblxuZXhwb3J0IGNsYXNzIFRyYWNrPFQgPSB1bmtub3duPiB7XG4gICAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gICAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIGF1dGhvcjogc3RyaW5nO1xuICAgIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgcHVibGljIGR1cmF0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIHZpZXdzOiBudW1iZXI7XG4gICAgcHVibGljIHJlcXVlc3RlZEJ5OiBVc2VyIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHBsYXlsaXN0PzogUGxheWxpc3Q7XG4gICAgcHVibGljIHF1ZXJ5VHlwZTogU2VhcmNoUXVlcnlUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGw7XG4gICAgcHVibGljIHJhdzogUmF3VHJhY2tEYXRhID0ge1xuICAgICAgICBzb3VyY2U6ICdhcmJpdHJhcnknXG4gICAgfSBhcyBSYXdUcmFja0RhdGE7XG4gICAgcHVibGljIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICAgIHByaXZhdGUgX19tZXRhZGF0YTogVCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX19yZXFNZXRhZGF0YUZuOiAoKSA9PiBQcm9taXNlPFQgfCBudWxsPjtcblxuICAgIC8qKlxuICAgICAqIFRyYWNrIGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgaW5zdGFudGlhdGVkIHRoaXMgVHJhY2tcbiAgICAgKiBAcGFyYW0gZGF0YSBUcmFjayBkYXRhXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllciwgZGF0YTogUGFydGlhbDxXaXRoTWV0YWRhdGE8UmF3VHJhY2tEYXRhLCBUPj4pIHtcbiAgICAgICAgdGhpcy50aXRsZSA9IGVzY2FwZU1hcmtkb3duKGRhdGEudGl0bGUgPz8gJycpO1xuICAgICAgICB0aGlzLmF1dGhvciA9IGRhdGEuYXV0aG9yID8/ICcnO1xuICAgICAgICB0aGlzLnVybCA9IGRhdGEudXJsID8/ICcnO1xuICAgICAgICB0aGlzLnRodW1ibmFpbCA9IGRhdGEudGh1bWJuYWlsID8/ICcnO1xuICAgICAgICB0aGlzLmR1cmF0aW9uID0gZGF0YS5kdXJhdGlvbiA/PyAnJztcbiAgICAgICAgdGhpcy52aWV3cyA9IGRhdGEudmlld3MgPz8gMDtcbiAgICAgICAgdGhpcy5xdWVyeVR5cGUgPSBkYXRhLnF1ZXJ5VHlwZTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0ZWRCeSA9IGRhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5wbGF5bGlzdCA9IGRhdGEucGxheWxpc3Q7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBgJHt0aGlzLnRpdGxlfSBieSAke3RoaXMuYXV0aG9yfWA7XG4gICAgICAgIHRoaXMucmF3ID0gT2JqZWN0LmFzc2lnbih7fSwgeyBzb3VyY2U6IGRhdGEucmF3Py5zb3VyY2UgPz8gZGF0YS5zb3VyY2UgfSwgZGF0YS5yYXcgPz8gZGF0YSk7XG4gICAgICAgIHRoaXMuX19tZXRhZGF0YSA9IGRhdGEubWV0YWRhdGEgPz8gbnVsbDtcbiAgICAgICAgdGhpcy5fX3JlcU1ldGFkYXRhRm4gPSBkYXRhLnJlcXVlc3RNZXRhZGF0YSB8fCAoKCkgPT4gUHJvbWlzZS5yZXNvbHZlPFQgfCBudWxsPihudWxsKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBtZXRhZGF0YSBmb3IgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0TWV0YWRhdGEoKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuX19yZXFNZXRhZGF0YUZuKCk7XG5cbiAgICAgICAgdGhpcy5zZXRNZXRhZGF0YShyZXMpO1xuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1ldGFkYXRhIGZvciB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHNldE1ldGFkYXRhKG06IFQgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX19tZXRhZGF0YSA9IG07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0YWRhdGEgb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fbWV0YWRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyB0cmFjayBoYXMgbWV0YWRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc01ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YSAhPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBxdWV1ZSBpbiB3aGljaCB0aGlzIHRyYWNrIGlzIGxvY2F0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHF1ZXVlKCk6IEd1aWxkUXVldWUge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuZmluZCgocSkgPT4gcS50cmFja3Muc29tZSgoYWIpID0+IGFiLmlkID09PSB0aGlzLmlkKSkhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHVyYXRpb25NUygpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB0aW1lcyA9IChuOiBudW1iZXIsIHQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgbGV0IHRuID0gMTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdDsgaSsrKSB0biAqPSBuO1xuICAgICAgICAgICAgcmV0dXJuIHQgPD0gMCA/IDEwMDAgOiB0biAqIDEwMDA7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZHVyYXRpb25cbiAgICAgICAgICAgIC5zcGxpdCgnOicpXG4gICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAubWFwKChtLCBpKSA9PiBwYXJzZUludChtKSAqIHRpbWVzKDYwLCBpKSlcbiAgICAgICAgICAgIC5yZWR1Y2UoKGEsIGMpID0+IGEgKyBjLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNjb3JkIGh5cGVybGluayByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHRvSHlwZXJsaW5rKCk6IHN0cmluZyAvKiBub3QgdXNpbmcgYFske3N0cmluZ31dKCR7c3RyaW5nfSlgIHlldCAqLyB7XG4gICAgICAgIHJldHVybiBgWyR7dGhpcy50aXRsZX1dKCR7dGhpcy51cmx9KWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBzb3VyY2Ugb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc291cmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYXc/LnNvdXJjZSA/PyAnYXJiaXRyYXJ5JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy50aXRsZX0gYnkgJHt0aGlzLmF1dGhvcn1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJhdyBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9KU09OKGhpZGVQbGF5bGlzdD86IGJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgZHVyYXRpb25NUzogdGhpcy5kdXJhdGlvbk1TLFxuICAgICAgICAgICAgdmlld3M6IHRoaXMudmlld3MsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeT8uaWQgfHwgbnVsbCxcbiAgICAgICAgICAgIHBsYXlsaXN0OiBoaWRlUGxheWxpc3QgPyBudWxsIDogdGhpcy5wbGF5bGlzdD8udG9KU09OKCkgPz8gbnVsbFxuICAgICAgICB9IGFzIFRyYWNrSlNPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemVkIHRyYWNrIGRhdGEgdGhhdCBjYW4gYmUgcmVjb25zdHJ1Y3RlZFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICB0aHVtYm5haWw6IFR5cGVVdGlsLmlzU3RyaW5nKHRoaXMudGh1bWJuYWlsKSA/IHRoaXMudGh1bWJuYWlsIDogdHJ5SW50b1RodW1ibmFpbFN0cmluZyh0aGlzLnRodW1ibmFpbCksXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHZpZXdzOiB0aGlzLnZpZXdzID8/IDAsXG4gICAgICAgICAgICByZXF1ZXN0ZWRfYnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpID8/IG51bGwsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgICAgICAgbGl2ZTogZmFsc2UsXG4gICAgICAgICAgICBxdWVyeV90eXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogdGhpcy5leHRyYWN0b3I/LmlkZW50aWZpZXIgPz8gbnVsbCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgICAgICAgJHR5cGU6IFNlcmlhbGl6ZWRUeXBlLlRyYWNrLFxuICAgICAgICAgICAgJGVuY29kZXJfdmVyc2lvbjogJzYuNi44J1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIHRyYWNrIGZyb20gc2VyaWFsaXplZCBkYXRhXG4gICAgICogQHBhcmFtIHBsYXllciBQbGF5ZXIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gZGF0YSBTZXJpYWxpemVkIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21TZXJpYWxpemVkKHBsYXllcjogUGxheWVyLCBkYXRhOiBSZXR1cm5UeXBlPFRyYWNrWydzZXJpYWxpemUnXT4pIHtcbiAgICAgICAgaWYgKGRhdGEuJHR5cGUgIT09IFNlcmlhbGl6ZWRUeXBlLlRyYWNrKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdkYXRhJywgJ1NlcmlhbGl6ZWRUcmFjaycsICdtYWxmb3JtZWQgZGF0YScpO1xuICAgICAgICBjb25zdCB0cmFjayA9IG5ldyBUcmFjayhwbGF5ZXIsIHtcbiAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogZGF0YS5yZXF1ZXN0ZWRfYnlcbiAgICAgICAgICAgICAgICA/ICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gZGF0YS5yZXF1ZXN0ZWRfYnkgYXMgQVBJVXNlcjtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IHBsYXllci5jbGllbnQudXNlcnMucmVzb2x2ZShyZXMuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXllci5jbGllbnQudXNlcnMuY2FjaGUuaGFzKHJlcy5pZCkpIHJldHVybiBwbGF5ZXIuY2xpZW50LnVzZXJzLmNhY2hlLmdldChyZXMuaWQpITtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gbmV3IFVzZXIocGxheWVyLmNsaWVudCwgcmVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pKClcbiAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICBxdWVyeVR5cGU6IGRhdGEucXVlcnlfdHlwZSA/PyB1bmRlZmluZWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJhY2suc2V0TWV0YWRhdGEoZGF0YS5tZXRhZGF0YSk7XG5cbiAgICAgICAgcmV0dXJuIHRyYWNrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBiZWxvbmdpbmcgcXVldWVzIG9mIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QmVsb25naW5nUXVldWVzKCkge1xuICAgICAgICBjb25zdCBub2RlcyA9IHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLmZpbHRlcigobm9kZSkgPT4gbm9kZS50cmFja3Muc29tZSgodCkgPT4gdC5pZCA9PT0gdGhpcy5pZCkpO1xuXG4gICAgICAgIHJldHVybiBub2RlcyBhcyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZTx1bmtub3duPj47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGlzIHRyYWNrIHRvIHRoZSBnaXZlbiB2b2ljZSBjaGFubmVsLiBJZiBxdWV1ZSBleGlzdHMgYW5kIGFub3RoZXIgdHJhY2sgaXMgYmVpbmcgcGxheWVkLCB0aGlzIHRyYWNrIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHF1ZXVlLlxuICAgICAqIEBwYXJhbSBjaGFubmVsIFZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhpcyB0cmFjayBzaGFsbCBiZSBwbGF5ZWRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBOb2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPik6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgICAgIGNvbnN0IGZuID0gdGhpcy5wbGF5ZXIucGxheS5iaW5kKHRoaXMucGxheWVyKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgZm4oY2hhbm5lbCwgdGhpcywgb3B0aW9ucyk7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjbGFzcyBUeXBlVXRpbCB7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgcmV0dXJuIFR5cGVVdGlsO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gICAgcHVibGljIHN0YXRpYyBpc0Z1bmN0aW9uKHQ6IHVua25vd24pOiB0IGlzIEZ1bmN0aW9uIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnZnVuY3Rpb24nO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNOdW1iZXIodDogdW5rbm93bik6IHQgaXMgbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc1N0cmluZyh0OiB1bmtub3duKTogdCBpcyBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdzdHJpbmcnO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNCb29sZWFuKHQ6IHVua25vd24pOiB0IGlzIGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdib29sZWFuJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTnVsbGlzaCh0OiB1bmtub3duKTogdCBpcyBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHQgPT0gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzQXJyYXkodDogdW5rbm93bik6IHQgaXMgdW5rbm93bltdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0Vycm9yKHQ6IHVua25vd24pOiB0IGlzIEVycm9yIHtcbiAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBFcnJvcjtcbiAgICB9XG59XG4iLCAiY29uc3QgRGlzY29yZFBsYXllckVycm9ycyA9IHtcbiAgICBFUlJfT1VUX09GX1NQQUNFOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfT1VUX09GX1NQQUNFJyxcbiAgICAgICAgdHlwZTogUmFuZ2VFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcsIGNhcGFjaXR5OiBudW1iZXIsIHRvdGFsOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gTWF4IGNhcGFjaXR5IHJlYWNoZWQgZm9yICR7dGFyZ2V0fSAoQ2FwYWNpdHkgJHtjYXBhY2l0eX0vVG90YWwgJHt0b3RhbH0pYDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX0lOVkFMSURfQVJHX1RZUEU6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9JTlZBTElEX0FSR19UWVBFJyxcbiAgICAgICAgdHlwZTogVHlwZUVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZywgZXhwZWN0YXRpb246IHN0cmluZywgZm91bmQ6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSBFeHBlY3RlZCAke3RhcmdldH0gdG8gYmUgXCIke2V4cGVjdGF0aW9ufVwiLCByZWNlaXZlZCBcIiR7Zm91bmR9XCJgO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fUkVTVUxUOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9fUkVTVUxUJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSAke21lc3NhZ2V9YDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PVF9JTVBMRU1FTlRFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX05PVF9JTVBMRU1FTlRFRCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSAke3RhcmdldH0gaXMgbm90IHlldCBpbXBsZW1lbnRlZGA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT1RfRVhJU1RJTkc6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT1RfRVhJU1RJTkcnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gJHt0YXJnZXR9IGRvZXMgbm90IGV4aXN0YDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX09VVF9PRl9SQU5HRToge1xuICAgICAgICBuYW1lOiAnRVJSX09VVF9PRl9SQU5HRScsXG4gICAgICAgIHR5cGU6IFJhbmdlRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBtaW5pbXVtOiBzdHJpbmcsIG1heGltdW06IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSAke3RhcmdldH0gaXMgb3V0IG9mIHJhbmdlIChFeHBlY3RlZCBtaW5pbXVtICR7bWF4aW11bX0gYW5kIG1heGltdW0gJHttYXhpbXVtfSwgZ290ICR7dmFsdWV9KWA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19WT0lDRV9DT05ORUNUSU9OOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9fVk9JQ0VfQ09OTkVDVElPTicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMubmFtZX1dIGAgKyAobWVzc2FnZSB8fCAnTm8gdm9pY2UgY29ubmVjdGlvbiBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0PycpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9WT0lDRV9DT05ORUNUSU9OX0RFU1RST1lFRCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcigpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gYCArICdDYW5ub3QgdXNlIGRlc3Ryb3llZCB2b2ljZSBjb25uZWN0aW9uJztcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PX1ZPSUNFX0NIQU5ORUw6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19WT0lDRV9DSEFOTkVMJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSBgICsgJ0NvdWxkIG5vdCBnZXQgdGhlIHZvaWNlIGNoYW5uZWwnO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSBgICsgJ0V4cGVjdGVkIGEgdm9pY2UgY2hhbm5lbCc7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19SRUNFSVZFUjoge1xuICAgICAgICBuYW1lOiAnRVJSX05PX1JFQ0VJVkVSJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gYCArIChtZXNzYWdlIHx8ICdObyB2b2ljZSByZWNlaXZlciBpcyBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0PycpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfRkZNUEVHX0xPQ0FUT1I6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9GRk1QRUdfTE9DQVRPUicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gYCArIG1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19BVURJT19SRVNPVVJDRToge1xuICAgICAgICBuYW1lOiAnRVJSX05PX0FVRElPX1JFU09VUkNFJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gYCArIChtZXNzYWdlIHx8ICdFeHBlY3RlZCBhbiBhdWRpbyByZXNvdXJjZScpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fR1VJTERfUVVFVUU6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19HVUlMRF9RVUVVRScsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMubmFtZX1dIGAgKyAobWVzc2FnZSB8fCAnRXhwZWN0ZWQgYSBndWlsZCBxdWV1ZScpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fR1VJTEQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19HVUlMRCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMubmFtZX1dIGAgKyAobWVzc2FnZSB8fCAnRXhwZWN0ZWQgYSBndWlsZCcpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfSU5GT19SRVFVSVJFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX0lORk9fUkVRVUlSRUQnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcsIGFjdHVhbDogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMubmFtZX1dIEV4cGVjdGVkICR7dGFyZ2V0fSwgZm91bmQgXCIke2FjdHVhbH1cImA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX1NFUklBTElaQVRJT05fRkFJTEVEJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XWAgKyBcIkRvbid0IGtub3cgaG93IHRvIHNlcmlhbGl6ZSB0aGlzIGRhdGFcIjtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX0RFU0VSSUFMSVpBVElPTl9GQUlMRUQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9ERVNFUklBTElaQVRJT05fRkFJTEVEJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XWAgKyBcIkRvbid0IGtub3cgaG93IHRvIGRlc2VyaWFsaXplIHRoaXMgZGF0YVwiO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfSUxMRUdBTF9IT09LX0lOVk9DQVRJT046IHtcbiAgICAgICAgbmFtZTogJ0VSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZywgbWVzc2FnZT86IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSBgICsgYElsbGVnYWwgaW52b2NhdGlvbiBvZiAke3RhcmdldH0gaG9vay4ke21lc3NhZ2UgPyBgICR7bWVzc2FnZX1gIDogJyd9YDtcbiAgICAgICAgfVxuICAgIH1cbn0gYXMgY29uc3Q7XG5cbnR5cGUgRmluYWxFeGNlcHRpb248TyBleHRlbmRzICh0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycylba2V5b2YgdHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnNdPiA9IHtcbiAgICBuYW1lOiBPWyduYW1lJ107XG59ICYgSW5zdGFuY2VUeXBlPE9bJ3R5cGUnXT47XG5cbnR5cGUgRGlzY29yZFBsYXllckV4Y2VwdGlvbiA9IHtcbiAgICBbSyBpbiBrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9yc106ICguLi5hcmdzOiBQYXJhbWV0ZXJzPCh0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycylbS11bJ2NyZWF0ZUVycm9yJ10+KSA9PiBGaW5hbEV4Y2VwdGlvbjwodHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnMpW0tdPjtcbn07XG5cbmNvbnN0IHRhcmdldCA9IHt9IGFzIERpc2NvcmRQbGF5ZXJFeGNlcHRpb247XG5cbmNvbnN0IGhhbmRsZXI6IFByb3h5SGFuZGxlcjx0eXBlb2YgdGFyZ2V0PiA9IHtcbiAgICBnZXQodGFyZ2V0LCBwOiBrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycywgcmVjZWl2ZXIpIHtcbiAgICAgICAgY29uc3QgZXJyID0gRGlzY29yZFBsYXllckVycm9yc1twXTtcblxuICAgICAgICBpZiAoIWVycikgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuXG4gICAgICAgIHJldHVybiAoLi4uYXJnczogUGFyYW1ldGVyczwodHlwZW9mIGVycilbJ2NyZWF0ZUVycm9yJ10+KSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICBjb25zdCBleGNlcHRpb24gPSBuZXcgZXJyLnR5cGUoZXJyLmNyZWF0ZUVycm9yKC4uLmFyZ3MpKTtcbiAgICAgICAgICAgIGV4Y2VwdGlvbi5uYW1lID0gZXJyLm5hbWU7XG5cbiAgICAgICAgICAgIHJldHVybiBleGNlcHRpb247XG4gICAgICAgIH07XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IEVycm9yQ29kZXMgPSAoKCkgPT4ge1xuICAgIHR5cGUgRXJyQ29kZXMgPSB7XG4gICAgICAgIC1yZWFkb25seSBbSyBpbiBrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9yc106ICh0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycylbS11bJ25hbWUnXTtcbiAgICB9O1xuXG4gICAgY29uc3QgZGljdCA9IHt9IGFzIEVyckNvZGVzO1xuXG4gICAgZm9yIChjb25zdCBwcm9wIGluIERpc2NvcmRQbGF5ZXJFcnJvcnMpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBkaWN0W3Byb3BdID0gcHJvcDtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShkaWN0KTtcbn0pKCk7XG5leHBvcnQgY29uc3QgRXhjZXB0aW9ucyA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpO1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBQbGF5bGlzdCwgdHlwZSBTZXJpYWxpemVkVHJhY2ssIFRyYWNrLCBTZXJpYWxpemVkUGxheWxpc3QgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuL1R5cGVVdGlsJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuXG5leHBvcnQgZW51bSBTZXJpYWxpemVkVHlwZSB7XG4gICAgVHJhY2sgPSAndHJhY2snLFxuICAgIFBsYXlsaXN0ID0gJ3BsYXlsaXN0J1xufVxuXG5leHBvcnQgdHlwZSBFbmNvZGFibGUgPSBTZXJpYWxpemVkVHJhY2sgfCBTZXJpYWxpemVkUGxheWxpc3Q7XG5cbmNvbnN0IGlzVHJhY2sgPSAoZGF0YTogYW55KTogZGF0YSBpcyBTZXJpYWxpemVkVHJhY2sgPT4gZGF0YS4kdHlwZSA9PT0gU2VyaWFsaXplZFR5cGUuVHJhY2s7XG5jb25zdCBpc1BsYXlsaXN0ID0gKGRhdGE6IGFueSk6IGRhdGEgaXMgU2VyaWFsaXplZFBsYXlsaXN0ID0+IGRhdGEuJHR5cGUgPT09IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0O1xuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplKGRhdGE6IFRyYWNrIHwgUGxheWxpc3QgfCBhbnkpIHtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFRyYWNrKSByZXR1cm4gZGF0YS5zZXJpYWxpemUoKTtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFBsYXlsaXN0KSByZXR1cm4gZGF0YS5zZXJpYWxpemUoKTtcblxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkYXRhLnRvSlNPTigpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRCgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplKHBsYXllcjogUGxheWVyLCBkYXRhOiBFbmNvZGFibGUpIHtcbiAgICBpZiAoaXNUcmFjayhkYXRhKSkgcmV0dXJuIFRyYWNrLmZyb21TZXJpYWxpemVkKHBsYXllciwgZGF0YSk7XG4gICAgaWYgKGlzUGxheWxpc3QoZGF0YSkpIHJldHVybiBQbGF5bGlzdC5mcm9tU2VyaWFsaXplZChwbGF5ZXIsIGRhdGEpO1xuXG4gICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfREVTRVJJQUxJWkFUSU9OX0ZBSUxFRCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlKGRhdGE6IEVuY29kYWJsZSkge1xuICAgIGNvbnN0IHN0ciA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0cikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKGRhdGE6IHN0cmluZykge1xuICAgIGNvbnN0IHN0ciA9IEJ1ZmZlci5mcm9tKGRhdGEsICdiYXNlNjQnKS50b1N0cmluZygpO1xuXG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyeUludG9UaHVtYm5haWxTdHJpbmcoZGF0YTogYW55KSB7XG4gICAgaWYgKCFkYXRhKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgICBpZiAoVHlwZVV0aWwuaXNTdHJpbmcoZGF0YSkpIHJldHVybiBkYXRhO1xuICAgICAgICByZXR1cm4gZGF0YT8udXJsID8/IGRhdGE/LnRodW1ibmFpbD8udXJsID8/IG51bGw7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBQbGF5ZXIsIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdCwgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9ucyB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4vVHJhY2snO1xuaW1wb3J0IHsgUGxheWxpc3RJbml0RGF0YSwgUGxheWxpc3RKU09OLCBUcmFja0pTT04sIFRyYWNrU291cmNlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemVkVHlwZSwgdHJ5SW50b1RodW1ibmFpbFN0cmluZyB9IGZyb20gJy4uL3V0aWxzL3NlcmRlJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRQbGF5bGlzdCA9IFJldHVyblR5cGU8UGxheWxpc3RbJ3NlcmlhbGl6ZSddPjtcblxuZXhwb3J0IGNsYXNzIFBsYXlsaXN0IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXI7XG4gICAgcHVibGljIHRyYWNrczogVHJhY2tbXTtcbiAgICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgcHVibGljIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAgIHB1YmxpYyBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAgIHB1YmxpYyBhdXRob3I6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICB1cmw6IHN0cmluZztcbiAgICB9O1xuICAgIHB1YmxpYyBpZDogc3RyaW5nO1xuICAgIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgcmF3UGxheWxpc3Q/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXG4gICAgLyoqXG4gICAgICogUGxheWxpc3QgY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyIFRoZSBwbGF5ZXJcbiAgICAgKiBAcGFyYW0ge1BsYXlsaXN0SW5pdERhdGF9IGRhdGEgVGhlIGRhdGFcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwbGF5ZXI6IFBsYXllciwgZGF0YTogUGxheWxpc3RJbml0RGF0YSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXllclxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNwbGF5ZXJcbiAgICAgICAgICogQHR5cGUge1BsYXllcn1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHRyYWNrcyBpbiB0aGlzIHBsYXlsaXN0XG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3RyYWNrc1xuICAgICAgICAgKiBAdHlwZSB7VHJhY2tbXX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHJhY2tzID0gZGF0YS50cmFja3MgPz8gW107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhdXRob3Igb2YgdGhpcyBwbGF5bGlzdFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNhdXRob3JcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXV0aG9yID0gZGF0YS5hdXRob3I7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkZXNjcmlwdGlvblxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNkZXNjcmlwdGlvblxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRhdGEuZGVzY3JpcHRpb247XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0aHVtYm5haWwgb2YgdGhpcyBwbGF5bGlzdFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCN0aHVtYm5haWxcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGh1bWJuYWlsID0gZGF0YS50aHVtYm5haWw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5bGlzdCB0eXBlOlxuICAgICAgICAgKiAtIGBhbGJ1bWBcbiAgICAgICAgICogLSBgcGxheWxpc3RgXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3R5cGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHlwZSA9IGRhdGEudHlwZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHNvdXJjZSBvZiB0aGlzIHBsYXlsaXN0OlxuICAgICAgICAgKiAtIGB5b3V0dWJlYFxuICAgICAgICAgKiAtIGBzb3VuZGNsb3VkYFxuICAgICAgICAgKiAtIGBzcG90aWZ5YFxuICAgICAgICAgKiAtIGBhcmJpdHJhcnlgXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3NvdXJjZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zb3VyY2UgPSBkYXRhLnNvdXJjZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I2lkXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlkID0gZGF0YS5pZDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXlsaXN0IHVybFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCN1cmxcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXJsID0gZGF0YS51cmw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5bGlzdCB0aXRsZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50aXRsZSA9IGRhdGEudGl0bGU7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3Jhd1BsYXlsaXN0XG4gICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICB9XG5cbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHlpZWxkKiB0aGlzLnRyYWNrcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc3RpbWF0ZWQgZHVyYXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5yZWR1Y2UoKHAsIGMpID0+IHAgKyBjLmR1cmF0aW9uTVMsIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm1hdHRlZCBlc3RpbWF0ZWQgZHVyYXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHVyYXRpb25Gb3JtYXR0ZWQoKSB7XG4gICAgICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt3aXRoVHJhY2tzPXRydWVdIElmIGl0IHNob3VsZCBidWlsZCBqc29uIHdpdGggdHJhY2tzXG4gICAgICogQHJldHVybnMge1BsYXlsaXN0SlNPTn1cbiAgICAgKi9cbiAgICB0b0pTT04od2l0aFRyYWNrcyA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICB0aHVtYm5haWw6IHRoaXMudGh1bWJuYWlsLFxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICAgICAgICB0cmFja3M6IFtdIGFzIFRyYWNrSlNPTltdXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHdpdGhUcmFja3MpIHBheWxvYWQudHJhY2tzID0gdGhpcy50cmFja3MubWFwKChtKSA9PiBtLnRvSlNPTih0cnVlKSk7XG5cbiAgICAgICAgcmV0dXJuIHBheWxvYWQgYXMgUGxheWxpc3RKU09OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSB0aGlzIHBsYXlsaXN0IGludG8gcmVjb25zdHJ1Y3RhYmxlIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHJhY2tzOiB0aGlzLnRyYWNrcy5tYXAoKG0pID0+IG0uc2VyaWFsaXplKCkpLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHRodW1ibmFpbDogVHlwZVV0aWwuaXNTdHJpbmcodGhpcy50aHVtYm5haWwpID8gdGhpcy50aHVtYm5haWwgOiB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nKHRoaXMudGh1bWJuYWlsKSxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgJHR5cGU6IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0LFxuICAgICAgICAgICAgJGVuY29kZXJfdmVyc2lvbjogJzYuNi44J1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIHRoaXMgcGxheWxpc3QgZnJvbSBzZXJpYWxpemVkIGRhdGFcbiAgICAgKiBAcGFyYW0gcGxheWVyIFBsYXllciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBkYXRhIFNlcmlhbGl6ZWQgZGF0YVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVNlcmlhbGl6ZWQocGxheWVyOiBQbGF5ZXIsIGRhdGE6IFNlcmlhbGl6ZWRQbGF5bGlzdCkge1xuICAgICAgICBpZiAoZGF0YS4kdHlwZSAhPT0gU2VyaWFsaXplZFR5cGUuUGxheWxpc3QpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2RhdGEnLCAnU2VyaWFsaXplZFBsYXlsaXN0JywgJ21hbGZvcm1lZCBkYXRhJyk7XG4gICAgICAgIHJldHVybiBuZXcgUGxheWxpc3QocGxheWVyLCB7XG4gICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgdHJhY2tzOiBkYXRhLnRyYWNrcy5tYXAoKG0pID0+IFRyYWNrLmZyb21TZXJpYWxpemVkKHBsYXllciwgbSkpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhpcyBwbGF5bGlzdCB0byB0aGUgZ2l2ZW4gdm9pY2UgY2hhbm5lbC4gSWYgcXVldWUgZXhpc3RzIGFuZCBhbm90aGVyIHRyYWNrIGlzIGJlaW5nIHBsYXllZCwgdGhpcyBwbGF5bGlzdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZS5cbiAgICAgKiBAcGFyYW0gY2hhbm5lbCBWb2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoaXMgcGxheWxpc3Qgc2hhbGwgYmUgcGxheWVkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTm9kZSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgb3B0aW9ucz86IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4pOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgICAgICBjb25zdCBmbiA9IHRoaXMucGxheWVyLnBsYXkuYmluZCh0aGlzLnBsYXllcik7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuKGNoYW5uZWwsIHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFVzZXIsIFVzZXJSZXNvbHZhYmxlLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB0eXBlIHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHR5cGUgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgdHlwZSB7IGRvd25sb2FkT3B0aW9ucyB9IGZyb20gJ3l0ZGwtY29yZSc7XG5pbXBvcnQgdHlwZSB7IFF1ZXJ5Q2FjaGVQcm92aWRlciB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuaW1wb3J0IHR5cGUgeyBJUFJvdGF0aW9uQ29uZmlnIH0gZnJvbSAnLi4vdXRpbHMvSVBSb3RhdG9yJztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHR5cGUgeyBCcmlkZ2VQcm92aWRlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9leHRyYWN0b3InO1xuXG5leHBvcnQgdHlwZSBGaWx0ZXJzTmFtZSA9IGtleW9mIFF1ZXVlRmlsdGVycztcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJTZWFyY2hSZXN1bHQge1xuICAgIHBsYXlsaXN0OiBQbGF5bGlzdCB8IG51bGw7XG4gICAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgRkZtcGVnIGZpbHRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWV1ZUZpbHRlcnMge1xuICAgIGJhc3Nib29zdF9sb3c/OiBib29sZWFuO1xuICAgIGJhc3Nib29zdD86IGJvb2xlYW47XG4gICAgYmFzc2Jvb3N0X2hpZ2g/OiBib29sZWFuO1xuICAgICc4RCc/OiBib29sZWFuO1xuICAgIHZhcG9yd2F2ZT86IGJvb2xlYW47XG4gICAgbmlnaHRjb3JlPzogYm9vbGVhbjtcbiAgICBwaGFzZXI/OiBib29sZWFuO1xuICAgIHRyZW1vbG8/OiBib29sZWFuO1xuICAgIHZpYnJhdG8/OiBib29sZWFuO1xuICAgIHJldmVyc2U/OiBib29sZWFuO1xuICAgIHRyZWJsZT86IGJvb2xlYW47XG4gICAgbm9ybWFsaXplcj86IGJvb2xlYW47XG4gICAgbm9ybWFsaXplcjI/OiBib29sZWFuO1xuICAgIHN1cnJvdW5kaW5nPzogYm9vbGVhbjtcbiAgICBwdWxzYXRvcj86IGJvb2xlYW47XG4gICAgc3ViYm9vc3Q/OiBib29sZWFuO1xuICAgIGthcmFva2U/OiBib29sZWFuO1xuICAgIGZsYW5nZXI/OiBib29sZWFuO1xuICAgIGdhdGU/OiBib29sZWFuO1xuICAgIGhhYXM/OiBib29sZWFuO1xuICAgIG1jb21wYW5kPzogYm9vbGVhbjtcbiAgICBtb25vPzogYm9vbGVhbjtcbiAgICBtc3Rscj86IGJvb2xlYW47XG4gICAgbXN0cnI/OiBib29sZWFuO1xuICAgIGNvbXByZXNzb3I/OiBib29sZWFuO1xuICAgIGV4cGFuZGVyPzogYm9vbGVhbjtcbiAgICBzb2Z0bGltaXRlcj86IGJvb2xlYW47XG4gICAgY2hvcnVzPzogYm9vbGVhbjtcbiAgICBjaG9ydXMyZD86IGJvb2xlYW47XG4gICAgY2hvcnVzM2Q/OiBib29sZWFuO1xuICAgIGZhZGVpbj86IGJvb2xlYW47XG4gICAgZGltPzogYm9vbGVhbjtcbiAgICBlYXJyYXBlPzogYm9vbGVhbjtcbiAgICBsb2ZpPzogYm9vbGVhbjtcbiAgICBzaWxlbmNlcmVtb3ZlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgdHJhY2sgc291cmNlOlxuICogLSBzb3VuZGNsb3VkXG4gKiAtIHlvdXR1YmVcbiAqIC0gc3BvdGlmeVxuICogLSBhcHBsZV9tdXNpY1xuICogLSBhcmJpdHJhcnlcbiAqL1xuZXhwb3J0IHR5cGUgVHJhY2tTb3VyY2UgPSAnc291bmRjbG91ZCcgfCAneW91dHViZScgfCAnc3BvdGlmeScgfCAnYXBwbGVfbXVzaWMnIHwgJ2FyYml0cmFyeSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmF3VHJhY2tEYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGl0bGVcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvclxuICAgICAqL1xuICAgIGF1dGhvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1cmxcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGh1bWJuYWlsXG4gICAgICovXG4gICAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGR1cmF0aW9uXG4gICAgICovXG4gICAgZHVyYXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gaW4gbXNcbiAgICAgKi9cbiAgICB2aWV3czogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHdobyByZXF1ZXN0ZWQgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0XG4gICAgICovXG4gICAgcGxheWxpc3Q/OiBQbGF5bGlzdDtcbiAgICAvKipcbiAgICAgKiBUaGUgc291cmNlXG4gICAgICovXG4gICAgc291cmNlPzogVHJhY2tTb3VyY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZ2luZVxuICAgICAqL1xuICAgIGVuZ2luZT86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgLyoqXG4gICAgICogSWYgdGhpcyB0cmFjayBpcyBsaXZlXG4gICAgICovXG4gICAgbGl2ZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBkYXRhXG4gICAgICovXG4gICAgcmF3PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAvKipcbiAgICAgKiBUaGUgcXVlcnkgdHlwZVxuICAgICAqL1xuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaW1lRGF0YSB7XG4gICAgLyoqXG4gICAgICogVGltZSBpbiBkYXlzXG4gICAgICovXG4gICAgZGF5czogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRpbWUgaW4gaG91cnNcbiAgICAgKi9cbiAgICBob3VyczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRpbWUgaW4gbWludXRlc1xuICAgICAqL1xuICAgIG1pbnV0ZXM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaW1lIGluIHNlY29uZHNcbiAgICAgKi9cbiAgICBzZWNvbmRzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJZiBpdCBzaG91bGQgcmVuZGVyIHRpbWUgY29kZXNcbiAgICAgKi9cbiAgICB0aW1lY29kZXM/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIElmIGl0IHNob3VsZCBjcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciB0aGUgd2hvbGUgcXVldWVcbiAgICAgKi9cbiAgICBsZW5ndGg/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGJhciBsZW5ndGhcbiAgICAgKi9cbiAgICBsZWZ0Q2hhcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZWxhcHNlZCB0aW1lIHRyYWNrXG4gICAgICovXG4gICAgcmlnaHRDaGFyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZW1haW5pbmcgdGltZSB0cmFja1xuICAgICAqL1xuICAgIHNlcGFyYXRvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2VwYXJhdGlvbiBiZXR3ZWVuIHRpbWVzdGFtcCBhbmQgbGluZVxuICAgICAqL1xuICAgIGluZGljYXRvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5kaWNhdG9yXG4gICAgICovXG4gICAgcXVldWU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBzZWFyY2ggcXVlcnkgdHlwZVxuICogVGhpcyBjYW4gYmUgb25lIG9mOlxuICogLSBBVVRPXG4gKiAtIFlPVVRVQkVcbiAqIC0gWU9VVFVCRV9QTEFZTElTVFxuICogLSBTT1VORENMT1VEX1RSQUNLXG4gKiAtIFNPVU5EQ0xPVURfUExBWUxJU1RcbiAqIC0gU09VTkRDTE9VRFxuICogLSBTUE9USUZZX1NPTkdcbiAqIC0gU1BPVElGWV9BTEJVTVxuICogLSBTUE9USUZZX1BMQVlMSVNUXG4gKiAtIFNQT1RJRllfU0VBUkNIXG4gKiAtIEZBQ0VCT09LXG4gKiAtIFZJTUVPXG4gKiAtIEFSQklUUkFSWVxuICogLSBSRVZFUkJOQVRJT05cbiAqIC0gWU9VVFVCRV9TRUFSQ0hcbiAqIC0gWU9VVFVCRV9WSURFT1xuICogLSBTT1VORENMT1VEX1NFQVJDSFxuICogLSBBUFBMRV9NVVNJQ19TT05HXG4gKiAtIEFQUExFX01VU0lDX0FMQlVNXG4gKiAtIEFQUExFX01VU0lDX1BMQVlMSVNUXG4gKiAtIEFQUExFX01VU0lDX1NFQVJDSFxuICogLSBGSUxFXG4gKiAtIEFVVE9fU0VBUkNIXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBRdWVyeVR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFF1ZXJ5VHlwZSA9IHtcbiAgICBBVVRPOiAnYXV0bycsXG4gICAgWU9VVFVCRTogJ3lvdXR1YmUnLFxuICAgIFlPVVRVQkVfUExBWUxJU1Q6ICd5b3V0dWJlUGxheWxpc3QnLFxuICAgIFNPVU5EQ0xPVURfVFJBQ0s6ICdzb3VuZGNsb3VkVHJhY2snLFxuICAgIFNPVU5EQ0xPVURfUExBWUxJU1Q6ICdzb3VuZGNsb3VkUGxheWxpc3QnLFxuICAgIFNPVU5EQ0xPVUQ6ICdzb3VuZGNsb3VkJyxcbiAgICBTUE9USUZZX1NPTkc6ICdzcG90aWZ5U29uZycsXG4gICAgU1BPVElGWV9BTEJVTTogJ3Nwb3RpZnlBbGJ1bScsXG4gICAgU1BPVElGWV9QTEFZTElTVDogJ3Nwb3RpZnlQbGF5bGlzdCcsXG4gICAgU1BPVElGWV9TRUFSQ0g6ICdzcG90aWZ5U2VhcmNoJyxcbiAgICBGQUNFQk9PSzogJ2ZhY2Vib29rJyxcbiAgICBWSU1FTzogJ3ZpbWVvJyxcbiAgICBBUkJJVFJBUlk6ICdhcmJpdHJhcnknLFxuICAgIFJFVkVSQk5BVElPTjogJ3JldmVyYm5hdGlvbicsXG4gICAgWU9VVFVCRV9TRUFSQ0g6ICd5b3V0dWJlU2VhcmNoJyxcbiAgICBZT1VUVUJFX1ZJREVPOiAneW91dHViZVZpZGVvJyxcbiAgICBTT1VORENMT1VEX1NFQVJDSDogJ3NvdW5kY2xvdWRTZWFyY2gnLFxuICAgIEFQUExFX01VU0lDX1NPTkc6ICdhcHBsZU11c2ljU29uZycsXG4gICAgQVBQTEVfTVVTSUNfQUxCVU06ICdhcHBsZU11c2ljQWxidW0nLFxuICAgIEFQUExFX01VU0lDX1BMQVlMSVNUOiAnYXBwbGVNdXNpY1BsYXlsaXN0JyxcbiAgICBBUFBMRV9NVVNJQ19TRUFSQ0g6ICdhcHBsZU11c2ljU2VhcmNoJyxcbiAgICBGSUxFOiAnZmlsZScsXG4gICAgQVVUT19TRUFSQ0g6ICdhdXRvU2VhcmNoJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2VhcmNoUXVlcnlUeXBlID0ga2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZSB8ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJFdmVudHMge1xuICAgIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gICAgZXJyb3I6IChlcnJvcjogRXJyb3IpID0+IGFueTtcbiAgICB2b2ljZVN0YXRlVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWUsIG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkgPT4gYW55O1xufVxuXG5leHBvcnQgZW51bSBQbGF5ZXJFdmVudCB7XG4gICAgZGVidWcgPSAnZGVidWcnLFxuICAgIGVycm9yID0gJ2Vycm9yJyxcbiAgICB2b2ljZVN0YXRlVXBkYXRlID0gJ3ZvaWNlU3RhdGVVcGRhdGUnXG59XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJZiB0aGlzIHBsYXkgd2FzIHRyaWdnZXJlZCBmb3IgZmlsdGVycyB1cGRhdGVcbiAgICAgKi9cbiAgICBmaWx0ZXJzVXBkYXRlPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBGRm1wZWcgYXJncyBwYXNzZWQgdG8gZW5jb2RlclxuICAgICAqL1xuICAgIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gICAgLyoqXG4gICAgICogVGltZSB0byBzZWVrIHRvIGJlZm9yZSBwbGF5aW5nXG4gICAgICovXG4gICAgc2Vlaz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiBpdCBzaG91bGQgc3RhcnQgcGxheWluZyB0aGUgcHJvdmlkZWQgdHJhY2sgaW1tZWRpYXRlbHlcbiAgICAgKi9cbiAgICBpbW1lZGlhdGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBRdWVyeUV4dHJhY3RvclNlYXJjaCA9IGBleHQ6JHtzdHJpbmd9YDtcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgc2VhcmNoXG4gICAgICovXG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyUmVzb2x2YWJsZTtcbiAgICAvKipcbiAgICAgKiBUaGUgcXVlcnkgc2VhcmNoIGVuZ2luZSwgY2FuIGJlIGV4dHJhY3RvciBuYW1lIHRvIHRhcmdldCBzcGVjaWZpYyBvbmUgKGN1c3RvbSlcbiAgICAgKi9cbiAgICBzZWFyY2hFbmdpbmU/OiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaDtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHRoZSBleHRyYWN0b3JzIHRvIGJsb2NrXG4gICAgICovXG4gICAgYmxvY2tFeHRyYWN0b3JzPzogc3RyaW5nW107XG4gICAgLyoqXG4gICAgICogSWYgaXQgc2hvdWxkIGlnbm9yZSBxdWVyeSBjYWNoZSBsb29rdXBcbiAgICAgKi9cbiAgICBpZ25vcmVDYWNoZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogRmFsbGJhY2sgc2VhcmNoIGVuZ2luZSB0byB1c2VcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHJlcXVlc3RPcHRpb25zPzogYW55O1xuICAgIC8qKlxuICAgICAqIEZhbGxiYWNrIHNlYXJjaCBlbmdpbmUgdG8gdXNlXG4gICAgICovXG4gICAgZmFsbGJhY2tTZWFyY2hFbmdpbmU/OiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG59XG5cbi8qKlxuICogVGhlIHF1ZXVlIHJlcGVhdCBtb2RlLiBUaGlzIGNhbiBiZSBvbmUgb2Y6XG4gKiAtIE9GRlxuICogLSBUUkFDS1xuICogLSBRVUVVRVxuICogLSBBVVRPUExBWVxuICovXG5leHBvcnQgZW51bSBRdWV1ZVJlcGVhdE1vZGUge1xuICAgIC8qKlxuICAgICAqIERpc2FibGUgcmVwZWF0IG1vZGUuXG4gICAgICovXG4gICAgT0ZGID0gMCxcbiAgICAvKipcbiAgICAgKiBSZXBlYXQgdGhlIGN1cnJlbnQgdHJhY2suXG4gICAgICovXG4gICAgVFJBQ0sgPSAxLFxuICAgIC8qKlxuICAgICAqIFJlcGVhdCB0aGUgZW50aXJlIHF1ZXVlLlxuICAgICAqL1xuICAgIFFVRVVFID0gMixcbiAgICAvKipcbiAgICAgKiBXaGVuIGxhc3QgdHJhY2sgZW5kcywgcGxheSBzaW1pbGFyIHRyYWNrcyBpbiB0aGUgZnV0dXJlIGlmIHF1ZXVlIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIEFVVE9QTEFZID0gM1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlsaXN0SW5pdERhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFja3Mgb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqL1xuICAgIHRyYWNrczogVHJhY2tbXTtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRodW1ibmFpbFxuICAgICAqL1xuICAgIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICAgICAqL1xuICAgIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBzb3VyY2VcbiAgICAgKi9cbiAgICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAgICAgKi9cbiAgICBhdXRob3I6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhdXRob3IgbmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGF1dGhvciB1cmxcbiAgICAgICAgICovXG4gICAgICAgIHVybDogc3RyaW5nO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdXJsXG4gICAgICovXG4gICAgdXJsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBwbGF5bGlzdCBkYXRhXG4gICAgICovXG4gICAgcmF3UGxheWxpc3Q/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNrSlNPTiB7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIGlkXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgdGl0bGVcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIGF1dGhvclxuICAgICAqL1xuICAgIGF1dGhvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayB1cmxcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgdGh1bWJuYWlsXG4gICAgICovXG4gICAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIGR1cmF0aW9uXG4gICAgICovXG4gICAgZHVyYXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgZHVyYXRpb24gaW4gbXNcbiAgICAgKi9cbiAgICBkdXJhdGlvbk1TOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIHZpZXdzXG4gICAgICovXG4gICAgdmlld3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciBpZCB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICByZXF1ZXN0ZWRCeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBpbmZvIChpZiBhbnkpXG4gICAgICovXG4gICAgcGxheWxpc3Q/OiBQbGF5bGlzdEpTT047XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWxpc3RKU09OIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgaWRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB1cmxcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRodW1ibmFpbFxuICAgICAqL1xuICAgIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICAgICAqL1xuICAgIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBzb3VyY2VcbiAgICAgKi9cbiAgICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAgICAgKi9cbiAgICBhdXRob3I6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhdXRob3IgbmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGF1dGhvciB1cmxcbiAgICAgICAgICovXG4gICAgICAgIHVybDogc3RyaW5nO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrcyBkYXRhIChpZiBhbnkpXG4gICAgICovXG4gICAgdHJhY2tzOiBUcmFja0pTT05bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJJbml0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIG9wdGlvbnMgcGFzc2VkIHRvIGB5dGRsLWNvcmVgLlxuICAgICAqL1xuICAgIHl0ZGxPcHRpb25zPzogZG93bmxvYWRPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uIHRpbWVvdXRcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaW1lIGluIG1zIHRvIHJlLW1vbml0b3IgZXZlbnQgbG9vcCBsYWdcbiAgICAgKi9cbiAgICBsYWdNb25pdG9yPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFByZXZlbnQgdm9pY2Ugc3RhdGUgaGFuZGxlciBmcm9tIGJlaW5nIG92ZXJyaWRkZW5cbiAgICAgKi9cbiAgICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZXh0cmFjdG9ycyB0byBkaXNhYmxlIHF1ZXJ5aW5nIG1ldGFkYXRhIGZyb21cbiAgICAgKi9cbiAgICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGV4dHJhY3RvcnMgdG8gZGlzYWJsZSBzdHJlYW1pbmcgZnJvbVxuICAgICAqL1xuICAgIGJsb2NrU3RyZWFtRnJvbT86IHN0cmluZ1tdO1xuICAgIC8qKlxuICAgICAqIFF1ZXJ5IGNhY2hlIHByb3ZpZGVyXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBxdWVyeUNhY2hlPzogUXVlcnlDYWNoZVByb3ZpZGVyPGFueT4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElnbm9yZSBwbGF5ZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBpZ25vcmVJbnN0YW5jZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVXNlIGxlZ2FjeSB2ZXJzaW9uIG9mIGZmbXBlZ1xuICAgICAqL1xuICAgIHVzZUxlZ2FjeUZGbXBlZz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU2V0IGJyaWRnZSBwcm92aWRlclxuICAgICAqL1xuICAgIGJyaWRnZVByb3ZpZGVyPzogQnJpZGdlUHJvdmlkZXI7XG4gICAgLyoqXG4gICAgICogSVAgcm90YXRvciBjb25maWdcbiAgICAgKi9cbiAgICBpcGNvbmZpZz86IElQUm90YXRpb25Db25maWc7XG4gICAgLyoqXG4gICAgICogU2tpcCBmZm1wZWcgcHJvY2VzcyB3aGVuIHBvc3NpYmxlXG4gICAgICovXG4gICAgc2tpcEZGbXBlZz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHByb2JlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byA1MDAwLlxuICAgICAqL1xuICAgIHByb2JlVGltZW91dD86IG51bWJlcjtcbn1cbiIsICJpbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBRdWVyeUV4dHJhY3RvclNlYXJjaCwgUXVlcnlUeXBlLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuL1RyYWNrJztcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSZXN1bHREYXRhIHtcbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoIHwgbnVsbDtcbiAgICBleHRyYWN0b3I/OiBCYXNlRXh0cmFjdG9yIHwgbnVsbDtcbiAgICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbDtcbiAgICB0cmFja3M/OiBUcmFja1tdO1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hSZXN1bHQge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIsIHByaXZhdGUgX2RhdGE6IFNlYXJjaFJlc3VsdERhdGEpIHtcbiAgICAgICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAgICAgICB0cmFjay5leHRyYWN0b3IgPz89IHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgICAgICAgICB0cmFjay5yZXF1ZXN0ZWRCeSA/Pz0gX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFF1ZXJ5VHlwZSh0eXBlOiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaCkge1xuICAgICAgICB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSA9IHR5cGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRSZXF1ZXN0ZWRCeSh1c2VyOiBVc2VyKSB7XG4gICAgICAgIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgPSB1c2VyO1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICAgIHRyYWNrLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRFeHRyYWN0b3IoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuZXh0cmFjdG9yID0gZXh0cmFjdG9yO1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICAgIHRyYWNrLmV4dHJhY3RvciA9IGV4dHJhY3RvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRUcmFja3ModHJhY2tzOiBUcmFja1tdKSB7XG4gICAgICAgIHRoaXMuX2RhdGEudHJhY2tzID0gdHJhY2tzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UXVlcnkocXVlcnk6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kYXRhLnF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRQbGF5bGlzdChwbGF5bGlzdDogUGxheWxpc3QpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5wbGF5bGlzdCA9IHBsYXlsaXN0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VhcmNoIHF1ZXJ5XG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEucXVlcnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSB8fCBRdWVyeVR5cGUuQVVUTztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIGdldCBleHRyYWN0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmV4dHJhY3RvciB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXlsaXN0IHJlc3VsdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGxheWxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnBsYXlsaXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYWNrcyByZXN1bHRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRyYWNrcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEudHJhY2tzIHx8IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3RlZCBieVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVxdWVzdGVkQnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmUtZXhlY3V0ZSB0aGlzIHNlYXJjaFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuc2VhcmNoKHRoaXMucXVlcnksIHtcbiAgICAgICAgICAgIHNlYXJjaEVuZ2luZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeSFcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGlzIGVtcHR5XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy50cmFja3MubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzUGxheWxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXlsaXN0ICE9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGhhcyB0cmFja3NcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzVHJhY2tzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3MubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2VhcmNoXG4gICAgICovXG4gICAgcHVibGljIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgICAgICAgcXVlcnlUeXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHBsYXlsaXN0OiB0aGlzLnBsYXlsaXN0Py50b0pTT04oZmFsc2UpIHx8IG51bGwsXG4gICAgICAgICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpLFxuICAgICAgICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCBudWxsLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpIHx8IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgRmlsdGVyc05hbWUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5cbmNvbnN0IGJhc3MgPSAoZzogbnVtYmVyKSA9PiBgYmFzcz1nPSR7Z306Zj0xMTA6dz0wLjNgO1xuXG5leHBvcnQgY2xhc3MgQXVkaW9GaWx0ZXJzIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb0ZpbHRlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmaWx0ZXJzOiBSZWNvcmQ8RmlsdGVyc05hbWUsIHN0cmluZz4gPSB7XG4gICAgICAgIGJhc3Nib29zdF9sb3c6IGJhc3MoMTUpLFxuICAgICAgICBiYXNzYm9vc3Q6IGJhc3MoMjApLFxuICAgICAgICBiYXNzYm9vc3RfaGlnaDogYmFzcygzMCksXG4gICAgICAgICc4RCc6ICdhcHVsc2F0b3I9aHo9MC4wOScsXG4gICAgICAgIHZhcG9yd2F2ZTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjgnLFxuICAgICAgICBuaWdodGNvcmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMS4yNScsXG4gICAgICAgIGxvZmk6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMC45LGV4dHJhc3RlcmVvPW09Mi41OmM9ZGlzYWJsZWQnLFxuICAgICAgICBwaGFzZXI6ICdhcGhhc2VyPWluX2dhaW49MC40JyxcbiAgICAgICAgdHJlbW9sbzogJ3RyZW1vbG8nLFxuICAgICAgICB2aWJyYXRvOiAndmlicmF0bz1mPTYuNScsXG4gICAgICAgIHJldmVyc2U6ICdhcmV2ZXJzZScsXG4gICAgICAgIHRyZWJsZTogJ3RyZWJsZT1nPTUnLFxuICAgICAgICBub3JtYWxpemVyMjogJ2R5bmF1ZG5vcm09Zz0xMDEnLFxuICAgICAgICBub3JtYWxpemVyOiAnYWNvbXByZXNzb3InLFxuICAgICAgICBzdXJyb3VuZGluZzogJ3N1cnJvdW5kJyxcbiAgICAgICAgcHVsc2F0b3I6ICdhcHVsc2F0b3I9aHo9MScsXG4gICAgICAgIHN1YmJvb3N0OiAnYXN1YmJvb3N0JyxcbiAgICAgICAga2FyYW9rZTogJ3N0ZXJlb3Rvb2xzPW1sZXY9MC4wMycsXG4gICAgICAgIGZsYW5nZXI6ICdmbGFuZ2VyJyxcbiAgICAgICAgZ2F0ZTogJ2FnYXRlJyxcbiAgICAgICAgaGFhczogJ2hhYXMnLFxuICAgICAgICBtY29tcGFuZDogJ21jb21wYW5kJyxcbiAgICAgICAgbW9ubzogJ3Bhbj1tb25vfGMwPS41KmMwKy41KmMxJyxcbiAgICAgICAgbXN0bHI6ICdzdGVyZW90b29scz1tb2RlPW1zPmxyJyxcbiAgICAgICAgbXN0cnI6ICdzdGVyZW90b29scz1tb2RlPW1zPnJyJyxcbiAgICAgICAgY29tcHJlc3NvcjogJ2NvbXBhbmQ9cG9pbnRzPS04MC8tMTA1fC02Mi8tODB8LTE1LjQvLTE1LjR8MC8tMTJ8MjAvLTcuNicsXG4gICAgICAgIGV4cGFuZGVyOiAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tMTY5fC01NC8tODB8LTQ5LjUvLTY0LjZ8LTQxLjEvLTQxLjF8LTI1LjgvLTE1fC0xMC44Ly00LjV8MC8wfDIwLzguMycsXG4gICAgICAgIHNvZnRsaW1pdGVyOiAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tODB8LTEyLjQvLTEyLjR8LTYvLTh8MC8tNi44fDIwLy0yLjgnLFxuICAgICAgICBjaG9ydXM6ICdjaG9ydXM9MC43OjAuOTo1NTowLjQ6MC4yNToyJyxcbiAgICAgICAgY2hvcnVzMmQ6ICdjaG9ydXM9MC42OjAuOTo1MHw2MDowLjR8MC4zMjowLjI1fDAuNDoyfDEuMycsXG4gICAgICAgIGNob3J1czNkOiAnY2hvcnVzPTAuNTowLjk6NTB8NjB8NDA6MC40fDAuMzJ8MC4zOjAuMjV8MC40fDAuMzoyfDIuM3wxLjMnLFxuICAgICAgICBmYWRlaW46ICdhZmFkZT10PWluOnNzPTA6ZD0xMCcsXG4gICAgICAgIGRpbTogYGFmZnRmaWx0PVwiJ3JlYWw9cmUgKiAoMS1jbGlwKChiL25iKSpiLDAsMSkpJzppbWFnPSdpbSAqICgxLWNsaXAoKGIvbmIpKmIsMCwxKSknXCJgLFxuICAgICAgICBlYXJyYXBlOiAnY2hhbm5lbHNwbGl0LHNpZGVjaGFpbmdhdGU9bGV2ZWxfaW49NjQnLFxuICAgICAgICBzaWxlbmNlcmVtb3ZlOiAnc2lsZW5jZXJlbW92ZT0xOjA6LTUwZEInXG4gICAgfTtcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0PEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4obmFtZTogSykge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJzW25hbWVdID8/IG5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXM8SyBleHRlbmRzIEZpbHRlcnNOYW1lPihuYW1lOiBLKSB7XG4gICAgICAgIHJldHVybiBuYW1lIGluIHRoaXMuZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPHsgbmFtZTogRmlsdGVyc05hbWU7IHZhbHVlOiBzdHJpbmcgfT4ge1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmZpbHRlcnMpKSB7XG4gICAgICAgICAgICB5aWVsZCB7IG5hbWU6IGsgYXMgRmlsdGVyc05hbWUsIHZhbHVlOiB2IGFzIHN0cmluZyB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgbmFtZXMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpIGFzIEZpbHRlcnNOYW1lW107XG4gICAgfVxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVzLm1hcCgobSkgPT4gKHRoaXMgYXMgYW55KVttXSkuam9pbignLCcpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZmZtcGVnIGFyZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbHRlcnMgbmFtZVxuICAgICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciBuYW1lXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZTxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KGZpbHRlcnM/OiBLW10pIHtcbiAgICAgICAgaWYgKCFmaWx0ZXJzIHx8ICFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gZmlsdGVyc1xuICAgICAgICAgICAgLmZpbHRlcigocHJlZGljYXRlKSA9PiB0eXBlb2YgcHJlZGljYXRlID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgIC5tYXAoKG0pID0+IHRoaXMuZ2V0KG0pKVxuICAgICAgICAgICAgLmpvaW4oJywnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGF1ZGlvIGZpbHRlclxuICAgICAqIEBwYXJhbSBmaWx0ZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWx0ZXJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGZmbXBlZyBhcmdzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmUoZmlsdGVyTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyc1tmaWx0ZXJOYW1lIGFzIEZpbHRlcnNOYW1lXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgbXVsdGlwbGUgYXVkaW8gZmlsdGVyc1xuICAgICAqIEBwYXJhbSBmaWx0ZXJzQXJyYXkgQXJyYXkgb2YgZmlsdGVycyBjb250YWluaW5nIHRoZSBmaWx0ZXIgbmFtZSBhbmQgZmZtcGVnIGFyZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZUJ1bGsoZmlsdGVyc0FycmF5OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10pIHtcbiAgICAgICAgZmlsdGVyc0FycmF5LmZvckVhY2goKGFycikgPT4gdGhpcy5kZWZpbmUoYXJyLm5hbWUsIGFyci52YWx1ZSkpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHMsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IEd1aWxkUXVldWVIaXN0b3J5IH0gZnJvbSAnLi4vbWFuYWdlcic7XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RvclN0cmVhbWFibGUgPVxuICAgIHwgUmVhZGFibGVcbiAgICB8IHN0cmluZ1xuICAgIHwge1xuICAgICAgICAgICRmbXQ6IHN0cmluZztcbiAgICAgICAgICBzdHJlYW06IFJlYWRhYmxlO1xuICAgICAgfTtcblxuZXhwb3J0IGNsYXNzIEJhc2VFeHRyYWN0b3I8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpZGVudGlmaWVyID0gJ2NvbS5kaXNjb3JkLXBsYXllci5leHRyYWN0b3InO1xuXG4gICAgLyoqXG4gICAgICogUHJpb3JpdHkgb2YgdGhpcyBleHRyYWN0b3IuIEhpZ2hlciB2YWx1ZSBtZWFucyBoaWdoZXIgcHJpb3JpdHkgKHdpbGwgYmUgZXhlY3V0ZWQgZmlyc3QpLlxuICAgICAqL1xuICAgIHB1YmxpYyBwcmlvcml0eSA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcXVlcnkgcHJvdG9jb2xzIHRoYXQgdGhpcyBleHRyYWN0b3Igc3VwcG9ydHMuXG4gICAgICovXG4gICAgcHVibGljIHByb3RvY29sczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBicmlkZ2UgcXVlcnkgY3JlYXRpb25cbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGJ1aWxkIHF1ZXJ5IGZvclxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVCcmlkZ2VRdWVyeSA9ICh0cmFjazogVHJhY2spID0+IGAke3RyYWNrLnRpdGxlfSBieSAke3RyYWNrLmF1dGhvcn0gb2ZmaWNpYWwgYXVkaW9gO1xuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdG9yIGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBvcHRpb25zIEluaXRpYWxpemF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBwdWJsaWMgb3B0aW9uczogVCA9IDxUPnt9KSB7fVxuXG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGlzIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaWRlbnRpZmllcigpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBCYXNlRXh0cmFjdG9yKS5pZGVudGlmaWVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY29uZmlndXJlcyB0aGlzIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBuZXcgb3B0aW9ucyB0byBhcHBseVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZWNvbmZpZ3VyZShvcHRpb25zOiBUKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmFjdGl2YXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBhY3RpdmF0ZSgpIHtcbiAgICAgICAgLy8gZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkZWFjdGl2YXRlKCkge1xuICAgICAgICAvLyBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBpbmNvbWluZyBxdWVyeVxuICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgdG8gdmFsaWRhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdmFsaWRhdGUocXVlcnk6IHN0cmluZywgdHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdm9pZCB0eXBlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyZWFtIHRoZSBnaXZlbiB0cmFja1xuICAgICAqIEBwYXJhbSBpbmZvIFRoZSB0cmFjayB0byBzdHJlYW1cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc3RyZWFtKGluZm86IFRyYWNrKTogUHJvbWlzZTxFeHRyYWN0b3JTdHJlYW1hYmxlPiB7XG4gICAgICAgIHZvaWQgaW5mbztcbiAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9UX0lNUExFTUVOVEVEKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uc3RyZWFtKClgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdGhlIGdpdmVuIHF1ZXJ5XG4gICAgICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byBoYW5kbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlKHF1ZXJ5OiBzdHJpbmcsIGNvbnRleHQ6IEV4dHJhY3RvclNlYXJjaENvbnRleHQpOiBQcm9taXNlPEV4dHJhY3RvckluZm8+IHtcbiAgICAgICAgdm9pZCBjb250ZXh0O1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT1RfSU1QTEVNRU5URUQoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5oYW5kbGUoKWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCByZWxhdGVkIHRyYWNrcyBmb3IgdGhlIGdpdmVuIHRyYWNrXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayBzb3VyY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0UmVsYXRlZFRyYWNrcyh0cmFjazogVHJhY2ssIGhpc3Rvcnk6IEd1aWxkUXVldWVIaXN0b3J5KTogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgICAgIHZvaWQgdHJhY2s7XG4gICAgICAgIHZvaWQgaGlzdG9yeTtcbiAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9UX0lNUExFTUVOVEVEKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uZ2V0UmVsYXRlZFRyYWNrcygpYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzdHJlYW0gbWlkZGxld2FyZSB0byBoYW5kbGUgc3RyZWFtcyBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgcGxheWVyXG4gICAgICogQHBhcmFtIHN0cmVhbSBUaGUgaW5jb21pbmcgc3RyZWFtXG4gICAgICogQHBhcmFtIG5leHQgVGhlIG5leHQgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlUG9zdFN0cmVhbShzdHJlYW06IFJlYWRhYmxlLCBuZXh0OiBOZXh0RnVuY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIG5leHQobnVsbCwgc3RyZWFtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhbiBldmVudCB0byB0aGUgcGxheWVyXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBkaXNwYXRjaFxuICAgICAqIEBwYXJhbSBhcmdzIFRoZSBkYXRhIHRvIGRpc3BhdGNoXG4gICAgICovXG4gICAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIFBsYXllckV2ZW50cz4oZXZlbnQ6IEssIC4uLmFyZ3M6IFBhcmFtZXRlcnM8UGxheWVyRXZlbnRzW0tdPikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnBsYXllci5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZXh0cmFjdG9yIHJlc3BvbnNlXG4gICAgICogQHBhcmFtIHBsYXlsaXN0IFRoZSBwbGF5bGlzdFxuICAgICAqIEBwYXJhbSB0cmFja3MgVGhlIHRyYWNrIGFycmF5XG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVJlc3BvbnNlKHBsYXlsaXN0PzogUGxheWxpc3QgfCBudWxsLCB0cmFja3M6IFRyYWNrW10gPSBwbGF5bGlzdD8udHJhY2tzIHx8IFtdKTogRXh0cmFjdG9ySW5mbyB7XG4gICAgICAgIHJldHVybiB7IHBsYXlsaXN0OiBwbGF5bGlzdCB8fCBudWxsLCB0cmFja3MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXcml0ZSBkZWJ1ZyBtZXNzYWdlXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGRlYnVnIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmRlYnVnKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElQIHJvdGF0b3IgaW5zdGFuY2UsIGlmIGF2YWlsYWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm91dGVQbGFubmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnBsYXllci5yb3V0ZVBsYW5uZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBmbGFnIHRvIGluZGljYXRlIGBEZW11eGFibGVgIHN0cmVhbSBzdXBwb3J0IGZvciBgb3B1c2AvYG9nZy9vcHVzYC9gd2VibS9vcHVzYCBmb3JtYXRzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3VwcG9ydHNEZW11eCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5jb250ZXh0LnBsYXllci5vcHRpb25zLnNraXBGRm1wZWc7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBOZXh0RnVuY3Rpb24gPSAoZXJyb3I/OiBFcnJvciB8IG51bGwsIHN0cmVhbT86IFJlYWRhYmxlKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckluZm8ge1xuICAgIHBsYXlsaXN0OiBQbGF5bGlzdCB8IG51bGw7XG4gICAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvclNlYXJjaENvbnRleHQge1xuICAgIHR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsO1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG4gICAgcmVxdWVzdE9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucztcbiAgICBwcm90b2NvbD86IHN0cmluZyB8IG51bGw7XG59XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4vQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHNFbWl0dGVyIH0gZnJvbSAnLi4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBrbm93bkV4dHJhY3RvcktleXMgPSBbXG4gICAgJ1Nwb3RpZnlFeHRyYWN0b3InLFxuICAgICdBcHBsZU11c2ljRXh0cmFjdG9yJyxcbiAgICAnU291bmRDbG91ZEV4dHJhY3RvcicsXG4gICAgJ1lvdVR1YmVFeHRyYWN0b3InLFxuICAgICdWaW1lb0V4dHJhY3RvcicsXG4gICAgJ1JldmVyYm5hdGlvbkV4dHJhY3RvcicsXG4gICAgJ0F0dGFjaG1lbnRFeHRyYWN0b3InXG5dIGFzIGNvbnN0O1xuY29uc3Qga25vd25FeHRyYWN0b3JMaWIgPSAnQGRpc2NvcmQtcGxheWVyL2V4dHJhY3Rvcic7XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RvckxvYWRlck9wdGlvbkRpY3QgPSB7XG4gICAgLy8gQHRzLWlnbm9yZSB0eXBlc1xuICAgIFtLIGluICh0eXBlb2Yga25vd25FeHRyYWN0b3JLZXlzKVtudW1iZXJdXT86IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgaW1wb3J0KCdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJylbS10+WzFdO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JFeGVjdXRpb25FdmVudHMge1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyByZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgZXh0cmFjdG9yIHdhcyByZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRoYXQgd2FzIHJlZ2lzdGVyZWRcbiAgICAgKi9cbiAgICByZWdpc3RlcmVkOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyB1bnJlZ2lzdGVyZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHVucmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0aGF0IHdhcyB1bnJlZ2lzdGVyZWRcbiAgICAgKi9cbiAgICB1bnJlZ2lzdGVyZWQ6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGFjdGl2YXRlZFxuICAgICAqL1xuICAgIGFjdGl2YXRlOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAgICovXG4gICAgZGVhY3RpdmF0ZTogKGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgZmFpbHMgdG8gYWN0aXZhdGUvZGVhY3RpdmF0ZVxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAgICovXG4gICAgZXJyb3I6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IsIGVycm9yOiBFcnJvcikgPT4gdW5rbm93bjtcbn1cblxuZXhwb3J0IGNsYXNzIEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBQbGF5ZXJFdmVudHNFbWl0dGVyPEV4dHJhY3RvckV4ZWN1dGlvbkV2ZW50cz4ge1xuICAgIC8qKlxuICAgICAqIFRoZSBleHRyYWN0b3JzIHN0b3JlXG4gICAgICovXG4gICAgcHVibGljIHN0b3JlID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCBCYXNlRXh0cmFjdG9yPigpO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge1xuICAgICAgICBzdXBlcihbJ2Vycm9yJ10pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgZGVmYXVsdCBleHRyYWN0b3JzIGZyb20gYEBkaXNjb3JkLXBsYXllci9leHRyYWN0b3JgXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGxvYWREZWZhdWx0KGZpbHRlcj86IChleHQ6ICh0eXBlb2Yga25vd25FeHRyYWN0b3JLZXlzKVtudW1iZXJdKSA9PiBib29sZWFuIHwgbnVsbCwgb3B0aW9ucz86IEV4dHJhY3RvckxvYWRlck9wdGlvbkRpY3QpIHtcbiAgICAgICAgY29uc3QgbW9kID0gYXdhaXQgVXRpbC5pbXBvcnQoa25vd25FeHRyYWN0b3JMaWIpO1xuICAgICAgICBpZiAobW9kLmVycm9yKSByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IG1vZC5lcnJvciBhcyBFcnJvciB9O1xuXG4gICAgICAgIChmaWx0ZXIgPyBrbm93bkV4dHJhY3RvcktleXMuZmlsdGVyKGZpbHRlcikgOiBrbm93bkV4dHJhY3RvcktleXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFtb2QubW9kdWxlW2tleV0pIHJldHVybjtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdHlwZXNcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXIoPHR5cGVvZiBCYXNlRXh0cmFjdG9yPm1vZC5tb2R1bGVba2V5XSwgb3B0aW9ucz8uW2tleV0gfHwge30pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIGlmIHRoZSBnaXZlbiBleHRyYWN0b3IgaXMgcmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgICAqL1xuICAgIHB1YmxpYyBpc1JlZ2lzdGVyZWQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmhhcyhpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2l6ZSBvZiByZWdpc3RlcmVkIGV4dHJhY3RvcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHNpbmdsZSBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgZXh0cmFjdG9yIHRvIGdldFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldChpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBzaW5nbGUgZXh0cmFjdG9yXG4gICAgICogQHBhcmFtIF9leHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0byByZWdpc3RlclxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3VwcGxpZWQgdG8gdGhlIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlcjxPIGV4dGVuZHMgb2JqZWN0LCBUIGV4dGVuZHMgdHlwZW9mIEJhc2VFeHRyYWN0b3I8Tz4+KF9leHRyYWN0b3I6IFQsIG9wdGlvbnM6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxUPlsnMSddKTogUHJvbWlzZTxJbnN0YW5jZVR5cGU8VD4gfCBudWxsPiB7XG4gICAgICAgIGlmICh0eXBlb2YgX2V4dHJhY3Rvci5pZGVudGlmaWVyICE9PSAnc3RyaW5nJyB8fCB0aGlzLnN0b3JlLmhhcyhfZXh0cmFjdG9yLmlkZW50aWZpZXIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZXh0cmFjdG9yID0gbmV3IF9leHRyYWN0b3IodGhpcywgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAodGhpcy5wbGF5ZXIub3B0aW9ucy5icmlkZ2VQcm92aWRlcikgb3B0aW9ucy5icmlkZ2VQcm92aWRlciA/Pz0gdGhpcy5wbGF5ZXIub3B0aW9ucy5icmlkZ2VQcm92aWRlcjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXQoX2V4dHJhY3Rvci5pZGVudGlmaWVyLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBsb2FkZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlZ2lzdGVyZWQnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgYXdhaXQgZXh0cmFjdG9yLmFjdGl2YXRlKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGFjdGl2YXRlZCFgKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYWN0aXZhdGUnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RvciBhcyB1bmtub3duIGFzIEluc3RhbmNlVHlwZTxUPjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5kZWxldGUoX2V4dHJhY3Rvci5pZGVudGlmaWVyKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYCR7X2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZmFpbGVkIHRvIGFjdGl2YXRlISBFcnJvcjogJHtlfWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMsIGV4dHJhY3RvciwgZSBhcyBFcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXIgc2luZ2xlIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBfZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdG8gdW5yZWdpc3RlclxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyPEsgZXh0ZW5kcyBzdHJpbmcgfCBCYXNlRXh0cmFjdG9yPihfZXh0cmFjdG9yOiBLKSB7XG4gICAgICAgIGNvbnN0IGV4dHJhY3RvciA9IHR5cGVvZiBfZXh0cmFjdG9yID09PSAnc3RyaW5nJyA/IHRoaXMuc3RvcmUuZ2V0KF9leHRyYWN0b3IpIDogdGhpcy5zdG9yZS5maW5kKChyKSA9PiByID09PSBfZXh0cmFjdG9yKTtcbiAgICAgICAgaWYgKCFleHRyYWN0b3IpIHJldHVybjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gZXh0cmFjdG9yLmlkZW50aWZpZXIgfHwgdGhpcy5zdG9yZS5maW5kS2V5KChlKSA9PiBlID09PSBleHRyYWN0b3IpITtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZGlzYWJsZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3VucmVnaXN0ZXJlZCcsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICAgICAgICBhd2FpdCBleHRyYWN0b3IuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGRlYWN0aXZhdGVkIWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdkZWFjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGZhaWxlZCB0byBkZWFjdGl2YXRlIWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMsIGV4dHJhY3RvciwgZSBhcyBFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbnJlZ2lzdGVyIGFsbCBleHRyYWN0b3JzXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXJBbGwoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnN0b3JlLm1hcCgoZSkgPT4gdGhpcy51bnJlZ2lzdGVyKGUpKSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVuIGFsbCB0aGUgZXh0cmFjdG9yc1xuICAgICAqIEBwYXJhbSBmbiBUaGUgcnVubmVyIGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIGZpbHRlckJsb2NrZWQgRmlsdGVyIGJsb2NrZWQgZXh0cmFjdG9yc1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBydW48VCA9IHVua25vd24+KGZuOiBFeHRyYWN0b3JFeGVjdXRpb25GTjxUPiwgZmlsdGVyQmxvY2tlZCA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgYmxvY2tlZCA9IHRoaXMucGxheWVyLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzID8/IFtdO1xuXG4gICAgICAgIGlmICghdGhpcy5zdG9yZS5zaXplKSB7XG4gICAgICAgICAgICBVdGlsLndhcm4oJ1NraXBwaW5nIGV4dHJhY3RvcnMgZXhlY3V0aW9uIHNpbmNlIHplcm8gZXh0cmFjdG9ycyB3ZXJlIHJlZ2lzdGVyZWQnLCAnTm9FeHRyYWN0b3JzJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzb3J0IGJ5IHByaW9yaXR5IHNvIHRoYXQgZXh0cmFjdG9ycyB3aXRoIGhpZ2hlciBwcmlvcml0eSBhcmUgZXhlY3V0ZWQgZmlyc3RcbiAgICAgICAgY29uc3QgZXh0cmFjdG9ycyA9IHRoaXMuc3RvcmUuc29ydCgoYSwgYikgPT4gYi5wcmlvcml0eSAtIGEucHJpb3JpdHkpO1xuXG4gICAgICAgIGxldCBlcnI6IEVycm9yIHwgbnVsbCA9IG51bGwsXG4gICAgICAgICAgICBsYXN0RXh0OiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgZm9yIChjb25zdCBleHQgb2YgZXh0cmFjdG9ycy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKGZpbHRlckJsb2NrZWQgJiYgYmxvY2tlZC5zb21lKChlKSA9PiBlID09PSBleHQuaWRlbnRpZmllcikpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgRXhlY3V0aW5nIGV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfS4uLmApO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oZXh0KS50aGVuKFxuICAgICAgICAgICAgICAgIChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgd2l0aCBlcnJvcjogJHtlfWApO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUeXBlVXRpbC5pc0Vycm9yKGUpID8gZSA6IG5ldyBFcnJvcihgJHtlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGxhc3RFeHQgPSBleHQ7XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgIVR5cGVVdGlsLmlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBleGVjdXRlZCBzdWNjZXNzZnVsbHkhYCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3I6IGV4dCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgICAgICAgIH0gYXMgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PFQ+O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChUeXBlVXRpbC5pc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICBlcnIgPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBleHRyYWN0b3I6IGxhc3RFeHQhLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnIsXG4gICAgICAgICAgICAgICAgcmVzdWx0OiBmYWxzZVxuICAgICAgICAgICAgfSBhcyBFeHRyYWN0b3JFeGVjdXRpb25SZXN1bHQ8ZmFsc2U+O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGV4dHJhY3RvciBpcyBkaXNhYmxlZFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0Rpc2FibGVkKGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIub3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGlkZW50aWZpZXIpID8/IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGV4dHJhY3RvciBpcyBlbmFibGVkXG4gICAgICovXG4gICAgcHVibGljIGlzRW5hYmxlZChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWQoaWRlbnRpZmllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlSWQocmVzb2x2YWJsZTogRXh0cmFjdG9yUmVzb2x2YWJsZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnID8gcmVzb2x2YWJsZSA6IHJlc29sdmFibGUuaWRlbnRpZmllcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlKHJlc29sdmFibGU6IEV4dHJhY3RvclJlc29sdmFibGUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJyA/IHRoaXMuZ2V0KHJlc29sdmFibGUpIDogcmVzb2x2YWJsZTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PFQgPSB1bmtub3duPiB7XG4gICAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yO1xuICAgIGVycm9yOiBFcnJvciB8IG51bGw7XG4gICAgcmVzdWx0OiBUO1xufVxuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JFeGVjdXRpb25GTjxUID0gdW5rbm93bj4gPSAoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiBQcm9taXNlPFQgfCBib29sZWFuPjtcblxuZXhwb3J0IHR5cGUgRXh0cmFjdG9yUmVzb2x2YWJsZSA9IHN0cmluZyB8IEJhc2VFeHRyYWN0b3I7XG4iLCAiaW1wb3J0IHsgRXF1YWxpemVyQmFuZCwgUENNRmlsdGVycywgQmlxdWFkRmlsdGVycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiwgUXVldWVTdHJhdGVneSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBHdWlsZFJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciwgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IEZpbHRlcnNOYW1lLCBRdWV1ZVJlcGVhdE1vZGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQgPSB1bmtub3duPiB7XG4gICAgc3RyYXRlZ3k/OiBRdWV1ZVN0cmF0ZWd5O1xuICAgIHZvbHVtZT86IG51bWJlcjtcbiAgICBlcXVhbGl6ZXI/OiBFcXVhbGl6ZXJCYW5kW107XG4gICAgYV9maWx0ZXI/OiBQQ01GaWx0ZXJzW107XG4gICAgYmlxdWFkPzogQmlxdWFkRmlsdGVycztcbiAgICByZXNhbXBsZXI/OiBudW1iZXI7XG4gICAgZGlzYWJsZUhpc3Rvcnk/OiBib29sZWFuO1xuICAgIG9uQmVmb3JlQ3JlYXRlU3RyZWFtPzogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/OiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICByZXBlYXRNb2RlPzogUXVldWVSZXBlYXRNb2RlO1xuICAgIHBhdXNlT25FbXB0eT86IGJvb2xlYW47XG4gICAgbGVhdmVPbkVtcHR5PzogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW1wdHlDb29sZG93bj86IG51bWJlcjtcbiAgICBsZWF2ZU9uRW5kPzogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW5kQ29vbGRvd24/OiBudW1iZXI7XG4gICAgbGVhdmVPblN0b3A/OiBib29sZWFuO1xuICAgIGxlYXZlT25TdG9wQ29vbGRvd24/OiBudW1iZXI7XG4gICAgbWV0YWRhdGE/OiBUIHwgbnVsbDtcbiAgICBzZWxmRGVhZj86IGJvb2xlYW47XG4gICAgY29ubmVjdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gICAgZGVmYXVsdEZGbXBlZ0ZpbHRlcnM/OiBGaWx0ZXJzTmFtZVtdO1xuICAgIGJ1ZmZlcmluZ1RpbWVvdXQ/OiBudW1iZXI7XG4gICAgbm9FbWl0SW5zZXJ0PzogYm9vbGVhbjtcbiAgICBtYXhTaXplPzogbnVtYmVyO1xuICAgIG1heEhpc3RvcnlTaXplPzogbnVtYmVyO1xuICAgIHByZWZlckJyaWRnZWRNZXRhZGF0YT86IGJvb2xlYW47XG4gICAgZGlzYWJsZVZvbHVtZT86IGJvb2xlYW47XG4gICAgZGlzYWJsZUVxdWFsaXplcj86IGJvb2xlYW47XG4gICAgZGlzYWJsZUZpbHRlcmVyPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlUmVzYW1wbGVyPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgTm9kZVJlc29sdmFibGUgPSBHdWlsZFF1ZXVlIHwgR3VpbGRSZXNvbHZhYmxlO1xuXG5leHBvcnQgY2xhc3MgR3VpbGROb2RlTWFuYWdlcjxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBjYWNoZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZT4oKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7fVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGd1aWxkIHF1ZXVlIGlmIGl0IGRvZXMgbm90IGV4aXN0XG4gICAgICogQHBhcmFtIGd1aWxkIFRoZSBndWlsZCB3aGljaCB3aWxsIGJlIHRoZSBvd25lciBvZiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBRdWV1ZSBpbml0aWFsaXplciBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZTxUID0gTWV0YT4oZ3VpbGQ6IEd1aWxkUmVzb2x2YWJsZSwgb3B0aW9uczogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPiA9IHt9KTogR3VpbGRRdWV1ZTxUPiB7XG4gICAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZShndWlsZCk7XG4gICAgICAgIGlmICghc2VydmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19HVUlMRCgnSW52YWxpZCBvciB1bmtub3duIGd1aWxkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jYWNoZS5oYXMoc2VydmVyLmlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHNlcnZlci5pZCkgYXMgR3VpbGRRdWV1ZTxUPjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMuc3RyYXRlZ3kgPz89ICdGSUZPJztcbiAgICAgICAgb3B0aW9ucy52b2x1bWUgPz89IDEwMDtcbiAgICAgICAgb3B0aW9ucy5lcXVhbGl6ZXIgPz89IFtdO1xuICAgICAgICBvcHRpb25zLmFfZmlsdGVyID8/PSBbXTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlSGlzdG9yeSA/Pz0gZmFsc2U7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVtcHR5ID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duID8/PSAwO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25FbmQgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duID8/PSAwO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25TdG9wID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24gPz89IDA7XG4gICAgICAgIG9wdGlvbnMucmVzYW1wbGVyID8/PSA0ODAwMDtcbiAgICAgICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICAgICAgb3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/Pz0gdGhpcy5wbGF5ZXIub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dDtcbiAgICAgICAgb3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0ID8/PSAxMDAwO1xuICAgICAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgICAgICBvcHRpb25zLm1heEhpc3RvcnlTaXplID8/PSBJbmZpbml0eTtcbiAgICAgICAgb3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGEgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuICAgICAgICAvLyB0b2RvKHR3bGl0ZSk6IG1heWJlIGRpc2FibGUgdGhlc2UgYnkgZGVmYXVsdD9cbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlQmlxdWFkID8/PSBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyID8/PSBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIgPz89IGZhbHNlO1xuICAgICAgICBvcHRpb25zLmRpc2FibGVWb2x1bWUgPz89IGZhbHNlO1xuICAgICAgICBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIgPz89IHRydWU7XG5cbiAgICAgICAgaWYgKGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpICYmICFvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtKSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoJ0Bbb25CZWZvcmVDcmVhdGVTdHJlYW1dJykgYXMgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJykgJiYgIW9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSkge1xuICAgICAgICAgICAgb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nKSBhcyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHF1ZXVlID0gbmV3IEd1aWxkUXVldWU8VD4odGhpcy5wbGF5ZXIsIHtcbiAgICAgICAgICAgIGd1aWxkOiBzZXJ2ZXIsXG4gICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5OiBvcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgICAgICAgdm9sdW1lOiBvcHRpb25zLnZvbHVtZSxcbiAgICAgICAgICAgIGVxdWFsaXplcjogb3B0aW9ucy5lcXVhbGl6ZXIsXG4gICAgICAgICAgICBmaWx0ZXJlcjogb3B0aW9ucy5hX2ZpbHRlcixcbiAgICAgICAgICAgIGJpcXVhZDogb3B0aW9ucy5iaXF1YWQsXG4gICAgICAgICAgICByZXNhbXBsZXI6IG9wdGlvbnMucmVzYW1wbGVyLFxuICAgICAgICAgICAgZGlzYWJsZUhpc3Rvcnk6IG9wdGlvbnMuZGlzYWJsZUhpc3RvcnksXG4gICAgICAgICAgICBvbkJlZm9yZUNyZWF0ZVN0cmVhbTogb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSxcbiAgICAgICAgICAgIG9uQWZ0ZXJDcmVhdGVTdHJlYW06IG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSxcbiAgICAgICAgICAgIHJlcGVhdE1vZGU6IG9wdGlvbnMucmVwZWF0TW9kZSxcbiAgICAgICAgICAgIGxlYXZlT25FbXB0eTogb3B0aW9ucy5sZWF2ZU9uRW1wdHksXG4gICAgICAgICAgICBsZWF2ZU9uRW1wdHlDb29sZG93bjogb3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93bixcbiAgICAgICAgICAgIGxlYXZlT25FbmQ6IG9wdGlvbnMubGVhdmVPbkVuZCxcbiAgICAgICAgICAgIGxlYXZlT25FbmRDb29sZG93bjogb3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24sXG4gICAgICAgICAgICBsZWF2ZU9uU3RvcDogb3B0aW9ucy5sZWF2ZU9uU3RvcCxcbiAgICAgICAgICAgIGxlYXZlT25TdG9wQ29vbGRvd246IG9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93bixcbiAgICAgICAgICAgIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLFxuICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IG9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQgPz8gMTIwXzAwMCxcbiAgICAgICAgICAgIHNlbGZEZWFmOiBvcHRpb25zLnNlbGZEZWFmLFxuICAgICAgICAgICAgZmZtcGVnRmlsdGVyczogb3B0aW9ucy5kZWZhdWx0RkZtcGVnRmlsdGVycyA/PyBbXSxcbiAgICAgICAgICAgIGJ1ZmZlcmluZ1RpbWVvdXQ6IG9wdGlvbnMuYnVmZmVyaW5nVGltZW91dCxcbiAgICAgICAgICAgIG5vRW1pdEluc2VydDogb3B0aW9ucy5ub0VtaXRJbnNlcnQgPz8gZmFsc2UsXG4gICAgICAgICAgICBwcmVmZXJCcmlkZ2VkTWV0YWRhdGE6IG9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhLFxuICAgICAgICAgICAgbWF4SGlzdG9yeVNpemU6IG9wdGlvbnMubWF4SGlzdG9yeVNpemUsXG4gICAgICAgICAgICBtYXhTaXplOiBvcHRpb25zLm1heFNpemUsXG4gICAgICAgICAgICBwYXVzZU9uRW1wdHk6IG9wdGlvbnMucGF1c2VPbkVtcHR5LFxuICAgICAgICAgICAgZGlzYWJsZUJpcXVhZDogb3B0aW9ucy5kaXNhYmxlQmlxdWFkLFxuICAgICAgICAgICAgZGlzYWJsZUVxdWFsaXplcjogb3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyLFxuICAgICAgICAgICAgZGlzYWJsZUZpbHRlcmVyOiBvcHRpb25zLmRpc2FibGVGaWx0ZXJlcixcbiAgICAgICAgICAgIGRpc2FibGVSZXNhbXBsZXI6IG9wdGlvbnMuZGlzYWJsZVJlc2FtcGxlcixcbiAgICAgICAgICAgIGRpc2FibGVWb2x1bWU6IG9wdGlvbnMuZGlzYWJsZVZvbHVtZVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNhY2hlLnNldChzZXJ2ZXIuaWQsIHF1ZXVlKTtcblxuICAgICAgICByZXR1cm4gcXVldWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGV4aXN0aW5nIHF1ZXVlXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQ8VCA9IE1ldGE+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgICAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gKHRoaXMuY2FjaGUuZ2V0KHF1ZXVlLmlkKSBhcyBHdWlsZFF1ZXVlPFQ+KSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgcXVldWUgZXhpc3RzXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBoYXMobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgaWQgPSBub2RlIGluc3RhbmNlb2YgR3VpbGRRdWV1ZSA/IG5vZGUuaWQgOiB0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmVJZChub2RlKSE7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmhhcyhpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIHF1ZXVlXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGUobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgcXVldWUgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgICAgIGlmICghcXVldWUpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX0dVSUxEX1FVRVVFKCdDYW5ub3QgZGVsZXRlIG5vbi1leGlzdGluZyBxdWV1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUuc2V0VHJhbnNpdGlvbmluZyh0cnVlKTtcbiAgICAgICAgcXVldWUubm9kZS5zdG9wKHRydWUpO1xuICAgICAgICBxdWV1ZS5jb25uZWN0aW9uPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgcXVldWUuZGlzcGF0Y2hlcj8ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHF1ZXVlLmRpc3BhdGNoZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgcXVldWUudGltZW91dHMuZm9yRWFjaCgodG0pID0+IGNsZWFyVGltZW91dCh0bSkpO1xuICAgICAgICBxdWV1ZS5oaXN0b3J5LmNsZWFyKCk7XG4gICAgICAgIHF1ZXVlLnRyYWNrcy5jbGVhcigpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmRlbGV0ZShxdWV1ZS5pZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZTxUID0gTWV0YT4obm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBHdWlsZFF1ZXVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldCh0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmVJZChub2RlKSEpIGFzIEd1aWxkUXVldWU8VD4gfCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBxdWV1ZSBpZFxuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZUlkKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHEgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgICAgIHJldHVybiBxPy5pZCB8fCBudWxsO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBQbGF5ZXIsIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnMsIFRyYWNrTGlrZSB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBDaGFubmVsVHlwZSwgR3VpbGQsIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgVm9pY2VCYXNlZENoYW5uZWwsIFZvaWNlU3RhdGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlLCBRdWV1ZVN0cmF0ZWd5IH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEJpcXVhZEZpbHRlcnMsIEVxdWFsaXplckJhbmQsIFBDTUZpbHRlcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4uL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXInO1xuaW1wb3J0IHsgdHlwZSBBdWRpb1BsYXllciwgQXVkaW9SZXNvdXJjZSwgU3RyZWFtVHlwZSwgVm9pY2VDb25uZWN0aW9uLCBWb2ljZUNvbm5lY3Rpb25TdGF0dXMgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgVXRpbCwgVkFMSURBVEVfUVVFVUVfQ0FQIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlSGlzdG9yeSB9IGZyb20gJy4vR3VpbGRRdWV1ZUhpc3RvcnknO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZVBsYXllck5vZGUsIFN0cmVhbUNvbmZpZyB9IGZyb20gJy4vR3VpbGRRdWV1ZVBsYXllck5vZGUnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZUF1ZGlvRmlsdGVycyB9IGZyb20gJy4vR3VpbGRRdWV1ZUF1ZGlvRmlsdGVycyc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSwgUXVldWVSZXBlYXRNb2RlLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAndGltZXJzJztcbmltcG9ydCB7IEd1aWxkUXVldWVTdGF0aXN0aWNzIH0gZnJvbSAnLi9HdWlsZFF1ZXVlU3RhdGlzdGljcyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuLi91dGlscy9Bc3luY1F1ZXVlJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkTm9kZUluaXQ8TWV0YSA9IHVua25vd24+IHtcbiAgICBndWlsZDogR3VpbGQ7XG4gICAgcXVldWVTdHJhdGVneTogUXVldWVTdHJhdGVneTtcbiAgICBlcXVhbGl6ZXI6IEVxdWFsaXplckJhbmRbXSB8IGJvb2xlYW47XG4gICAgdm9sdW1lOiBudW1iZXIgfCBib29sZWFuO1xuICAgIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgcmVzYW1wbGVyOiBudW1iZXIgfCBib29sZWFuO1xuICAgIGZpbHRlcmVyOiBQQ01GaWx0ZXJzW10gfCBib29sZWFuO1xuICAgIGZmbXBlZ0ZpbHRlcnM6IEZpbHRlcnNOYW1lW107XG4gICAgZGlzYWJsZUhpc3Rvcnk6IGJvb2xlYW47XG4gICAgb25CZWZvcmVDcmVhdGVTdHJlYW0/OiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgb25BZnRlckNyZWF0ZVN0cmVhbT86IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgIHJlcGVhdE1vZGU/OiBRdWV1ZVJlcGVhdE1vZGU7XG4gICAgbGVhdmVPbkVtcHR5OiBib29sZWFuO1xuICAgIGxlYXZlT25FbXB0eUNvb2xkb3duOiBudW1iZXI7XG4gICAgbGVhdmVPbkVuZDogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW5kQ29vbGRvd246IG51bWJlcjtcbiAgICBsZWF2ZU9uU3RvcDogYm9vbGVhbjtcbiAgICBsZWF2ZU9uU3RvcENvb2xkb3duOiBudW1iZXI7XG4gICAgY29ubmVjdGlvblRpbWVvdXQ6IG51bWJlcjtcbiAgICBzZWxmRGVhZj86IGJvb2xlYW47XG4gICAgbWV0YWRhdGE/OiBNZXRhIHwgbnVsbDtcbiAgICBidWZmZXJpbmdUaW1lb3V0OiBudW1iZXI7XG4gICAgbm9FbWl0SW5zZXJ0OiBib29sZWFuO1xuICAgIG1heFNpemU/OiBudW1iZXI7XG4gICAgbWF4SGlzdG9yeVNpemU/OiBudW1iZXI7XG4gICAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhOiBib29sZWFuO1xuICAgIHBhdXNlT25FbXB0eT86IGJvb2xlYW47XG4gICAgZGlzYWJsZVZvbHVtZTogYm9vbGVhbjtcbiAgICBkaXNhYmxlRXF1YWxpemVyOiBib29sZWFuO1xuICAgIGRpc2FibGVGaWx0ZXJlcjogYm9vbGVhbjtcbiAgICBkaXNhYmxlQmlxdWFkOiBib29sZWFuO1xuICAgIGRpc2FibGVSZXNhbXBsZXI6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VDb25uZWN0Q29uZmlnIHtcbiAgICBkZWFmPzogYm9vbGVhbjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuICAgIGdyb3VwPzogc3RyaW5nO1xuICAgIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdFByb2Nlc3NlZFJlc3VsdCB7XG4gICAgc3RyZWFtOiBSZWFkYWJsZTtcbiAgICB0eXBlOiBTdHJlYW1UeXBlO1xufVxuXG5leHBvcnQgdHlwZSBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgPSAodHJhY2s6IFRyYWNrLCBxdWVyeVR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSwgcXVldWU6IEd1aWxkUXVldWUpID0+IFByb21pc2U8UmVhZGFibGUgfCBudWxsPjtcbmV4cG9ydCB0eXBlIE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyID0gKHN0cmVhbTogUmVhZGFibGUsIHF1ZXVlOiBHdWlsZFF1ZXVlKSA9PiBQcm9taXNlPFBvc3RQcm9jZXNzZWRSZXN1bHQgfCBudWxsPjtcblxuZXhwb3J0IHR5cGUgUGxheWVyVHJpZ2dlcmVkUmVhc29uID0gJ2ZpbHRlcnMnIHwgJ25vcm1hbCc7XG5cbmV4cG9ydCBjb25zdCBHdWlsZFF1ZXVlRXZlbnQgPSB7XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tBZGQ6ICdhdWRpb1RyYWNrQWRkJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIHdlcmUgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgYXVkaW9UcmFja3NBZGQ6ICdhdWRpb1RyYWNrc0FkZCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrUmVtb3ZlOiAnYXVkaW9UcmFja1JlbW92ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tzUmVtb3ZlOiAnYXVkaW9UcmFja3NSZW1vdmUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY3JlYXRlZFxuICAgICAqL1xuICAgIGNvbm5lY3Rpb246ICdjb25uZWN0aW9uJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZFxuICAgICAqL1xuICAgIGNvbm5lY3Rpb25EZXN0cm95ZWQ6ICdjb25uZWN0aW9uRGVzdHJveWVkJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3Q6ICdkaXNjb25uZWN0JyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIHNlbmRzIGEgZGVidWcgaW5mb1xuICAgICAqL1xuICAgIGRlYnVnOiAnZGVidWcnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgICAqL1xuICAgIGVycm9yOiAnZXJyb3InLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2UgY2hhbm5lbCBpcyBlbXB0eVxuICAgICAqL1xuICAgIGVtcHR5Q2hhbm5lbDogJ2VtcHR5Q2hhbm5lbCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgICAqL1xuICAgIGVtcHR5UXVldWU6ICdlbXB0eVF1ZXVlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICovXG4gICAgcGxheWVyU3RhcnQ6ICdwbGF5ZXJTdGFydCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZXJyb3JzIHdoaWxlIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqL1xuICAgIHBsYXllckVycm9yOiAncGxheWVyRXJyb3InLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGZpbmlzaGVzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqL1xuICAgIHBsYXllckZpbmlzaDogJ3BsYXllckZpbmlzaCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgICAqL1xuICAgIHBsYXllclNraXA6ICdwbGF5ZXJTa2lwJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBpcyB0cmlnZ2VyZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJUcmlnZ2VyOiAncGxheWVyVHJpZ2dlcicsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBzdGF0ZSBpcyB1cGRhdGVkLiBDb25zdW1pbmcgdGhpcyBldmVudCBtYXkgZGlzYWJsZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGBQbGF5ZXIuaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpYCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICovXG4gICAgdm9pY2VTdGF0ZVVwZGF0ZTogJ3ZvaWNlU3RhdGVVcGRhdGUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB2b2x1bWUgaXMgdXBkYXRlZFxuICAgICAqL1xuICAgIHZvbHVtZUNoYW5nZTogJ3ZvbHVtZUNoYW5nZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHBsYXllciBpcyBwYXVzZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJQYXVzZTogJ3BsYXllclBhdXNlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gcGxheWVyIGlzIHJlc3VtZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJSZXN1bWU6ICdwbGF5ZXJSZXN1bWUnLFxuICAgIC8qKlxuICAgICAqIEJpcXVhZCBGaWx0ZXJzIFVwZGF0ZVxuICAgICAqL1xuICAgIGJpcXVhZEZpbHRlcnNVcGRhdGU6ICdiaXF1YWRGaWx0ZXJzVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBFcXVhbGl6ZXIgVXBkYXRlXG4gICAgICovXG4gICAgZXF1YWxpemVyVXBkYXRlOiAnZXF1YWxpemVyVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBEU1AgdXBkYXRlXG4gICAgICovXG4gICAgZHNwVXBkYXRlOiAnZHNwVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBBdWRpbyBGaWx0ZXJzIFVwZGF0ZVxuICAgICAqL1xuICAgIGF1ZGlvRmlsdGVyc1VwZGF0ZTogJ2F1ZGlvRmlsdGVyc1VwZGF0ZScsXG4gICAgLyoqXG4gICAgICogQXVkaW8gcGxheWVyIHdpbGwgcGxheSBuZXh0IHRyYWNrXG4gICAgICovXG4gICAgd2lsbFBsYXlUcmFjazogJ3dpbGxQbGF5VHJhY2snLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHZvaWNlIGNoYW5uZWwgaXMgcmVwb3B1bGF0ZWRcbiAgICAgKi9cbiAgICBjaGFubmVsUG9wdWxhdGU6ICdjaGFubmVsUG9wdWxhdGUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXG4gICAgICovXG4gICAgcXVldWVDcmVhdGU6ICdxdWV1ZUNyZWF0ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgZGVsZXRlZFxuICAgICAqL1xuICAgIHF1ZXVlRGVsZXRlOiAncXVldWVEZWxldGUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHRyeWluZyB0byBhZGQgc2ltaWxhciB0cmFjayBmb3IgYXV0b3BsYXlcbiAgICAgKi9cbiAgICB3aWxsQXV0b1BsYXk6ICd3aWxsQXV0b1BsYXknXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZW51bSBUcmFja1NraXBSZWFzb24ge1xuICAgIE5vU3RyZWFtID0gJ0VSUl9OT19TVFJFQU0nLFxuICAgIE1hbnVhbCA9ICdNQU5VQUwnLFxuICAgIFNFRUtfT1ZFUl9USFJFU0hPTEQgPSAnU0VFS19PVkVSX1RIUkVTSE9MRCcsXG4gICAgSnVtcCA9ICdKVU1QRURfVE9fQU5PVEhFUl9UUkFDSycsXG4gICAgU2tpcFRvID0gJ1NLSVBfVE9fQU5PVEhFUl9UUkFDSycsXG4gICAgSGlzdG9yeU5leHQgPSAnSElTVE9SWV9ORVhUX1RSQUNLJ1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlRXZlbnRzPE1ldGEgPSBhbnk+IHtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tBZGQ6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3Mgd2VyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2tzIFRoZSB0cmFja3MgYXJyYXlcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrc0FkZDogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2tbXSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrUmVtb3ZlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tzUmVtb3ZlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFja1tdKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY3JlYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGNvbm5lY3Rpb246IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGNvbm5lY3Rpb25EZXN0cm95ZWQ6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3Q6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIHNlbmRzIGEgZGVidWcgaW5mb1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBkZWJ1ZyBtZXNzYWdlXG4gICAgICovXG4gICAgZGVidWc6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgbWVzc2FnZTogc3RyaW5nKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcjogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBlcnJvcjogRXJyb3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgZW1wdHlDaGFubmVsOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGVtcHR5UXVldWU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAgICovXG4gICAgcGxheWVyU3RhcnQ6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAgICovXG4gICAgcGxheWVyRXJyb3I6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgZXJyb3I6IEVycm9yLCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZmluaXNoZXMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdhcyBiZWluZyBzdHJlYW1lZFxuICAgICAqL1xuICAgIHBsYXllckZpbmlzaDogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3YXMgc2tpcHBlZFxuICAgICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiBmb3Igc2tpcHBpbmdcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIGZvciBza2lwcGluZ1xuICAgICAqL1xuICAgIHBsYXllclNraXA6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrLCByZWFzb246IFRyYWNrU2tpcFJlYXNvbiwgZGVzY3JpcHRpb246IHN0cmluZykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBpcyB0cmlnZ2VyZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHdoaWNoIHdhcyBwbGF5ZWQgaW4gdGhpcyBldmVudFxuICAgICAqL1xuICAgIHBsYXllclRyaWdnZXI6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrLCByZWFzb246IFBsYXllclRyaWdnZXJlZFJlYXNvbikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIHN0YXRlIGlzIHVwZGF0ZWQuIENvbnN1bWluZyB0aGlzIGV2ZW50IG1heSBkaXNhYmxlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgYFBsYXllci5pc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKClgIHJldHVybnMgYGZhbHNlYC5cbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgICAqIEBwYXJhbSBuZXdTdGF0ZSBUaGUgbmV3IHZvaWNlIHN0YXRlXG4gICAgICovXG4gICAgdm9pY2VTdGF0ZVVwZGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHBsYXllciBpcyBwYXVzZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJQYXVzZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyBwbGF5ZXIgaXMgcmVzdW1lZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIHBsYXllclJlc3VtZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyBwbGF5ZXIncyB2b2x1bWUgaXMgY2hhbmdlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRWb2x1bWUgVGhlIG9sZCB2b2x1bWVcbiAgICAgKiBAcGFyYW0gbmV3Vm9sdW1lIFRoZSB1cGRhdGVkIHZvbHVtZVxuICAgICAqL1xuICAgIHZvbHVtZUNoYW5nZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRWb2x1bWU6IG51bWJlciwgbmV3Vm9sdW1lOiBudW1iZXIpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGVxdWFsaXplciBjb25maWcgaXMgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICAgKi9cbiAgICBlcXVhbGl6ZXJVcGRhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkRmlsdGVyczogRXF1YWxpemVyQmFuZFtdLCBuZXdGaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGJpcXVhZCBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAgICovXG4gICAgYmlxdWFkRmlsdGVyc1VwZGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRGaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzIHwgbnVsbCwgbmV3RmlsdGVyczogQmlxdWFkRmlsdGVycyB8IG51bGwpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGRzcCBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAgICovXG4gICAgZHNwVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZEZpbHRlcnM6IFBDTUZpbHRlcnNbXSwgbmV3RmlsdGVyczogUENNRmlsdGVyc1tdKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBmZm1wZWcgYXVkaW8gZmlsdGVycyBpcyB1cGRhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgICAqL1xuICAgIGF1ZGlvRmlsdGVyc1VwZGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdLCBuZXdGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdKSA9PiB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgc3RyZWFtaW5nIGFuIGF1ZGlvIHRyYWNrLiBUaGlzIGV2ZW50IGNhbiBiZSB1c2VkIHRvIG1vZGlmeSBzdHJlYW0gY29uZmlnIGJlZm9yZSBwbGF5aW5nIGEgdHJhY2suXG4gICAgICogTGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQgd2lsbCBwYXVzZSB0aGUgZXhlY3V0aW9uIG9mIGF1ZGlvIHBsYXllciB1bnRpbCBgZG9uZSgpYCBpcyBpbnZva2VkLlxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3aWxsIGJlIHN0cmVhbWVkXG4gICAgICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9ucyBmb3Igc3RyZWFtaW5nXG4gICAgICogQHBhcmFtIGRvbmUgRG9uZSBjYWxsYmFja1xuICAgICAqL1xuICAgIHdpbGxQbGF5VHJhY2s6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrPHVua25vd24+LCBjb25maWc6IFN0cmVhbUNvbmZpZywgZG9uZTogKCkgPT4gdm9pZCkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjaGFubmVsIGlzIHBvcHVsYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGNoYW5uZWxQb3B1bGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgcXVldWVDcmVhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBzdWNjZXNzZnVsbHkgZGVsZXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIHF1ZXVlRGVsZXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgdHJ5aW5nIHRvIGFkZCBzaW1pbGFyIHRyYWNrIGZvciBhdXRvcGxheVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFja3MgVGhlIHNpbWlsYXIgdHJhY2tzIHRoYXQgd2VyZSBmb3VuZFxuICAgICAqIEBwYXJhbSBkb25lIERvbmUgY2FsbGJhY2tcbiAgICAgKi9cbiAgICB3aWxsQXV0b1BsYXk6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2tzOiBUcmFja1tdLCBkb25lOiAodHJhY2s6IFRyYWNrIHwgbnVsbCkgPT4gdm9pZCkgPT4gdW5rbm93bjtcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWU8TWV0YSA9IHVua25vd24+IHtcbiAgICAjdHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICNkZWxldGVkID0gZmFsc2U7XG4gICAgI3NodWZmbGUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9fY3VycmVudDogVHJhY2sgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgdHJhY2tzOiBRdWV1ZTxUcmFjaz47XG4gICAgcHVibGljIGhpc3RvcnkgPSBuZXcgR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgbm9kZSA9IG5ldyBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhPih0aGlzKTtcbiAgICBwdWJsaWMgZmlsdGVycyA9IG5ldyBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBvbkJlZm9yZUNyZWF0ZVN0cmVhbTogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyID0gYXN5bmMgKCkgPT4gbnVsbDtcbiAgICBwdWJsaWMgb25BZnRlckNyZWF0ZVN0cmVhbTogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIgPSBhc3luYyAoc3RyZWFtKSA9PiAoe1xuICAgICAgICBzdHJlYW0sXG4gICAgICAgIHR5cGU6IFN0cmVhbVR5cGUuUmF3XG4gICAgfSk7XG4gICAgcHVibGljIHJlcGVhdE1vZGUgPSBRdWV1ZVJlcGVhdE1vZGUuT0ZGO1xuICAgIHB1YmxpYyB0aW1lb3V0cyA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgTm9kZUpTLlRpbWVvdXQ+KCk7XG4gICAgcHVibGljIHN0YXRzID0gbmV3IEd1aWxkUXVldWVTdGF0aXN0aWNzPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyB0YXNrc1F1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIsIHB1YmxpYyBvcHRpb25zOiBHdWlsZE5vZGVJbml0PE1ldGE+KSB7XG4gICAgICAgIHRoaXMudHJhY2tzID0gbmV3IFF1ZXVlPFRyYWNrPihvcHRpb25zLnF1ZXVlU3RyYXRlZ3kpO1xuICAgICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbihvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtKSkgdGhpcy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW07XG4gICAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSkpIHRoaXMub25BZnRlckNyZWF0ZVN0cmVhbSA9IG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbTtcbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc051bGxpc2gob3B0aW9ucy5yZXBlYXRNb2RlKSkgdGhpcy5yZXBlYXRNb2RlID0gb3B0aW9ucy5yZXBlYXRNb2RlO1xuXG4gICAgICAgIG9wdGlvbnMuc2VsZkRlYWYgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMubWF4U2l6ZSA/Pz0gSW5maW5pdHk7XG4gICAgICAgIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz89IEluZmluaXR5O1xuICAgICAgICBvcHRpb25zLnBhdXNlT25FbXB0eSA/Pz0gdHJ1ZTtcblxuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVsbGlzaCh0aGlzLm9wdGlvbnMuYmlxdWFkKSAmJiAhVHlwZVV0aWwuaXNCb29sZWFuKHRoaXMub3B0aW9ucy5iaXF1YWQpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkID0gdGhpcy5vcHRpb25zLmJpcXVhZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5lcXVhbGl6ZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gdGhpcy5vcHRpb25zLmVxdWFsaXplcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5maWx0ZXJlcikpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzID0gdGhpcy5vcHRpb25zLmZpbHRlcmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzTnVtYmVyKHRoaXMub3B0aW9ucy5yZXNhbXBsZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZSA9IHRoaXMub3B0aW9ucy5yZXNhbXBsZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVHlwZVV0aWwuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmZtcGVnRmlsdGVycykpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5mZm1wZWcuc2V0RGVmYXVsdHModGhpcy5vcHRpb25zLmZmbXBlZ0ZpbHRlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihvcHRpb25zLm1heFNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdbR3VpbGROb2RlSW5pdC5tYXhTaXplXScsICdudW1iZXInLCB0eXBlb2Ygb3B0aW9ucy5tYXhTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ1tHdWlsZE5vZGVJbml0Lm1heEhpc3RvcnlTaXplXScsICdudW1iZXInLCB0eXBlb2Ygb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5tYXhTaXplIDwgMSkgb3B0aW9ucy5tYXhTaXplID0gSW5maW5pdHk7XG4gICAgICAgIGlmIChvcHRpb25zLm1heEhpc3RvcnlTaXplIDwgMSkgb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA9IEluZmluaXR5O1xuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBHdWlsZFF1ZXVlIGluaXRpYWxpemVkIGZvciBndWlsZCAke3RoaXMub3B0aW9ucy5ndWlsZC5uYW1lfSAoSUQ6ICR7dGhpcy5vcHRpb25zLmd1aWxkLmlkfSlgKTtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5xdWV1ZUNyZWF0ZSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcXVldWUgaW4gbXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc3RvcmUucmVkdWNlKChhLCBjKSA9PiBhICsgYy5kdXJhdGlvbk1TLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXR0ZWQgZHVyYXRpb24gb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHVyYXRpb25Gb3JtYXR0ZWQoKSB7XG4gICAgICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgcmVjZWl2ZXIgZm9yIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZvaWNlUmVjZWl2ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LnJlY2VpdmVyID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBkZWJ1ZyBtZXNzYWdlIHRvIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gbSBUaGUgbWVzc2FnZSB0byB3cml0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWJ1ZyhtOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5kZWJ1ZywgdGhpcywgbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG1ldGFkYXRhIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1ldGFkYXRhITtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IG1ldGFkYXRhKG06IE1ldGEpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm1ldGFkYXRhID0gbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgbWV0YWRhdGEgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gbSBNZXRhZGF0YSB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0TWV0YWRhdGEobTogTWV0YSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubWV0YWRhdGEgPSBtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBjdXJyZW50IHRyYWNrIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5fX2N1cnJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoaXMgcXVldWUgd2FzIGRlbGV0ZWQgcHJldmlvdXNseVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVsZXRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2RlbGV0ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNoYW5uZWwgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2hhbm5lbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uY2hhbm5lbCB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY2hhbm5lbChjOiBWb2ljZUJhc2VkQ2hhbm5lbCB8IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcGF0Y2hlcikge1xuICAgICAgICAgICAgaWYgKGMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuY2hhbm5lbCA9IGM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb25uZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy52b2ljZUNvbm5lY3Rpb24gfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZ3VpbGQgdGhpcyBxdWV1ZSBiZWxvbmdzIHRvXG4gICAgICovXG4gICAgcHVibGljIGdldCBndWlsZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ndWlsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWxkLmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0cmFuc2l0aW9uIG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlIHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRUcmFuc2l0aW9uaW5nKHN0YXRlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuI3RyYW5zaXRpb25pbmcgPSBzdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBpZiB0aGlzIHF1ZXVlIGlzIGN1cnJlbnRseSB1bmRlciB0cmFuc2l0aW9uIG1vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNUcmFuc2l0aW9uaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHJhbnNpdGlvbmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcmVwZWF0IG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gbW9kZSBUaGUgcmVwZWF0IG1vZGUgdG8gYXBwbHlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0UmVwZWF0TW9kZShtb2RlOiBRdWV1ZVJlcGVhdE1vZGUpIHtcbiAgICAgICAgdGhpcy5yZXBlYXRNb2RlID0gbW9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXggc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBtYXhTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1heFNpemUgPz8gSW5maW5pdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWF4IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNYXhTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhTaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBtYXhIaXN0b3J5U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA/PyBJbmZpbml0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXggaGlzdG9yeSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TWF4SGlzdG9yeVNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1heEhpc3RvcnlTaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBtYXggaGlzdG9yeSBzaXplIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldE1heEhpc3RvcnlTaXplKHNpemU6IG51bWJlcikge1xuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKHNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdzaXplJywgJ251bWJlcicsIHR5cGVvZiBzaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaXplIDwgMSkgc2l6ZSA9IEluZmluaXR5O1xuXG4gICAgICAgIHRoaXMub3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA9IHNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1heCBzaXplIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldE1heFNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIoc2l6ZSkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3NpemUnLCAnbnVtYmVyJywgdHlwZW9mIHNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNpemUgPCAxKSBzaXplID0gSW5maW5pdHk7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zLm1heFNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoaXMgcXVldWUgaGFzIG5vIHRyYWNrcyBsZWZ0IGluIGl0XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGlzIGZ1bGxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNGdWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA+PSB0aGlzLm1heFNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHF1ZXVlIGNhcGFjaXR5XG4gICAgICovXG4gICAgcHVibGljIGdldENhcGFjaXR5KCkge1xuICAgICAgICBpZiAodGhpcy5pc0Z1bGwoKSkgcmV0dXJuIDA7XG4gICAgICAgIGNvbnN0IGNhcCA9IHRoaXMubWF4U2l6ZSAtIHRoaXMuc2l6ZTtcbiAgICAgICAgcmV0dXJuIGNhcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGN1cnJlbnRseSBob2xkcyBhY3RpdmUgYXVkaW8gcmVzb3VyY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNQbGF5aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlICE9IG51bGwgJiYgIXRoaXMuZGlzcGF0Y2hlci5hdWRpb1Jlc291cmNlLmVuZGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCB0cmFjayB0byB0aGUgcXVldWUuIFRoaXMgd2lsbCBlbWl0IGBhdWRpb1RyYWNrc0FkZGAgd2hlbiBtdWx0aXBsZSB0cmFja3MgYXJlIGFkZGVkLCBvdGhlcndpc2UgYGF1ZGlvVHJhY2tBZGRgLlxuICAgICAqIEBwYXJhbSB0cmFjayBUcmFjayBvciBwbGF5bGlzdCBvciBhcnJheSBvZiB0cmFja3MgdG8gYWRkXG4gICAgICovXG4gICAgcHVibGljIGFkZFRyYWNrKHRyYWNrOiBUcmFjayB8IFRyYWNrW10gfCBQbGF5bGlzdCkge1xuICAgICAgICBjb25zdCB0b0FkZCA9IHRyYWNrIGluc3RhbmNlb2YgUGxheWxpc3QgPyB0cmFjay50cmFja3MgOiB0cmFjaztcbiAgICAgICAgY29uc3QgaXNNdWx0aSA9IEFycmF5LmlzQXJyYXkodG9BZGQpO1xuXG4gICAgICAgIFZBTElEQVRFX1FVRVVFX0NBUCh0aGlzLCB0b0FkZCk7XG5cbiAgICAgICAgdGhpcy50cmFja3MuYWRkKHRvQWRkKTtcblxuICAgICAgICBpZiAoaXNNdWx0aSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb1RyYWNrc0FkZCwgdGhpcywgdG9BZGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb1RyYWNrQWRkLCB0aGlzLCB0b0FkZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSB0cmFjayBmcm9tIHF1ZXVlXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZW1vdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlVHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnJlbW92ZSh0cmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyB0aGUgdHJhY2sgdG8gdGhlIGdpdmVuIGluZGV4XG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBpbnNlcnRcbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIGluc2VydCB0aGUgdHJhY2sgYXQgKGRlZmF1bHRzIHRvIDApXG4gICAgICovXG4gICAgcHVibGljIGluc2VydFRyYWNrKHRyYWNrOiBUcmFjaywgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUuaW5zZXJ0KHRyYWNrLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gbW92ZVxuICAgICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gbW92ZSB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBtb3ZlVHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSwgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUubW92ZSh0cmFjaywgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcHkgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gY2xvbmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIGNsb25lIGF0XG4gICAgICovXG4gICAgcHVibGljIGNvcHlUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5jb3B5KHRyYWNrLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3dhcCB0d28gdHJhY2tzIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBzcmMgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICAgKiBAcGFyYW0gZGVzdCBUaGUgc2Vjb25kIHRyYWNrIHRvIHN3YXBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3dhcFRyYWNrcyhzcmM6IFRyYWNrUmVzb2x2YWJsZSwgZGVzdDogVHJhY2tSZXNvbHZhYmxlKTogdm9pZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUuc3dhcChzcmMsIGRlc3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBzdHJlYW0gZGlzcGF0Y2hlciBmcm9tIHRoZSBnaXZlbiBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gdXNlXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZURpc3BhdGNoZXIoY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uLCBvcHRpb25zOiBQaWNrPFZvaWNlQ29ubmVjdENvbmZpZywgJ2F1ZGlvUGxheWVyJyB8ICd0aW1lb3V0Jz4gPSB7fSkge1xuICAgICAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX1ZPSUNFX0NPTk5FQ1RJT05fREVTVFJPWUVEKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5wbGF5ZXIuY2xpZW50LmNoYW5uZWxzLmNhY2hlLmdldChjb25uZWN0aW9uLmpvaW5Db25maWcuY2hhbm5lbElkISk7XG4gICAgICAgIGlmICghY2hhbm5lbCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fVk9JQ0VfQ0hBTk5FTCgpO1xuICAgICAgICBpZiAoIWNoYW5uZWwuaXNWb2ljZUJhc2VkKCkpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2NoYW5uZWwnLCBgVm9pY2VCYXNlZENoYW5uZWwgKHR5cGUgJHtDaGFubmVsVHlwZS5HdWlsZFZvaWNlfS8ke0NoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZX0pYCwgU3RyaW5nKGNoYW5uZWw/LnR5cGUpKTtcblxuICAgICAgICBpZiAodGhpcy5kaXNwYXRjaGVyKSB7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVMaXN0ZW5lcnModGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbmV3IFN0cmVhbURpc3BhdGNoZXIoY29ubmVjdGlvbiwgY2hhbm5lbCwgdGhpcywgb3B0aW9ucy50aW1lb3V0ID8/IHRoaXMub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCwgb3B0aW9ucy5hdWRpb1BsYXllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0gY2hhbm5lbFJlc29sdmFibGUgVGhlIHZvaWNlIGNoYW5uZWwgdG8gY29ubmVjdCB0b1xuICAgICAqIEBwYXJhbSBvcHRpb25zIEpvaW4gY29uZmlnXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNvbm5lY3QoY2hhbm5lbFJlc29sdmFibGU6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgb3B0aW9uczogVm9pY2VDb25uZWN0Q29uZmlnID0ge30pIHtcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucGxheWVyLmNsaWVudC5jaGFubmVscy5yZXNvbHZlKGNoYW5uZWxSZXNvbHZhYmxlKTtcbiAgICAgICAgaWYgKCFjaGFubmVsIHx8ICFjaGFubmVsLmlzVm9pY2VCYXNlZCgpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdjaGFubmVsJywgYFZvaWNlQmFzZWRDaGFubmVsICh0eXBlICR7Q2hhbm5lbFR5cGUuR3VpbGRWb2ljZX0vJHtDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2V9KWAsIFN0cmluZyhjaGFubmVsPy50eXBlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ29ubmVjdGluZyB0byAke2NoYW5uZWwudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlID8gJ3N0YWdlJyA6ICd2b2ljZSd9IGNoYW5uZWwgJHtjaGFubmVsLm5hbWV9IChJRDogJHtjaGFubmVsLmlkfSlgKTtcblxuICAgICAgICBpZiAodGhpcy5kaXNwYXRjaGVyICYmIGNoYW5uZWwuaWQgIT09IHRoaXMuZGlzcGF0Y2hlci5jaGFubmVsLmlkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRGVzdHJveWluZyBvbGQgY29ubmVjdGlvbicpO1xuICAgICAgICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IGF3YWl0IHRoaXMucGxheWVyLnZvaWNlVXRpbHMuY29ubmVjdChjaGFubmVsLCB7XG4gICAgICAgICAgICBkZWFmOiBvcHRpb25zLmRlYWYgPz8gdGhpcy5vcHRpb25zLnNlbGZEZWFmID8/IHRydWUsXG4gICAgICAgICAgICBtYXhUaW1lOiBvcHRpb25zPy50aW1lb3V0ID8/IHRoaXMub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/PyAxMjBfMDAwLFxuICAgICAgICAgICAgcXVldWU6IHRoaXMsXG4gICAgICAgICAgICBhdWRpb1BsYXllcjogb3B0aW9ucz8uYXVkaW9QbGF5ZXIsXG4gICAgICAgICAgICBncm91cDogb3B0aW9ucy5ncm91cCA/PyB0aGlzLnBsYXllci5jbGllbnQudXNlcj8uaWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5jb25uZWN0aW9uLCB0aGlzKTtcblxuICAgICAgICBpZiAodGhpcy5jaGFubmVsIS50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hhbm5lbCEuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0U3VwcHJlc3NlZChmYWxzZSkuY2F0Y2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNoYW5uZWwhLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldFJlcXVlc3RUb1NwZWFrKHRydWUpLmNhdGNoKFV0aWwubm9vcCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuI2F0dGFjaExpc3RlbmVycyh0aGlzLmRpc3BhdGNoZXIpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSBzaHVmZmxlIG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gZHluYW1pYyBXaGV0aGVyIHRvIHNodWZmbGUgdGhlIHF1ZXVlIGR5bmFtaWNhbGx5LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogRHluYW1pYyBzaHVmZmxpbmcgd2lsbCBzaHVmZmxlIHRoZSBxdWV1ZSB3aGVuIHRoZSBjdXJyZW50IHRyYWNrIGVuZHMsIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHF1ZXVlLlxuICAgICAqIElmIHNldCB0byBgZmFsc2VgLCB0aGUgcXVldWUgd2lsbCBiZSBzaHVmZmxlZCBpbW1lZGlhdGVseSBpbi1wbGFjZSwgd2hpY2ggY2Fubm90IGJlIHVuZG9uZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZW5hYmxlU2h1ZmZsZShkeW5hbWljID0gdHJ1ZSkge1xuICAgICAgICBpZiAoIWR5bmFtaWMpIHtcbiAgICAgICAgICAgIHRoaXMudHJhY2tzLnNodWZmbGUoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4jc2h1ZmZsZSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBkaXNhYmxlU2h1ZmZsZSgpIHtcbiAgICAgICAgdGhpcy4jc2h1ZmZsZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlLlxuICAgICAqIEBwYXJhbSBkeW5hbWljIFdoZXRoZXIgdG8gc2h1ZmZsZSB0aGUgcXVldWUgZHluYW1pY2FsbHkuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHNodWZmbGUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlU2h1ZmZsZShkeW5hbWljID0gdHJ1ZSkge1xuICAgICAgICBpZiAoZHluYW1pYykge1xuICAgICAgICAgICAgdGhpcy4jc2h1ZmZsZSA9ICF0aGlzLiNzaHVmZmxlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI3NodWZmbGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrcy5zaHVmZmxlKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgc2h1ZmZsZSBtb2RlIGlzIGVuYWJsZWQgZm9yIHRoaXMgcXVldWUuXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1NodWZmbGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3NodWZmbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gbGF0ZW5jeSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uPy5waW5nLnVkcCA/PyAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXllci5ub2Rlcy5kZWxldGUodGhpcy5pZCkpIHtcbiAgICAgICAgICAgIHRoaXMuI2RlbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnF1ZXVlRGVsZXRlLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMubm9kZS50YXNrc1F1ZXVlLmNhbmNlbEFsbCgpO1xuICAgICAgICAgICAgdGhpcy50YXNrc1F1ZXVlLmNhbmNlbEFsbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2aXZlcyB0aGlzIHF1ZXVlXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmV2aXZlKCkge1xuICAgICAgICBpZiAoIXRoaXMuZGVsZXRlZCB8fCB0aGlzLnBsYXllci5ub2Rlcy5oYXModGhpcy5pZCkpIHJldHVybjtcbiAgICAgICAgdGhpcy4jZGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgICAgICB0aGlzLnBsYXllci5ub2Rlcy5jYWNoZS5zZXQodGhpcy5pZCwgdGhpcyk7XG4gICAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5xdWV1ZUNyZWF0ZSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHNlbGYgZGVhZlxuICAgICAqIEBwYXJhbSBtb2RlIE9uL09mZiBzdGF0ZVxuICAgICAqIEBwYXJhbSByZWFzb24gUmVhc29uXG4gICAgICovXG4gICAgcHVibGljIHNldFNlbGZEZWFmKG1vZGU/OiBib29sZWFuLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0RGVhZihtb2RlLCByZWFzb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBzZWxmIG11dGVcbiAgICAgKiBAcGFyYW0gbW9kZSBPbi9PZmYgc3RhdGVcbiAgICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvblxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRTZWxmTXV0ZShtb2RlPzogYm9vbGVhbiwgcmVhc29uPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldE11dGUobW9kZSwgcmVhc29uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IGEgdHJhY2sgaW4gdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYmUgcGxheWVkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIG5vZGUgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5KHRyYWNrOiBUcmFja0xpa2UsIG9wdGlvbnM/OiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPE1ldGE+KSB7XG4gICAgICAgIGlmICghdGhpcy5jaGFubmVsKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19WT0lDRV9DT05ORUNUSU9OKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyLnBsYXkodGhpcy5jaGFubmVsLCB0cmFjaywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdCBhbiBldmVudCBvbiB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBlbWl0XG4gICAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3MgZm9yIHRoZSBldmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBHdWlsZFF1ZXVlRXZlbnRzPE1ldGE+PihldmVudDogSywgLi4uYXJnczogUGFyYW1ldGVyczxHdWlsZFF1ZXVlRXZlbnRzPE1ldGE+W0tdPik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5kZWxldGVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5ldmVudHMuZW1pdChldmVudCwgLi4uYXJncyk7XG4gICAgfVxuXG4gICAgI2F0dGFjaExpc3RlbmVycyhkaXNwYXRjaGVyOiBTdHJlYW1EaXNwYXRjaGVyKSB7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2Vycm9yJywgKGUpID0+IHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZXJyb3IsIHRoaXMsIGUpKTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignZGVidWcnLCAobSkgPT4gdGhpcy5oYXNEZWJ1Z2dlciAmJiB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmRlYnVnLCB0aGlzLCBtKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2ZpbmlzaCcsIChyKSA9PiB0aGlzLiNwZXJmb3JtRmluaXNoKHIpKTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignc3RhcnQnLCAocikgPT4gdGhpcy4jcGVyZm9ybVN0YXJ0KHIpKTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignZGVzdHJveWVkJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKGRpc3BhdGNoZXIpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2RzcCcsIChmKSA9PiB7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5pcyh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycywgZikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmRzcFVwZGF0ZSwgdGhpcywgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsIGYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMgPSBmO1xuICAgICAgICB9KTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignYmlxdWFkJywgKGYpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkICE9PSBmKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5iaXF1YWRGaWx0ZXJzVXBkYXRlLCB0aGlzLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkLCBmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgPSBmO1xuICAgICAgICB9KTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignZXFCYW5kcycsIChmKSA9PiB7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5pcyhmLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZXF1YWxpemVyVXBkYXRlLCB0aGlzLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyLCBmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIgPSBmO1xuICAgICAgICB9KTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbigndm9sdW1lJywgKGYpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lICE9PSBmKSB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnZvbHVtZUNoYW5nZSwgdGhpcywgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSwgZik7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lID0gZjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNEZWJ1Z2dlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyLmV2ZW50cy5oYXNEZWJ1Z2dlcjtcbiAgICB9XG5cbiAgICAjcmVtb3ZlTGlzdGVuZXJzPFQgZXh0ZW5kcyB7IHJlbW92ZUFsbExpc3RlbmVyczogKCkgPT4gdW5rbm93biB9Pih0YXJnZXQ6IFQpIHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIH1cblxuICAgICNwZXJmb3JtU3RhcnQocmVzb3VyY2U/OiBBdWRpb1Jlc291cmNlPFRyYWNrPikge1xuICAgICAgICBjb25zdCB0cmFjayA9IHJlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLmN1cnJlbnRUcmFjaztcbiAgICAgICAgY29uc3QgcmVhc29uID0gdGhpcy5pc1RyYW5zaXRpb25pbmcoKSA/ICdmaWx0ZXJzJyA6ICdub3JtYWwnO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgUGxheWVyIHRyaWdnZXJlZCBmb3IgVHJhY2sgJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0cmFjaz8udGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgICAgIH0pfWBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJUcmlnZ2VyLCB0aGlzLCB0cmFjayEsIHJlYXNvbik7XG4gICAgICAgIGlmICh0cmFjayAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcoKSkgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJTdGFydCwgdGhpcywgdHJhY2spO1xuICAgICAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgIH1cblxuICAgICNnZXROZXh0VHJhY2soKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1NodWZmbGluZykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdG9yZSA9IHRoaXMudHJhY2tzLnN0b3JlO1xuXG4gICAgICAgIGlmICghc3RvcmUubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgdHJhY2sgPSBVdGlsLnJhbmRvbUNob2ljZShzdG9yZSk7XG5cbiAgICAgICAgdGhpcy50cmFja3MucmVtb3ZlT25lKCh0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdC5pZCA9PT0gdHJhY2suaWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0cmFjaztcbiAgICB9XG5cbiAgICAjcGVyZm9ybUZpbmlzaChyZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gcmVzb3VyY2U/Lm1ldGFkYXRhIHx8IHRoaXMuY3VycmVudFRyYWNrO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgVHJhY2sgJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0cmFjaz8udGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIGlzVHJhbnNpdGlvbk1vZGU6IHRoaXMuaXNUcmFuc2l0aW9uaW5nKClcbiAgICAgICAgICAgICAgICB9KX0gd2FzIG1hcmtlZCBhcyBmaW5pc2hlZGBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRyYWNrICYmICF0aGlzLmlzVHJhbnNpdGlvbmluZygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnQWRkaW5nIHRyYWNrIHRvIGhpc3RvcnkgYW5kIGVtaXR0aW5nIGZpbmlzaCBldmVudCBzaW5jZSB0cmFuc2l0aW9uIG1vZGUgaXMgZGlzYWJsZWQuLi4nKTtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKHRyYWNrKTtcbiAgICAgICAgICAgIHRoaXMubm9kZS5yZXNldFByb2dyZXNzKCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllckZpbmlzaCwgdGhpcywgdHJhY2spO1xuICAgICAgICAgICAgaWYgKHRoaXMuI2RlbGV0ZWQpIHJldHVybiB0aGlzLiNlbWl0RW5kKCk7XG4gICAgICAgICAgICBpZiAodGhpcy50cmFja3Muc2l6ZSA8IDEgJiYgdGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuT0ZGKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ05vIG1vcmUgdHJhY2tzIGxlZnQgaW4gdGhlIHF1ZXVlIHRvIHBsYXkgYW5kIHJlcGVhdCBtb2RlIGlzIG9mZiwgaW5pdGlhdGluZyAjZW1pdEVuZCgpJyk7XG4gICAgICAgICAgICAgICAgdGhpcy4jZW1pdEVuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuVFJBQ0spIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ1JlcGVhdCBtb2RlIGlzIHNldCB0byB0cmFjaywgcmVwZWF0aW5nIGxhc3QgdHJhY2sgZnJvbSB0aGUgaGlzdG9yeS4uLicpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9fY3VycmVudCA9IHRoaXMuaGlzdG9yeS50cmFja3MuZGlzcGF0Y2goKSB8fCB0cmFjaztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50ISwgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5RVUVVRSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHF1ZXVlLCBtb3ZpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5IHRvIGN1cnJlbnQgcXVldWUuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFja3MuYWRkKHRoaXMuaGlzdG9yeS50cmFja3MuZGlzcGF0Y2goKSB8fCB0cmFjayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy50cmFja3Muc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuQVVUT1BMQVkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gYXV0b3BsYXksIGluaXRpYXRpbmcgYXV0b3BsYXkgaGFuZGxlci4uLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jaGFuZGxlQXV0b3BsYXkodHJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0luaXRpYWxpemluZyBuZXh0IHRyYWNrIG9mIHRoZSBxdWV1ZS4uLicpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9fY3VycmVudCA9IHRoaXMuI2dldE5leHRUcmFjaygpITtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLnBsYXkodGhpcy5fX2N1cnJlbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAjZW1pdEVuZCgpIHtcbiAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVtcHR5UXVldWUsIHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxlYXZlT25FbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRtOiBOb2RlSlMuVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUGxheWluZygpKSByZXR1cm4gY2xlYXJUaW1lb3V0KHRtKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24pLnVucmVmKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyAjaGFuZGxlQXV0b3BsYXkodHJhY2s6IFRyYWNrKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQXV0b3BsYXkgPj4gRmluZGluZyByZWxhdGVkIHRyYWNrcyBmb3IgVHJhY2sgJHt0cmFjay50aXRsZX0gKCR7dHJhY2sudXJsfSkgW2V4dDoke3RyYWNrLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ31dYCk7XG4gICAgICAgICAgICBjb25zdCB0cmFja3MgPVxuICAgICAgICAgICAgICAgIChhd2FpdCB0cmFjay5leHRyYWN0b3I/LmdldFJlbGF0ZWRUcmFja3ModHJhY2ssIHRoaXMuaGlzdG9yeSkpPy50cmFja3MgfHxcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGxheWVyLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBRdWVyeWluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGV4dC5nZXRSZWxhdGVkVHJhY2tzKHRyYWNrLCB0aGlzLmhpc3RvcnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXMudHJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gZmFpbGVkIHRvIHByb3ZpZGUgcmVzdWx0cy5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gc3VjY2Vzc2Z1bGx5IHJldHVybmVkIHJlc3VsdHMuYCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMudHJhY2tzO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk/LnJlc3VsdCB8fFxuICAgICAgICAgICAgICAgIFtdO1xuXG4gICAgICAgICAgICBsZXQgcmVzb2x2ZXI6ICh0cmFjazogVHJhY2sgfCBudWxsKSA9PiB2b2lkID0gVXRpbC5ub29wO1xuICAgICAgICAgICAgY29uc3QgZG9uZVByb21pc2UgPSBuZXcgUHJvbWlzZTxUcmFjayB8IG51bGw+KChyZXNvbHZlKSA9PiAocmVzb2x2ZXIgPSByZXNvbHZlKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LndpbGxBdXRvUGxheSwgdGhpcywgdHJhY2tzLCByZXNvbHZlciEpO1xuXG4gICAgICAgICAgICAvLyBwcmV2ZW50IGRhbmdsaW5nIHByb21pc2VcbiAgICAgICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHJlc29sdmVyKFxuICAgICAgICAgICAgICAgICAgICB0cmFja3MubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlxdWUgPSB0cmFja3MuZmlsdGVyKCh0cikgPT4gIXRoaXMuaGlzdG9yeS50cmFja3MuZmluZCgodCkgPT4gdC51cmwgPT09IHRyLnVybCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuaXF1ZT8uWzBdID8/IFV0aWwucmFuZG9tQ2hvaWNlKHRyYWNrcy5zbGljZSgwLCA1KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5leHRUcmFjayA9IGF3YWl0IGRvbmVQcm9taXNlO1xuXG4gICAgICAgICAgICBpZiAoIW5leHRUcmFjaykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdBdXRvcGxheSA+PiBObyB0cmFjayB3YXMgZm91bmQsIGluaXRpYXRpbmcgI2VtaXRFbmQoKScpO1xuICAgICAgICAgICAgICAgIHRocm93ICdObyB0cmFjayB3YXMgZm91bmQnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm5vZGUucGxheShuZXh0VHJhY2ssIHtcbiAgICAgICAgICAgICAgICBxdWV1ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2VlazogMCxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uTW9kZTogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNlbWl0RW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgICBBdWRpb1BsYXllcixcbiAgICBBdWRpb1BsYXllckVycm9yLFxuICAgIEF1ZGlvUGxheWVyU3RhdHVzLFxuICAgIEF1ZGlvUmVzb3VyY2UsXG4gICAgY3JlYXRlQXVkaW9QbGF5ZXIsXG4gICAgY3JlYXRlQXVkaW9SZXNvdXJjZSxcbiAgICBlbnRlcnNTdGF0ZSxcbiAgICBTdHJlYW1UeXBlLFxuICAgIFZvaWNlQ29ubmVjdGlvbixcbiAgICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMsXG4gICAgVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvblxufSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgU3RhZ2VDaGFubmVsLCBWb2ljZUNoYW5uZWwgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB0eXBlIHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IEVxdWFsaXplckJhbmQsIEJpcXVhZEZpbHRlcnMsIFBDTUZpbHRlcnMsIEZpbHRlcnNDaGFpbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50LCBQb3N0UHJvY2Vzc2VkUmVzdWx0IH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBWb2ljZVJlY2VpdmVyTm9kZSB9IGZyb20gJy4uL21hbmFnZXIvVm9pY2VSZWNlaXZlck5vZGUnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlU3RyZWFtT3BzIHtcbiAgICB0eXBlPzogU3RyZWFtVHlwZTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGRhdGE/OiBhbnk7XG4gICAgZGlzYWJsZVZvbHVtZT86IGJvb2xlYW47XG4gICAgZGlzYWJsZUVxdWFsaXplcj86IGJvb2xlYW47XG4gICAgZGlzYWJsZUJpcXVhZD86IGJvb2xlYW47XG4gICAgZXE/OiBFcXVhbGl6ZXJCYW5kW107XG4gICAgYmlxdWFkRmlsdGVyPzogQmlxdWFkRmlsdGVycztcbiAgICBkaXNhYmxlRmlsdGVycz86IGJvb2xlYW47XG4gICAgZGVmYXVsdEZpbHRlcnM/OiBQQ01GaWx0ZXJzW107XG4gICAgdm9sdW1lPzogbnVtYmVyO1xuICAgIGRpc2FibGVSZXNhbXBsZXI/OiBib29sZWFuO1xuICAgIHNhbXBsZVJhdGU/OiBudW1iZXI7XG4gICAgc2tpcEZGbXBlZz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VFdmVudHMge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbiAgICBlcnJvcjogKGVycm9yOiBBdWRpb1BsYXllckVycm9yKSA9PiBhbnk7XG4gICAgZGVidWc6IChtZXNzYWdlOiBzdHJpbmcpID0+IGFueTtcbiAgICBzdGFydDogKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPikgPT4gYW55O1xuICAgIGZpbmlzaDogKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPikgPT4gYW55O1xuICAgIGRzcDogKGZpbHRlcnM6IFBDTUZpbHRlcnNbXSkgPT4gYW55O1xuICAgIGVxQmFuZHM6IChmaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10pID0+IGFueTtcbiAgICBzYW1wbGVSYXRlOiAoZmlsdGVyczogbnVtYmVyKSA9PiBhbnk7XG4gICAgYmlxdWFkOiAoZmlsdGVyczogQmlxdWFkRmlsdGVycykgPT4gYW55O1xuICAgIHZvbHVtZTogKHZvbHVtZTogbnVtYmVyKSA9PiBhbnk7XG4gICAgZGVzdHJveWVkOiAoKSA9PiBhbnk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG59XG5cbmNsYXNzIFN0cmVhbURpc3BhdGNoZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXI8Vm9pY2VFdmVudHM+IHtcbiAgICBwdWJsaWMgdm9pY2VDb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb247XG4gICAgcHVibGljIGF1ZGlvUGxheWVyOiBBdWRpb1BsYXllcjtcbiAgICBwdWJsaWMgcmVjZWl2ZXIgPSBuZXcgVm9pY2VSZWNlaXZlck5vZGUodGhpcyk7XG4gICAgcHVibGljIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbDtcbiAgICBwdWJsaWMgYXVkaW9SZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+IHwgbnVsbDtcbiAgICBwdWJsaWMgZHNwID0gbmV3IEZpbHRlcnNDaGFpbigpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgY29ubmVjdGlvbiBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1ZvaWNlQ29ubmVjdGlvbn0gY29ubmVjdGlvbiBUaGUgY29ubmVjdGlvblxuICAgICAqIEBwYXJhbSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH0gY2hhbm5lbCBUaGUgY29ubmVjdGVkIGNoYW5uZWxcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbiwgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsLCBwdWJsaWMgcXVldWU6IEd1aWxkUXVldWUsIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uVGltZW91dDogbnVtYmVyID0gMjAwMDAsIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgICAgICogQHR5cGUge1ZvaWNlQ29ubmVjdGlvbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uID0gY29ubmVjdGlvbjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGF1ZGlvIHBsYXllclxuICAgICAgICAgKiBAdHlwZSB7QXVkaW9QbGF5ZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmF1ZGlvUGxheWVyID1cbiAgICAgICAgICAgIGF1ZGlvUGxheWVyIHx8XG4gICAgICAgICAgICBjcmVhdGVBdWRpb1BsYXllcih7XG4gICAgICAgICAgICAgICAgZGVidWc6IHRoaXMucXVldWUuaGFzRGVidWdnZXJcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdm9pY2UgY2hhbm5lbFxuICAgICAgICAgKiBAdHlwZSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7XG5cbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ub24oJ2RlYnVnJywgKG0pID0+IHZvaWQgdGhpcy5lbWl0KCdkZWJ1ZycsIG0pKTtcbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ub24oJ2Vycm9yJywgKGVycm9yKSA9PiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvciBhcyBBdWRpb1BsYXllckVycm9yKSk7XG4gICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ2RlYnVnJywgKG0pID0+IHZvaWQgdGhpcy5lbWl0KCdkZWJ1ZycsIG0pKTtcbiAgICAgICAgdGhpcy5hdWRpb1BsYXllci5vbignZXJyb3InLCAoZXJyb3IpID0+IHZvaWQgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKSk7XG5cbiAgICAgICAgdGhpcy5kc3Aub25VcGRhdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZHNwKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodGhpcy5kc3AuZmlsdGVycz8uZmlsdGVycykgdGhpcy5lbWl0KCdkc3AnLCB0aGlzLmRzcC5maWx0ZXJzPy5maWx0ZXJzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRzcC5iaXF1YWQ/LmZpbHRlcikgdGhpcy5lbWl0KCdiaXF1YWQnLCB0aGlzLmRzcC5iaXF1YWQ/LmZpbHRlcik7XG4gICAgICAgICAgICBpZiAodGhpcy5kc3AuZXF1YWxpemVyKSB0aGlzLmVtaXQoJ2VxQmFuZHMnLCB0aGlzLmRzcC5lcXVhbGl6ZXIuZ2V0RVEoKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5kc3Audm9sdW1lKSB0aGlzLmVtaXQoJ3ZvbHVtZScsIHRoaXMuZHNwLnZvbHVtZS52b2x1bWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHNwLnJlc2FtcGxlcikgdGhpcy5lbWl0KCdzYW1wbGVSYXRlJywgdGhpcy5kc3AucmVzYW1wbGVyLnRhcmdldFNhbXBsZVJhdGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZHNwLm9uRXJyb3IgPSAoZSkgPT4gdGhpcy5lbWl0KCdlcnJvcicsIGUgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG5cbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb25cbiAgICAgICAgICAgIC5vbihWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGlzY29ubmVjdGVkLCBhc3luYyAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlLnJlYXNvbiA9PT0gVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvbi5NYW51YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUucmVhc29uID09PSBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uLldlYlNvY2tldENsb3NlICYmIG5ld1N0YXRlLmNsb3NlQ29kZSA9PT0gNDAxNCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUodGhpcy52b2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nLCB0aGlzLmNvbm5lY3Rpb25UaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVyciBhcyBBdWRpb1BsYXllckVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luQXR0ZW1wdHMgPCA1KSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IFV0aWwud2FpdCgodGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luQXR0ZW1wdHMgKyAxKSAqIDUwMDApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZWpvaW4oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVyciBhcyBBdWRpb1BsYXllckVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5jb25uZWN0aW9uRGVzdHJveWVkLCB0aGlzLnF1ZXVlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ3N0YXRlQ2hhbmdlJywgKG9sZFN0YXRlLCBuZXdTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG9sZFN0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkICYmIG5ld1N0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJQYXVzZSwgdGhpcy5xdWV1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvbGRTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZCAmJiBuZXdTdGF0ZS5zdGF0dXMgIT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyUmVzdW1lLCB0aGlzLnF1ZXVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5ld1N0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGxheWluZykge1xuICAgICAgICAgICAgICAgIGlmIChvbGRTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGUgfHwgb2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5CdWZmZXJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnc3RhcnQnLCB0aGlzLmF1ZGlvUmVzb3VyY2UhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZSAmJiBvbGRTdGF0ZS5zdGF0dXMgIT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2ZpbmlzaCcsIHRoaXMuYXVkaW9SZXNvdXJjZSEpO1xuICAgICAgICAgICAgICAgIHRoaXMuZHNwLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvUmVzb3VyY2UgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdWJzY3JpYmUodGhpcy5hdWRpb1BsYXllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIHBsYXllciBoYXMgYmVlbiBwYXVzZWQgbWFudWFsbHlcbiAgICAgKi9cbiAgICBnZXQgcGF1c2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZDtcbiAgICB9XG5cbiAgICBzZXQgcGF1c2VkKHZhbDogYm9vbGVhbikge1xuICAgICAgICB2YWwgPyB0aGlzLnBhdXNlKHRydWUpIDogdGhpcy5yZXN1bWUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBwYXVzZWQgYXV0b21hdGljYWxseSBvciBtYW51YWxseS5cbiAgICAgKi9cbiAgICBpc1BhdXNlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGF1c2VkIHx8IHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5BdXRvUGF1c2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGJ1ZmZlcmluZ1xuICAgICAqL1xuICAgIGlzQnVmZmVyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLkJ1ZmZlcmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBwbGF5aW5nXG4gICAgICovXG4gICAgaXNQbGF5aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBsYXlpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgaWRsZVxuICAgICAqL1xuICAgIGlzSWRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGhhcyBiZWVuIGRlc3Ryb3llZFxuICAgICAqL1xuICAgIGlzRGVzdHJveWVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGhhcyBiZWVuIGRlc3Ryb3llZFxuICAgICAqL1xuICAgIGlzRGlzY29ubmVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGlzY29ubmVjdGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIHJlYWR5IHRvIHBsYXlcbiAgICAgKi9cbiAgICBpc1JlYWR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgc2lnbmFsbGluZ1xuICAgICAqL1xuICAgIGlzU2lnbmFsbGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLlNpZ25hbGxpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgY29ubmVjdGluZ1xuICAgICAqL1xuICAgIGlzQ29ubmVjdGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3Rpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBzdHJlYW1cbiAgICAgKiBAcGFyYW0ge1JlYWRhYmxlfSBzcmMgVGhlIHN0cmVhbSBzb3VyY2VcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wc10gT3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtBdWRpb1Jlc291cmNlfVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZVN0cmVhbShzcmM6IFJlYWRhYmxlLCBvcHM/OiBDcmVhdGVTdHJlYW1PcHMpIHtcbiAgICAgICAgaWYgKCFvcHM/LmRpc2FibGVGaWx0ZXJzICYmIHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0luaXRpYXRpbmcgRFNQIGZpbHRlcnMgcGlwZWxpbmUuLi4nKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gIW9wcz8uZGlzYWJsZUZpbHRlcnNcbiAgICAgICAgICAgID8gdGhpcy5kc3AuY3JlYXRlKHNyYywge1xuICAgICAgICAgICAgICAgICAgZHNwOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZmlsdGVyczogb3BzPy5kZWZhdWx0RmlsdGVycyxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlRmlsdGVyc1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGJpcXVhZDogb3BzPy5iaXF1YWRGaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IG9wcy5iaXF1YWRGaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUJpcXVhZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgcmVzYW1wbGVyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U2FtcGxlUmF0ZTogb3BzPy5zYW1wbGVSYXRlLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVSZXNhbXBsZXJcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBlcXVhbGl6ZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICBiYW5kTXVsdGlwbGllcjogb3BzPy5lcSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlRXF1YWxpemVyXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgdm9sdW1lOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdm9sdW1lOiBvcHM/LnZvbHVtZSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlVm9sdW1lXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IHNyYztcblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnRXhlY3V0aW5nIG9uQWZ0ZXJDcmVhdGVTdHJlYW0gaG9vay4uLicpO1xuICAgICAgICBjb25zdCBwb3N0U3RyZWFtID0gYXdhaXQgdGhpcy5xdWV1ZS5vbkFmdGVyQ3JlYXRlU3RyZWFtPy4oc3RyZWFtLCB0aGlzLnF1ZXVlKS5jYXRjaChcbiAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtOiBzdHJlYW0sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IG9wcz8udHlwZSA/PyBTdHJlYW1UeXBlLkFyYml0cmFyeVxuICAgICAgICAgICAgICAgIH0gYXMgUG9zdFByb2Nlc3NlZFJlc3VsdClcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnUHJlcGFyaW5nIEF1ZGlvUmVzb3VyY2UuLi4nKTtcbiAgICAgICAgdGhpcy5hdWRpb1Jlc291cmNlID0gY3JlYXRlQXVkaW9SZXNvdXJjZShwb3N0U3RyZWFtPy5zdHJlYW0gPz8gc3RyZWFtLCB7XG4gICAgICAgICAgICBpbnB1dFR5cGU6IHBvc3RTdHJlYW0/LnR5cGUgPz8gb3BzPy50eXBlID8/IFN0cmVhbVR5cGUuQXJiaXRyYXJ5LFxuICAgICAgICAgICAgbWV0YWRhdGE6IG9wcz8uZGF0YSxcbiAgICAgICAgICAgIC8vIHZvbHVtZSBjb250cm9scyBoYXBwZW4gZnJvbSBBdWRpb0ZpbHRlciBEU1AgdXRpbGl0eVxuICAgICAgICAgICAgaW5saW5lVm9sdW1lOiBmYWxzZVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hdWRpb1Jlc291cmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kc3A/LnJlc2FtcGxlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcD8uZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGJpcXVhZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwPy5iaXF1YWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwPy5lcXVhbGl6ZXIgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWVyIHN0YXR1c1xuICAgICAqIEB0eXBlIHtBdWRpb1BsYXllclN0YXR1c31cbiAgICAgKi9cbiAgICBnZXQgc3RhdHVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzY29ubmVjdHMgZnJvbSB2b2ljZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hdWRpb1BsYXllcikgdGhpcy5hdWRpb1BsYXllci5zdG9wKHRydWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkgdGhpcy52b2ljZUNvbm5lY3Rpb24uZGVzdHJveSgpO1xuICAgICAgICB9IGNhdGNoIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95cyB0aGlzIGRpc3BhdGNoZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZW1pdCgnZGVzdHJveWVkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcHMgdGhlIHBsYXllclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGVuZCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIuc3RvcCgpO1xuICAgICAgICAgICAgdGhpcy5kc3AuZGVzdHJveSgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXVzZXMgdGhlIHN0cmVhbSBwbGF5YmFja1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ludGVycG9sYXRlU2lsZW5jZT1mYWxzZV0gSWYgdHJ1ZSwgdGhlIHBsYXllciB3aWxsIHBsYXkgNSBwYWNrZXRzIG9mIHNpbGVuY2UgYWZ0ZXIgcGF1c2luZyB0byBwcmV2ZW50IGF1ZGlvIGdsaXRjaGVzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIHBhdXNlKGludGVycG9sYXRlU2lsZW5jZT86IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuYXVkaW9QbGF5ZXIucGF1c2UoaW50ZXJwb2xhdGVTaWxlbmNlKTtcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdW1lcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgcmVzdW1lKCkge1xuICAgICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5hdWRpb1BsYXllci51bnBhdXNlKCk7XG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgc3RyZWFtXG4gICAgICogQHBhcmFtIHtBdWRpb1Jlc291cmNlPFRyYWNrPn0gW3Jlc291cmNlPXRoaXMuYXVkaW9SZXNvdXJjZV0gVGhlIGF1ZGlvIHJlc291cmNlIHRvIHBsYXlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHVzPWZhbHNlXSBXaGV0aGVyIG9yIG5vdCB0byB1c2Ugb3B1c1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+fVxuICAgICAqL1xuICAgIGFzeW5jIHBsYXlTdHJlYW0ocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+ID0gdGhpcy5hdWRpb1Jlc291cmNlISkge1xuICAgICAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19BVURJT19SRVNPVVJDRSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvdXJjZS5lbmRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5lbWl0KCdmaW5pc2gnLCByZXNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmF1ZGlvUmVzb3VyY2UpIHRoaXMuYXVkaW9SZXNvdXJjZSA9IHJlc291cmNlO1xuICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUodGhpcy52b2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeSwgdGhpcy5jb25uZWN0aW9uVGltZW91dCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIucGxheShyZXNvdXJjZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBwbGF5YmFjayB2b2x1bWVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIHZvbHVtZSBhbW91bnRcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzZXRWb2x1bWUodmFsdWU6IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMuZHNwLnZvbHVtZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5kc3Audm9sdW1lLnNldFZvbHVtZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdm9sdW1lXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgdm9sdW1lKCkge1xuICAgICAgICBpZiAoIXRoaXMuZHNwLnZvbHVtZSkgcmV0dXJuIDEwMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwLnZvbHVtZS52b2x1bWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXliYWNrIHRpbWVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBzdHJlYW1UaW1lKCkge1xuICAgICAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgcmV0dXJuIDA7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUmVzb3VyY2UucGxheWJhY2tEdXJhdGlvbjtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgYXMgU3RyZWFtRGlzcGF0Y2hlciB9O1xuIiwgImltcG9ydCB7IFVzZXJSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQYXNzVGhyb3VnaCwgdHlwZSBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBFbmRCZWhhdmlvclR5cGUgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0ICogYXMgcHJpc20gZnJvbSAncHJpc20tbWVkaWEnO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4uL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXInO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgUmF3VHJhY2tEYXRhIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VSZWNlaXZlck9wdGlvbnMge1xuICAgIG1vZGU/OiAnb3B1cycgfCAncGNtJztcbiAgICBlbmQ/OiBFbmRCZWhhdmlvclR5cGU7XG4gICAgc2lsZW5jZUR1cmF0aW9uPzogbnVtYmVyO1xuICAgIGNyYz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFJhd1RyYWNrSW5pdCA9IFBhcnRpYWw8T21pdDxSYXdUcmFja0RhdGEsICdhdXRob3InIHwgJ3BsYXlsaXN0JyB8ICdzb3VyY2UnIHwgJ2VuZ2luZScgfCAncmF3JyB8ICdxdWVyeVR5cGUnIHwgJ2Rlc2NyaXB0aW9uJyB8ICd2aWV3cyc+PjtcblxuZXhwb3J0IGNsYXNzIFZvaWNlUmVjZWl2ZXJOb2RlIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIpIHt9XG5cbiAgICBwdWJsaWMgY3JlYXRlUmF3VHJhY2soc3RyZWFtOiBSZWFkYWJsZSwgZGF0YTogUmF3VHJhY2tJbml0ID0ge30pIHtcbiAgICAgICAgZGF0YS50aXRsZSA/Pz0gYFJlY29yZGluZyAke0RhdGUubm93KCl9YDtcblxuICAgICAgICByZXR1cm4gbmV3IFRyYWNrKHRoaXMuZGlzcGF0Y2hlci5xdWV1ZS5wbGF5ZXIsIHtcbiAgICAgICAgICAgIGF1dGhvcjogJ0Rpc2NvcmQnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGRhdGEudGl0bGUsXG4gICAgICAgICAgICB0aXRsZTogZGF0YS50aXRsZSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiBkYXRhLmR1cmF0aW9uIHx8ICcwOjAwJyxcbiAgICAgICAgICAgIHZpZXdzOiAwLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IGRhdGEucmVxdWVzdGVkQnksXG4gICAgICAgICAgICB0aHVtYm5haWw6IGRhdGEudGh1bWJuYWlsIHx8ICdodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9lbWJlZC9hdmF0YXJzLzAucG5nJyxcbiAgICAgICAgICAgIHVybDogZGF0YS51cmwgfHwgJ2h0dHBzOi8vZGlzY29yZC5jb20nLFxuICAgICAgICAgICAgc291cmNlOiAnYXJiaXRyYXJ5JyxcbiAgICAgICAgICAgIHJhdzoge1xuICAgICAgICAgICAgICAgIGVuZ2luZTogc3RyZWFtLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ2FyYml0cmFyeSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWVyZ2UgbXVsdGlwbGUgc3RyZWFtcyB0b2dldGhlclxuICAgICAqIEBwYXJhbSBzdHJlYW1zIFRoZSBhcnJheSBvZiBzdHJlYW1zIHRvIG1lcmdlXG4gICAgICovXG4gICAgcHVibGljIG1lcmdlUmVjb3JkaW5ncyhzdHJlYW1zOiBSZWFkYWJsZVtdKSB7XG4gICAgICAgIC8vIFRPRE9cbiAgICAgICAgdm9pZCBzdHJlYW1zO1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT1RfSU1QTEVNRU5URUQoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5tZXJnZVJlY29yZGluZ3MoKWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY29yZCBhIHVzZXIgaW4gdm9pY2UgY2hhbm5lbFxuICAgICAqIEBwYXJhbSB1c2VyIFRoZSB1c2VyIHRvIHJlY29yZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFJlY29yZGluZyBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIHJlY29yZFVzZXIoXG4gICAgICAgIHVzZXI6IFVzZXJSZXNvbHZhYmxlLFxuICAgICAgICBvcHRpb25zOiBWb2ljZVJlY2VpdmVyT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGVuZDogRW5kQmVoYXZpb3JUeXBlLkFmdGVyU2lsZW5jZSxcbiAgICAgICAgICAgIG1vZGU6ICdwY20nLFxuICAgICAgICAgICAgc2lsZW5jZUR1cmF0aW9uOiAxMDAwXG4gICAgICAgIH1cbiAgICApIHtcbiAgICAgICAgY29uc3QgX3VzZXIgPSB0aGlzLmRpc3BhdGNoZXIucXVldWUucGxheWVyLmNsaWVudC51c2Vycy5yZXNvbHZlSWQodXNlcik7XG5cbiAgICAgICAgY29uc3QgcGFzc1Rocm91Z2ggPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICAgICAgY29uc3QgcmVjZWl2ZXIgPSB0aGlzLmRpc3BhdGNoZXIudm9pY2VDb25uZWN0aW9uLnJlY2VpdmVyO1xuXG4gICAgICAgIGlmICghcmVjZWl2ZXIpIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFQ0VJVkVSKCk7XG5cbiAgICAgICAgcmVjZWl2ZXIuc3BlYWtpbmcub24oJ3N0YXJ0JywgKHVzZXJJZCkgPT4ge1xuICAgICAgICAgICAgaWYgKHVzZXJJZCA9PT0gX3VzZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWNlaXZlU3RyZWFtID0gcmVjZWl2ZXIuc3Vic2NyaWJlKF91c2VyLCB7XG4gICAgICAgICAgICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IG9wdGlvbnMuZW5kIHx8IEVuZEJlaGF2aW9yVHlwZS5BZnRlclNpbGVuY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogb3B0aW9ucy5zaWxlbmNlRHVyYXRpb24gPz8gMTAwMFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5tb2RlID09PSAncGNtJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGNtID0gcmVjZWl2ZVN0cmVhbS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IChwcmlzbS5vcHVzIHx8ICg8YW55PnByaXNtKS5kZWZhdWx0Lm9wdXMpLkRlY29kZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsczogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplOiA5NjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGU6IDQ4MDAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGNtLnBpcGUocGFzc1Rocm91Z2gpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVTdHJlYW0ucGlwZShwYXNzVGhyb3VnaCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KS51bnJlZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcGFzc1Rocm91Z2ggYXMgUmVhZGFibGU7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFF1ZXVlIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgVHJhY2tTa2lwUmVhc29uIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVIaXN0b3J5PE1ldGEgPSB1bmtub3duPiB7XG4gICAgcHVibGljIHRyYWNrcyA9IG5ldyBRdWV1ZTxUcmFjaz4oJ0xJRk8nKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogQ3VycmVudCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8ubWV0YWRhdGEgfHwgKCh0aGlzLnF1ZXVlIGFzIGFueSkuX19jdXJyZW50IGFzIFRyYWNrIHwgbnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG5leHRUcmFjaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUudHJhY2tzLmF0KDApIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBwcmV2aW91c1RyYWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3MuYXQoMCkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBoaXN0b3J5IGlzIGRpc2FibGVkXG4gICAgICovXG4gICAgcHVibGljIGdldCBkaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlSGlzdG9yeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgaGlzdG9yeSBpcyBlbXB0eVxuICAgICAqL1xuICAgIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA8IDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIHRyYWNrIHRvIHRyYWNrIGhpc3RvcnlcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGFkZFxuICAgICAqL1xuICAgIHB1YmxpYyBwdXNoKHRyYWNrOiBUcmFjayB8IFRyYWNrW10pIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy50cmFja3MuYWRkKHRyYWNrKTtcblxuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIGhpc3RvcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGUgbmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgbmV4dCgpIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSB0aGlzLm5leHRUcmFjaztcbiAgICAgICAgaWYgKCF0cmFjaykge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdObyBuZXh0IHRyYWNrIGluIHRoZSBxdWV1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5ub2RlLnNraXAoe1xuICAgICAgICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uSGlzdG9yeU5leHQsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1NraXBwZWQgYnkgR3VpbGRRdWV1ZUhpc3RvcnkubmV4dCgpJ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IHRoZSBwcmV2aW91cyB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcHJldmlvdXMocHJlc2VydmVDdXJyZW50ID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCB0cmFjayA9IHRoaXMudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgICAgIGlmICghdHJhY2spIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnTm8gcHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50VHJhY2s7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5ub2RlLnBsYXkodHJhY2ssIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICBpZiAoY3VycmVudCAmJiBwcmVzZXJ2ZUN1cnJlbnQpIHRoaXMucXVldWUubm9kZS5pbnNlcnQoY3VycmVudCwgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgdG8gW0d1aWxkUXVldWVIaXN0b3J5XS5wcmV2aW91cygpXG4gICAgICovXG4gICAgcHVibGljIGJhY2socHJlc2VydmVDdXJyZW50ID0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmV2aW91cyhwcmVzZXJ2ZUN1cnJlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2l6ZSBoaXN0b3J5IHN0b3JlXG4gICAgICovXG4gICAgcHVibGljIHJlc2l6ZSgpIHtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodGhpcy5xdWV1ZS5tYXhIaXN0b3J5U2l6ZSkpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMudHJhY2tzLnN0b3JlLmxlbmd0aCA8IHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpIHJldHVybjtcbiAgICAgICAgdGhpcy50cmFja3Muc3RvcmUuc3BsaWNlKHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBBdWRpb1Jlc291cmNlLCBTdHJlYW1UeXBlIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFBsYXllclByb2dyZXNzYmFyT3B0aW9ucywgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgUXVlcnlSZXNvbHZlciB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuaW1wb3J0IHsgVXRpbCwgVkFMSURBVEVfUVVFVUVfQ0FQIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBUcmFjaywgVHJhY2tSZXNvbHZhYmxlIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCwgVHJhY2tTa2lwUmVhc29uIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IHNldFRpbWVvdXQgYXMgd2FpdEZvciB9IGZyb20gJ3RpbWVycy9wcm9taXNlcyc7XG5pbXBvcnQgeyBBc3luY1F1ZXVlIH0gZnJvbSAnLi4vdXRpbHMvQXN5bmNRdWV1ZSc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgQ3JlYXRlU3RyZWFtT3BzIH0gZnJvbSAnLi4vVm9pY2VJbnRlcmZhY2UvU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBFeHRyYWN0b3JTdHJlYW1hYmxlIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCAqIGFzIHByaXNtIGZyb20gJ3ByaXNtLW1lZGlhJztcbmltcG9ydCB7IE9wdXNEZWNvZGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL29wdXMnO1xuXG5leHBvcnQgY29uc3QgRkZNUEVHX1NSQVRFX1JFR0VYID0gL2FzZXRyYXRlPVxcZCtcXCooXFxkKFxcLlxcZCk/KS87XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VQbGF5T3B0aW9ucyB7XG4gICAgcXVldWU/OiBib29sZWFuO1xuICAgIHNlZWs/OiBudW1iZXI7XG4gICAgdHJhbnNpdGlvbk1vZGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNraXBPcHRpb25zIHtcbiAgICByZWFzb246IFRyYWNrU2tpcFJlYXNvbjtcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclRpbWVzdGFtcCB7XG4gICAgY3VycmVudDoge1xuICAgICAgICBsYWJlbDogc3RyaW5nO1xuICAgICAgICB2YWx1ZTogbnVtYmVyO1xuICAgIH07XG4gICAgdG90YWw6IHtcbiAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgdmFsdWU6IG51bWJlcjtcbiAgICB9O1xuICAgIHByb2dyZXNzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtQ29uZmlnIHtcbiAgICBkaXNwYXRjaGVyQ29uZmlnOiBDcmVhdGVTdHJlYW1PcHM7XG4gICAgcGxheWVyQ29uZmlnOiBSZXNvdXJjZVBsYXlPcHRpb25zO1xufVxuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YSA9IHVua25vd24+IHtcbiAgICAjcHJvZ3Jlc3MgPSAwO1xuICAgICNoYXNGRm1wZWdPcHRpbWl6YXRpb24gPSBmYWxzZTtcbiAgICBwdWJsaWMgdGFza3NRdWV1ZSA9IG5ldyBBc3luY1F1ZXVlKCk7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge1xuICAgICAgICB0aGlzLiNoYXNGRm1wZWdPcHRpbWl6YXRpb24gPSAvbGlib3B1czogKHllc3x0cnVlKS8udGVzdCh0aGlzLnF1ZXVlLnBsYXllci5zY2FuRGVwcygpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpbiBpZGxlIG1vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNJZGxlKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzSWRsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGJ1ZmZlcmluZyB0aGUgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNCdWZmZXJpbmcoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNCdWZmZXJpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBwbGF5aW5nIGEgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNQbGF5aW5nKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzUGxheWluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1BhdXNlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc1BhdXNlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0IHByb2dyZXNzIGhpc3RvcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXRQcm9ncmVzcygpIHtcbiAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBwbGF5ZXIgcHJvZ3Jlc3NcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0UHJvZ3Jlc3MocHJvZ3Jlc3M6IG51bWJlcikge1xuICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IHByb2dyZXNzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlYW0gdGltZSBmb3IgY3VycmVudCBzZXNzaW9uXG4gICAgICovXG4gICAgcHVibGljIGdldCBzdHJlYW1UaW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5zdHJlYW1UaW1lID8/IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3VycmVudCBwbGF5YmFjayBkdXJhdGlvbiB3aXRoIGhpc3RvcnkgaW5jbHVkZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBsYXliYWNrVGltZSgpIHtcbiAgICAgICAgY29uc3QgZHVyID0gdGhpcy4jcHJvZ3Jlc3MgKyB0aGlzLnN0cmVhbVRpbWU7XG5cbiAgICAgICAgcmV0dXJuIGR1cjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZHVyYXRpb24gbXVsdGlwbGllclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREdXJhdGlvbk11bHRpcGxpZXIoKSB7XG4gICAgICAgIGNvbnN0IHNyYXRlRmlsdGVycyA9IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcudG9BcnJheSgpLmZpbHRlcigoZmYpID0+IEZGTVBFR19TUkFURV9SRUdFWC50ZXN0KGZmKSk7XG4gICAgICAgIGNvbnN0IG11bHRpcGxpZXJzID0gc3JhdGVGaWx0ZXJzXG4gICAgICAgICAgICAubWFwKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoRkZNUEVHX1NSQVRFX1JFR0VYLmV4ZWMobSk/LlsxXSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5maWx0ZXIoKGYpID0+ICFpc05hTihmKSk7XG5cbiAgICAgICAgcmV0dXJuICFtdWx0aXBsaWVycy5sZW5ndGggPyAxIDogbXVsdGlwbGllcnMucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gY3VycmVudCArIGFjY3VtdWxhdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc3RpbWF0ZWQgcHJvZ3Jlc3Mgb2YgdGhlIHBsYXllclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXN0aW1hdGVkUGxheWJhY2tUaW1lKCkge1xuICAgICAgICBjb25zdCBkdXIgPSB0aGlzLnBsYXliYWNrVGltZTtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy5nZXREdXJhdGlvbk11bHRpcGxpZXIoKSAqIGR1cik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0aW1hdGVkIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBwbGF5ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgICAgICBjb25zdCBkdXIgPSB0aGlzLnRvdGFsRHVyYXRpb247XG5cbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoZHVyIC8gdGhpcy5nZXREdXJhdGlvbk11bHRpcGxpZXIoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG90YWwgZHVyYXRpb24gb2YgdGhlIGN1cnJlbnQgYXVkaW8gdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRvdGFsRHVyYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IHByZWZlcnNCcmlkZ2VkTWV0YWRhdGEgPSB0aGlzLnF1ZXVlLm9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhO1xuICAgICAgICBjb25zdCB0cmFjayA9IHRoaXMucXVldWUuY3VycmVudFRyYWNrO1xuXG4gICAgICAgIGlmIChwcmVmZXJzQnJpZGdlZE1ldGFkYXRhICYmIHRyYWNrPy5tZXRhZGF0YSAhPSBudWxsICYmIHR5cGVvZiB0cmFjay5tZXRhZGF0YSA9PT0gJ29iamVjdCcgJiYgJ2JyaWRnZScgaW4gdHJhY2subWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gKFxuICAgICAgICAgICAgICAgIHRyYWNrIGFzIFRyYWNrPHtcbiAgICAgICAgICAgICAgICAgICAgYnJpZGdlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0+XG4gICAgICAgICAgICApLm1ldGFkYXRhPy5icmlkZ2UuZHVyYXRpb247XG5cbiAgICAgICAgICAgIGlmIChUeXBlVXRpbC5pc051bWJlcihkdXJhdGlvbikpIHJldHVybiBkdXJhdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cmFjaz8uZHVyYXRpb25NUyA/PyAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzdHJlYW0gcHJvZ3Jlc3NcbiAgICAgKiBAcGFyYW0gaWdub3JlRmlsdGVycyBJZ25vcmUgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyA9IGZhbHNlKTogUGxheWVyVGltZXN0YW1wIHwgbnVsbCB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBpZ25vcmVGaWx0ZXJzID8gdGhpcy5wbGF5YmFja1RpbWUgOiB0aGlzLmVzdGltYXRlZFBsYXliYWNrVGltZTtcbiAgICAgICAgY29uc3QgdG90YWwgPSBpZ25vcmVGaWx0ZXJzID8gdGhpcy50b3RhbER1cmF0aW9uIDogdGhpcy5lc3RpbWF0ZWREdXJhdGlvbjtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3VycmVudDoge1xuICAgICAgICAgICAgICAgIGxhYmVsOiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKGN1cnJlbnQpKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogY3VycmVudFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRvdGFsOiB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVModG90YWwpKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdG90YWxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm9ncmVzczogTWF0aC5yb3VuZCgoY3VycmVudCAvIHRvdGFsKSAqIDEwMClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciBjdXJyZW50IHByb2dyZXNzXG4gICAgICogQHBhcmFtIG9wdGlvbnMgUHJvZ3Jlc3MgYmFyIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlUHJvZ3Jlc3NCYXIob3B0aW9ucz86IFBsYXllclByb2dyZXNzYmFyT3B0aW9ucykge1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSB0aGlzLmdldFRpbWVzdGFtcCgpO1xuICAgICAgICBpZiAoIXRpbWVzdGFtcCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHsgaW5kaWNhdG9yID0gJ1xcdXsxRjUxOH0nLCBsZWZ0Q2hhciA9ICdcXHUyNUFDJywgcmlnaHRDaGFyID0gJ1xcdTI1QUMnLCBsZW5ndGggPSAxNSwgdGltZWNvZGVzID0gdHJ1ZSwgc2VwYXJhdG9yID0gJ1xcdTI1MDMnIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBpZiAoaXNOYU4obGVuZ3RoKSB8fCBsZW5ndGggPCAwIHx8ICFOdW1iZXIuaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfT1VUX09GX1JBTkdFKCdbUGxheWVyUHJvZ3Jlc3NCYXJPcHRpb25zLmxlbmd0aF0nLCBTdHJpbmcobGVuZ3RoKSwgJzAnLCAnRmluaXRlIE51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZGV4ID0gTWF0aC5yb3VuZCgodGltZXN0YW1wLmN1cnJlbnQudmFsdWUgLyB0aW1lc3RhbXAudG90YWwudmFsdWUpICogbGVuZ3RoKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDEgJiYgaW5kZXggPD0gbGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBiYXIgPSBsZWZ0Q2hhci5yZXBlYXQoaW5kZXggLSAxKS5zcGxpdCgnJyk7XG4gICAgICAgICAgICBiYXIucHVzaChpbmRpY2F0b3IpO1xuICAgICAgICAgICAgYmFyLnB1c2gocmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSBpbmRleCkpO1xuICAgICAgICAgICAgaWYgKHRpbWVjb2Rlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aW1lc3RhbXAuY3VycmVudC5sYWJlbH0gJHtzZXBhcmF0b3J9ICR7YmFyLmpvaW4oJycpfSAke3NlcGFyYXRvcn0gJHt0aW1lc3RhbXAudG90YWwubGFiZWx9YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke2Jhci5qb2luKCcnKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRpbWVjb2Rlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aW1lc3RhbXAuY3VycmVudC5sYWJlbH0gJHtzZXBhcmF0b3J9ICR7aW5kaWNhdG9yfSR7cmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSAxKX0gJHtzZXBhcmF0b3J9ICR7dGltZXN0YW1wLnRvdGFsLmxhYmVsfWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHtpbmRpY2F0b3J9JHtyaWdodENoYXIucmVwZWF0KGxlbmd0aCAtIDEpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWVrIHRoZSBwbGF5ZXJcbiAgICAgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIHRvIHNlZWsgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VlayhkdXJhdGlvbjogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGR1cmF0aW9uID09PSB0aGlzLmVzdGltYXRlZFBsYXliYWNrVGltZSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChkdXJhdGlvbiA+IHRoaXMudG90YWxEdXJhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCh7XG4gICAgICAgICAgICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uU0VFS19PVkVSX1RIUkVTSE9MRCxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogRXhjZXB0aW9ucy5FUlJfT1VUX09GX1JBTkdFKCdbZHVyYXRpb25dJywgU3RyaW5nKGR1cmF0aW9uKSwgJzAnLCBTdHJpbmcodGhpcy50b3RhbER1cmF0aW9uKSkubWVzc2FnZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGR1cmF0aW9uIDwgMCkgZHVyYXRpb24gPSAwO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5xdWV1ZS5maWx0ZXJzLnRyaWdnZXJSZXBsYXkoZHVyYXRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgdm9sdW1lXG4gICAgICovXG4gICAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnZvbHVtZSA/PyAxMDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHZvbHVtZVxuICAgICAqIEBwYXJhbSB2b2wgVm9sdW1lIGFtb3VudCB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Vm9sdW1lKHZvbDogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlcyA9IHRoaXMucXVldWUuZGlzcGF0Y2hlci5zZXRWb2x1bWUodm9sKTtcbiAgICAgICAgaWYgKHJlcykgdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHZvbDtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgYml0IHJhdGVcbiAgICAgKiBAcGFyYW0gcmF0ZSBUaGUgYml0IHJhdGUgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldEJpdHJhdGUocmF0ZTogbnVtYmVyIHwgJ2F1dG8nKSB7XG4gICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8uZW5jb2Rlcj8uc2V0Qml0cmF0ZShyYXRlID09PSAnYXV0bycgPyB0aGlzLnF1ZXVlLmNoYW5uZWw/LmJpdHJhdGUgPz8gNjQwMDAgOiByYXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcGF1c2VkIHN0YXRlXG4gICAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRQYXVzZWQoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHN0YXRlKSByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5wYXVzZSh0cnVlKSB8fCBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucmVzdW1lKCkgfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGF1c2UgdGhlIHBsYXliYWNrXG4gICAgICovXG4gICAgcHVibGljIHBhdXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRQYXVzZWQodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdW1lIHRoZSBwbGF5YmFja1xuICAgICAqL1xuICAgIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldFBhdXNlZChmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2tpcCBjdXJyZW50IHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHNraXAob3B0aW9ucz86IFNraXBPcHRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2s7XG4gICAgICAgIGlmICghdHJhY2spIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmVuZCgpO1xuICAgICAgICBjb25zdCB7IHJlYXNvbiwgZGVzY3JpcHRpb24gfSA9IG9wdGlvbnMgfHwge1xuICAgICAgICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uTWFudWFsLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgdHJhY2sgd2FzIHNraXBwZWQgbWFudWFsbHknXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyU2tpcCwgdGhpcy5xdWV1ZSwgdHJhY2ssIHJlYXNvbiwgZGVzY3JpcHRpb24pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIHRyYWNrIGZyb20gcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlbW92ZVxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmUodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCBmb3VuZFRyYWNrID0gdGhpcy5xdWV1ZS50cmFja3MuZmluZCgodCwgaWR4KSA9PiB7XG4gICAgICAgICAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjayB8fCB0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnID8gdHJhY2sgOiB0cmFjay5pZCkgPT09IHQuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykgcmV0dXJuIHRyYWNrID09PSB0LmlkO1xuICAgICAgICAgICAgcmV0dXJuIGlkeCA9PT0gdHJhY2s7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWZvdW5kVHJhY2spIHJldHVybiBudWxsO1xuXG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnJlbW92ZU9uZSgodCkgPT4gdC5pZCA9PT0gZm91bmRUcmFjay5pZCk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb1RyYWNrUmVtb3ZlLCB0aGlzLnF1ZXVlLCBmb3VuZFRyYWNrKTtcblxuICAgICAgICByZXR1cm4gZm91bmRUcmFjaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKdW1wIHRvIHNwZWNpZmljIHRyYWNrIG9uIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8ganVtcCB0byB3aXRob3V0IHJlbW92aW5nIG90aGVyIHRyYWNrc1xuICAgICAqL1xuICAgIHB1YmxpYyBqdW1wKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKHRyYWNrKTtcbiAgICAgICAgaWYgKCFyZW1vdmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnVuc2hpZnQocmVtb3ZlZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uSnVtcCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHRyYWNrIHdhcyBqdW1wZWQgdG8gbWFudWFsbHknXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0cmFjayBwb3NpdGlvblxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VHJhY2tQb3NpdGlvbih0cmFjazogVHJhY2tSZXNvbHZhYmxlKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUudHJhY2tzLnRvQXJyYXkoKS5maW5kSW5kZXgoKHQsIGlkeCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRyYWNrIGluc3RhbmNlb2YgVHJhY2sgfHwgdHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJyA/IHRyYWNrIDogdHJhY2suaWQpID09PSB0LmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHJldHVybiB0cmFjayA9PT0gdC5pZDtcbiAgICAgICAgICAgIHJldHVybiBpZHggPT09IHRyYWNrO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTa2lwIHRvIHRoZSBnaXZlbiB0cmFjaywgcmVtb3Zpbmcgb3RoZXJzIG9uIHRoZSB3YXlcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHNraXAgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgc2tpcFRvKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKHRyYWNrKTtcbiAgICAgICAgaWYgKGlkeCA8IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKGlkeCk7XG4gICAgICAgIGlmICghcmVtb3ZlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCB0b1JlbW92ZSA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlLmZpbHRlcigoXywgaSkgPT4gaSA8PSBpZHgpO1xuICAgICAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS5zcGxpY2UoMCwgaWR4LCByZW1vdmVkKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb1RyYWNrc1JlbW92ZSwgdGhpcy5xdWV1ZSwgdG9SZW1vdmUpO1xuICAgICAgICByZXR1cm4gdGhpcy5za2lwKHtcbiAgICAgICAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLlNraXBUbyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHBsYXllciB3YXMgc2tpcHBlZCB0byBhbm90aGVyIHRyYWNrIG1hbnVhbGx5J1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnQgYSB0cmFjayBvbiB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGluc2VydFxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRvLCBkZWZhdWx0cyB0byAwLlxuICAgICAqL1xuICAgIHB1YmxpYyBpbnNlcnQodHJhY2s6IFRyYWNrLCBpbmRleCA9IDApIHtcbiAgICAgICAgaWYgKCEodHJhY2sgaW5zdGFuY2VvZiBUcmFjaykpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3RyYWNrIHZhbHVlJywgJ2luc3RhbmNlIG9mIFRyYWNrJywgU3RyaW5nKHRyYWNrKSk7XG4gICAgICAgIFZBTElEQVRFX1FVRVVFX0NBUCh0aGlzLnF1ZXVlLCB0cmFjayk7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZShpbmRleCwgMCwgdHJhY2spO1xuICAgICAgICBpZiAoIXRoaXMucXVldWUub3B0aW9ucy5ub0VtaXRJbnNlcnQpIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYXVkaW9UcmFja0FkZCwgdGhpcy5xdWV1ZSwgdHJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIG1vdmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZShmcm9tOiBUcmFja1Jlc29sdmFibGUsIHRvOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKGZyb20pO1xuICAgICAgICBpZiAoIXJlbW92ZWQpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnaW52YWxpZCB0cmFjayB0byBtb3ZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnNlcnQocmVtb3ZlZCwgdG8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcHkgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gY2xvbmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIGNsb25lIGF0XG4gICAgICovXG4gICAgcHVibGljIGNvcHkoZnJvbTogVHJhY2tSZXNvbHZhYmxlLCB0bzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHNyYyA9IHRoaXMucXVldWUudHJhY2tzLmF0KHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihmcm9tKSk7XG4gICAgICAgIGlmICghc3JjKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ2ludmFsaWQgdHJhY2sgdG8gY29weScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5zZXJ0KHNyYywgdG8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN3YXAgdHdvIHRyYWNrcyBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZmlyc3QgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICAgKiBAcGFyYW0gc2Vjb25kIFRoZSBzZWNvbmQgdHJhY2sgdG8gc3dhcFxuICAgICAqL1xuICAgIHB1YmxpYyBzd2FwKGZpcnN0OiBUcmFja1Jlc29sdmFibGUsIHNlY29uZDogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHNyYyA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihmaXJzdCk7XG4gICAgICAgIGlmIChzcmMgPCAwKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ2ludmFsaWQgc3JjIHRyYWNrIHRvIHN3YXAnKTtcblxuICAgICAgICBjb25zdCBkZXN0ID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKHNlY29uZCk7XG4gICAgICAgIGlmIChkZXN0IDwgMCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdpbnZhbGlkIGRlc3QgdHJhY2sgdG8gc3dhcCcpO1xuXG4gICAgICAgIGNvbnN0IHNyY1QgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtzcmNdO1xuICAgICAgICBjb25zdCBkZXN0VCA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlW2Rlc3RdO1xuXG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY10gPSBkZXN0VDtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbZGVzdF0gPSBzcmNUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3AgdGhlIHBsYXliYWNrXG4gICAgICogQHBhcmFtIGZvcmNlIFdoZXRoZXIgb3Igbm90IHRvIGZvcmNlZnVsbHkgc3RvcCB0aGUgcGxheWJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RvcChmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMucXVldWUuaGlzdG9yeS5jbGVhcigpO1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZW5kKCk7XG4gICAgICAgIGlmIChmb3JjZSkge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLm9wdGlvbnMubGVhdmVPblN0b3ApIHtcbiAgICAgICAgICAgIGNvbnN0IHRtOiBOb2RlSlMuVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUGxheWluZygpIHx8IHRoaXMucXVldWUudHJhY2tzLnNpemUpIHJldHVybiBjbGVhclRpbWVvdXQodG0pO1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZGVzdHJveSgpO1xuICAgICAgICAgICAgfSwgdGhpcy5xdWV1ZS5vcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24pLnVucmVmKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSByYXcgYXVkaW8gcmVzb3VyY2VcbiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGF1ZGlvIHJlc291cmNlIHRvIHBsYXlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheVJhdyhyZXNvdXJjZTogQXVkaW9SZXNvdXJjZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnBsYXlTdHJlYW0ocmVzb3VyY2UgYXMgQXVkaW9SZXNvdXJjZTxUcmFjaz4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhlIGdpdmVuIHRyYWNrXG4gICAgICogQHBhcmFtIHJlcyBUaGUgdHJhY2sgdG8gcGxheVxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHBsYXlpbmcgdGhlIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXkocmVzPzogVHJhY2sgfCBudWxsLCBvcHRpb25zPzogUmVzb3VyY2VQbGF5T3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19WT0lDRV9DT05ORUNUSU9OKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgUmVjZWl2ZWQgcGxheSByZXF1ZXN0IGZyb20gZ3VpbGQgJHt0aGlzLnF1ZXVlLmd1aWxkLm5hbWV9IChJRDogJHt0aGlzLnF1ZXVlLmd1aWxkLmlkfSlgKTtcblxuICAgICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHF1ZXVlOiB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjayAhPSBudWxsLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25Nb2RlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZWVrOiAwXG4gICAgICAgICAgICB9IGFzIFJlc291cmNlUGxheU9wdGlvbnMsXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICkhO1xuXG4gICAgICAgIGlmIChyZXMgJiYgb3B0aW9ucy5xdWV1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1JlcXVlc3RlZCBvcHRpb24gcmVxdWlyZXMgdG8gcXVldWUgdGhlIHRyYWNrLCBhZGRpbmcgdGhlIGdpdmVuIHRyYWNrIHRvIHF1ZXVlIGluc3RlYWQuLi4nKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmFkZFRyYWNrKHJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFjayA9IHJlcyB8fCB0aGlzLnF1ZXVlLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnUGxheSByZXF1ZXN0IHJlY2VpdmVkIGJ1dCB0cmFjayB3YXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVycm9yLCB0aGlzLnF1ZXVlLCBlcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnUmVxdWVzdGVkIG9wdGlvbiByZXF1aXJlcyB0byBwbGF5IHRoZSB0cmFjaywgaW5pdGlhbGl6aW5nLi4uJyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBJbml0aWF0aW5nIHN0cmVhbSBleHRyYWN0aW9uIHByb2Nlc3MuLi5gKTtcbiAgICAgICAgICAgIGNvbnN0IHNyYyA9IHRyYWNrLnJhdz8uc291cmNlIHx8IHRyYWNrLnNvdXJjZTtcbiAgICAgICAgICAgIGNvbnN0IHF0OiBTZWFyY2hRdWVyeVR5cGUgPSB0cmFjay5xdWVyeVR5cGUgfHwgKHNyYyA9PT0gJ3Nwb3RpZnknID8gJ3Nwb3RpZnlTb25nJyA6IHNyYyA9PT0gJ2FwcGxlX211c2ljJyA/ICdhcHBsZU11c2ljU29uZycgOiBzcmMpO1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYEV4ZWN1dGluZyBvbkJlZm9yZUNyZWF0ZVN0cmVhbSBob29rIChRdWVyeVR5cGU6ICR7cXR9KS4uLmApO1xuXG4gICAgICAgICAgICBjb25zdCBzdHJlYW1TcmMgPSB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IG51bGwgYXMgRXJyb3IgfCBudWxsLFxuICAgICAgICAgICAgICAgIHN0cmVhbTogbnVsbCBhcyBFeHRyYWN0b3JTdHJlYW1hYmxlIHwgbnVsbFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5vbkJlZm9yZUNyZWF0ZVN0cmVhbT8uKHRyYWNrLCBxdCB8fCAnYXJiaXRyYXJ5JywgdGhpcy5xdWV1ZSkudGhlbihcbiAgICAgICAgICAgICAgICAocykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlOiBFcnJvcikgPT4gKHN0cmVhbVNyYy5lcnJvciA9IGUpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyB0aHJvdyBpZiAnb25CZWZvcmVDcmVhdGVTdHJlYW0nIHBhbmljc1xuICAgICAgICAgICAgaWYgKCFzdHJlYW1TcmMuc3RyZWFtICYmIHN0cmVhbVNyYy5lcnJvcikgcmV0dXJuIHRoaXMuI3Rocm93KHRyYWNrLCBzdHJlYW1TcmMuZXJyb3IpO1xuXG4gICAgICAgICAgICAvLyBkZWZhdWx0IGJlaGF2aW9yIHdoZW4gJ29uQmVmb3JlQ3JlYXRlU3RyZWFtJyBkaWQgbm90IHBhbmljXG4gICAgICAgICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnRmFpbGVkIHRvIGdldCBzdHJlYW0gZnJvbSBvbkJlZm9yZUNyZWF0ZVN0cmVhbSEnKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNjcmVhdGVHZW5lcmljU3RyZWFtKHRyYWNrKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAocikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHI/LnJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gPSA8UmVhZGFibGU+ci5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocj8uZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuZXJyb3IgPSByLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IHN0cmVhbVNyYy5lcnJvciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIChlOiBFcnJvcikgPT4gKHN0cmVhbVNyYy5lcnJvciA9IGUpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFzdHJlYW1TcmMuc3RyZWFtKSByZXR1cm4gdGhpcy4jdGhyb3codHJhY2ssIHN0cmVhbVNyYy5lcnJvcik7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zZWVrID09PSAnbnVtYmVyJyAmJiBvcHRpb25zLnNlZWsgPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuI3Byb2dyZXNzID0gb3B0aW9ucy5zZWVrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICBjb25zdCBjb29raWVzID0gdHJhY2sucmF3Py5zb3VyY2UgPT09ICd5b3V0dWJlJyA/ICg8YW55PnRoaXMucXVldWUucGxheWVyLm9wdGlvbnMueXRkbE9wdGlvbnM/LnJlcXVlc3RPcHRpb25zKT8uaGVhZGVycz8uY29va2llIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBjb25zdCB0cmFja1N0cmVhbUNvbmZpZzogU3RyZWFtQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoZXJDb25maWc6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUJpcXVhZDogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVCaXF1YWQsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVFcXVhbGl6ZXI6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyLFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlVm9sdW1lOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZVZvbHVtZSxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUZpbHRlcnM6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVSZXNhbXBsZXI6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlUmVzYW1wbGVyLFxuICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlOiB0eXBlb2YgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA9PT0gJ251bWJlcicgJiYgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA+IDAgPyB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBiaXF1YWRGaWx0ZXI6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBlcTogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplcixcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnM6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLFxuICAgICAgICAgICAgICAgICAgICB2b2x1bWU6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHRyYWNrLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTdHJlYW1UeXBlLlJhdyxcbiAgICAgICAgICAgICAgICAgICAgc2tpcEZGbXBlZzogdGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwbGF5ZXJDb25maWc6IG9wdGlvbnNcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGxldCByZXNvbHZlcjogKCkgPT4gdm9pZCA9IFV0aWwubm9vcDtcbiAgICAgICAgICAgIGNvbnN0IGRvbmVQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IChyZXNvbHZlciA9IHJlc29sdmUpKTtcblxuICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQud2lsbFBsYXlUcmFjaywgdGhpcy5xdWV1ZSwgdHJhY2ssIHRyYWNrU3RyZWFtQ29uZmlnLCByZXNvbHZlciEpO1xuXG4gICAgICAgICAgICAvLyBwcmV2ZW50IGRhbmdsaW5nIHByb21pc2VcbiAgICAgICAgICAgIGlmICghc3VjY2VzcykgcmVzb2x2ZXIoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1dhaXRpbmcgZm9yIHdpbGxQbGF5VHJhY2sgZXZlbnQgdG8gcmVzb2x2ZS4uLicpO1xuXG4gICAgICAgICAgICBhd2FpdCBkb25lUHJvbWlzZTtcblxuICAgICAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgICAgICBjb25zdCBkYXNwRGlzYWJsZWQgPSBbXG4gICAgICAgICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlQmlxdWFkLFxuICAgICAgICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVGaWx0ZXJzLFxuICAgICAgICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZVJlc2FtcGxlcixcbiAgICAgICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVWb2x1bWVcbiAgICAgICAgICAgIF0uZXZlcnkoKGUpID0+ICEhZSA9PT0gdHJ1ZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG5lZWRzRmlsdGVycyA9ICEhdHJhY2tTdHJlYW1Db25maWcucGxheWVyQ29uZmlnLnNlZWsgfHwgISF0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLmFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3Qgc2hvdWxkU2tpcEZGbXBlZyA9ICEhdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5za2lwRkZtcGVnICYmICFuZWVkc0ZpbHRlcnM7XG5cbiAgICAgICAgICAgIGxldCBmaW5hbFN0cmVhbTogUmVhZGFibGU7XG5cbiAgICAgICAgICAgIGNvbnN0IGRlbXV4YWJsZSA9IChmbXQ6IHN0cmluZykgPT4gW1N0cmVhbVR5cGUuT3B1cywgU3RyZWFtVHlwZS5XZWJtT3B1cywgU3RyZWFtVHlwZS5PZ2dPcHVzXS5pbmNsdWRlcyhmbXQgYXMgU3RyZWFtVHlwZSk7XG5cbiAgICAgICAgICAgIC8vIHNraXAgZmZtcGVnIHdoZW4gcG9zc2libGVcbiAgICAgICAgICAgIGlmIChzaG91bGRTa2lwRkZtcGVnICYmICEoc3RyZWFtU3JjLnN0cmVhbSBpbnN0YW5jZW9mIFJlYWRhYmxlKSAmJiB0eXBlb2Ygc3RyZWFtU3JjLnN0cmVhbSAhPT0gJ3N0cmluZycgJiYgZGVtdXhhYmxlKHN0cmVhbVNyYy5zdHJlYW0uJGZtdCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7ICRmbXQsIHN0cmVhbSB9ID0gc3RyZWFtU3JjLnN0cmVhbTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRQQ00gPSAhZGFzcERpc2FibGVkO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYHNraXBGRm1wZWcgaXMgc2V0IHRvIHRydWUgYW5kIHN0cmVhbSBpcyBkZW11eGFibGUsIGNyZWF0aW5nIHN0cmVhbSB3aXRoIHR5cGUgJHtzaG91bGRQQ00gPyAncGNtJyA6ICdvcHVzJ31gKTtcblxuICAgICAgICAgICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdXNTdHJlYW0gPSAkZm10ID09PSBTdHJlYW1UeXBlLk9wdXMgP1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0gOlxuICAgICAgICAgICAgICAgICAgICAkZm10ID09PSBTdHJlYW1UeXBlLk9nZ09wdXMgP1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucGlwZShuZXcgcHJpc20ub3B1cy5PZ2dEZW11eGVyKCkpIDpcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnBpcGUobmV3IHByaXNtLm9wdXMuV2VibURlbXV4ZXIoKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkUENNKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW55IGZpbHRlcnMgZW5hYmxlZCwgd2UgbmVlZCB0byBkZWNvZGUgdGhlIG9wdXMgc3RyZWFtIHRvIHBjbVxuICAgICAgICAgICAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW0ucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPcHVzRGVjb2Rlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHM6IDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplOiA5NjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZTogNDgwMDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcudHlwZSA9IFN0cmVhbVR5cGUuUmF3O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsU3RyZWFtID0gb3B1c1N0cmVhbTtcbiAgICAgICAgICAgICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gU3RyZWFtVHlwZS5PcHVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc3Qgb3B1cyA9IGRhc3BEaXNhYmxlZCAmJiB0aGlzLiNoYXNGRm1wZWdPcHRpbWl6YXRpb247XG4gICAgICAgICAgICAgICAgLy8gaWYgKG9wdXMgJiYgdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnRGlzYWJsaW5nIFBDTSBvdXRwdXQgc2luY2UgYWxsIGZpbHRlcnMgYXJlIGRpc2FibGVkIGFuZCBvcHVzIGVuY29kaW5nIGlzIHN1cHBvcnRlZC4uLicpO1xuXG4gICAgICAgICAgICAgICAgZmluYWxTdHJlYW0gPSB0aGlzLiNjcmVhdGVGRm1wZWdTdHJlYW0oXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gaW5zdGFuY2VvZiBSZWFkYWJsZSB8fCB0eXBlb2Ygc3RyZWFtU3JjLnN0cmVhbSA9PT0gJ3N0cmluZycgPyBzdHJlYW1TcmMuc3RyZWFtIDogc3RyZWFtU3JjLnN0cmVhbS5zdHJlYW0sXG4gICAgICAgICAgICAgICAgICAgIHRyYWNrLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNlZWsgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgY29va2llc1xuICAgICAgICAgICAgICAgICAgICAvLyBvcHVzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgICAgICAgICAvLyBGSVhNRTogT2dnT3B1cyByZXN1bHRzIGluIHN0YXRpYyBub2lzZVxuICAgICAgICAgICAgICAgIC8vIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcudHlwZSA9IG9wdXMgPyBTdHJlYW1UeXBlLk9nZ09wdXMgOiBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMudHJhbnNpdGlvbk1vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgVHJhbnNpdGlvbiBtb2RlIGRldGVjdGVkLCBwbGF5ZXIgd2lsbCB3YWl0IGZvciBidWZmZXJpbmcgdGltZW91dCB0byBleHBpcmUgKFRpbWVvdXQ6ICR7dGhpcy5xdWV1ZS5vcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXR9bXMpYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgd2FpdEZvcih0aGlzLnF1ZXVlLm9wdGlvbnMuYnVmZmVyaW5nVGltZW91dCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0J1ZmZlcmluZyB0aW1lb3V0IGhhcyBleHBpcmVkIScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgUHJlcGFyaW5nIGZpbmFsIHN0cmVhbSBjb25maWc6ICR7SlNPTi5zdHJpbmdpZnkodHJhY2tTdHJlYW1Db25maWcsIG51bGwsIDIpfWApO1xuXG4gICAgICAgICAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IHRoaXMucXVldWUuZGlzcGF0Y2hlci5jcmVhdGVTdHJlYW0oZmluYWxTdHJlYW0sIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcpO1xuXG4gICAgICAgICAgICB0aGlzLnF1ZXVlLnNldFRyYW5zaXRpb25pbmcoISFvcHRpb25zLnRyYW5zaXRpb25Nb2RlKTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy4jcGVyZm9ybVBsYXkocmVzb3VyY2UpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgRmFpbGVkIHRvIGluaXRpYWxpemUgYXVkaW8gcGxheWVyOiAke2V9YCk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgI3Rocm93KHRyYWNrOiBUcmFjaywgZXJyb3I/OiBFcnJvciB8IG51bGwpIHtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIGNvbnN0IHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdCA9IChcbiAgICAgICAgICAgIEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVChgQ291bGQgbm90IGV4dHJhY3Qgc3RyZWFtIGZvciB0aGlzIHRyYWNrJHtlcnJvciA/IGBcXG5cXG4ke2Vycm9yLnN0YWNrIHx8IGVycm9yfWAgOiAnJ31gKVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyU2tpcCwgdGhpcy5xdWV1ZSwgdHJhY2ssIFRyYWNrU2tpcFJlYXNvbi5Ob1N0cmVhbSwgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0Lm1lc3NhZ2UpO1xuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllckVycm9yLCB0aGlzLnF1ZXVlLCBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQsIHRyYWNrKTtcbiAgICAgICAgY29uc3QgbmV4dFRyYWNrID0gdGhpcy5xdWV1ZS50cmFja3MuZGlzcGF0Y2goKTtcbiAgICAgICAgaWYgKG5leHRUcmFjaykgdGhpcy5wbGF5KG5leHRUcmFjaywgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhc3luYyAjcGVyZm9ybVBsYXkocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdJbml0aWFsaXppbmcgYXVkaW8gcGxheWVyLi4uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMucXVldWUuZGlzcGF0Y2hlciEucGxheVN0cmVhbShyZXNvdXJjZSk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdEaXNwYXRjaGluZyBhdWRpby4uLicpO1xuICAgIH1cblxuICAgIGFzeW5jICNjcmVhdGVHZW5lcmljU3RyZWFtKHRyYWNrOiBUcmFjaykge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgQXR0ZW1wdGluZyB0byBleHRyYWN0IHN0cmVhbSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgcmVnaXN0ZXJlZCBleHRyYWN0b3JzYCk7XG4gICAgICAgIGNvbnN0IHN0cmVhbUluZm8gPSBhd2FpdCB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0cmFjdG9yKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5ibG9ja1N0cmVhbUZyb20/LnNvbWUoKGV4dCkgPT4gZXh0ID09PSBleHRyYWN0b3IuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGNhblN0cmVhbSA9IGF3YWl0IGV4dHJhY3Rvci52YWxpZGF0ZSh0cmFjay51cmwsIHRyYWNrLnF1ZXJ5VHlwZSB8fCBRdWVyeVJlc29sdmVyLnJlc29sdmUodHJhY2sudXJsKS50eXBlKTtcbiAgICAgICAgICAgIGlmICghY2FuU3RyZWFtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZXh0cmFjdG9yLnN0cmVhbSh0cmFjayk7XG4gICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgaWYgKCFzdHJlYW1JbmZvIHx8ICFzdHJlYW1JbmZvLnJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYEZhaWxlZCB0byBleHRyYWN0IHN0cmVhbSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgcmVnaXN0ZXJlZCBleHRyYWN0b3JzYCk7XG4gICAgICAgICAgICByZXR1cm4gc3RyZWFtSW5mbyB8fCBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBTdHJlYW0gZXh0cmFjdGlvbiB3YXMgc3VjY2Vzc2Z1bCBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gKEV4dHJhY3RvcjogJHtzdHJlYW1JbmZvLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ30pYCk7XG5cbiAgICAgICAgcmV0dXJuIHN0cmVhbUluZm87XG4gICAgfVxuXG4gICAgI2NyZWF0ZUZGbXBlZ1N0cmVhbShzdHJlYW06IFJlYWRhYmxlIHwgc3RyaW5nLCB0cmFjazogVHJhY2ssIHNlZWsgPSAwLCBjb29raWVzPzogc3RyaW5nLCBvcHVzPzogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBmZm1wZWdTdHJlYW0gPSB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnXG4gICAgICAgICAgICAuY3JlYXRlU3RyZWFtKHN0cmVhbSwge1xuICAgICAgICAgICAgICAgIGVuY29kZXJBcmdzOiB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLmFyZ3MsXG4gICAgICAgICAgICAgICAgc2Vlazogc2VlayAvIDEwMDAsXG4gICAgICAgICAgICAgICAgZm10OiBvcHVzID8gJ29wdXMnIDogJ3MxNmxlJyxcbiAgICAgICAgICAgICAgICBjb29raWVzLFxuICAgICAgICAgICAgICAgIHVzZUxlZ2FjeUZGbXBlZzogISF0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLnVzZUxlZ2FjeUZGbXBlZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbSA9IGAke2Vycn1gLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgU3RyZWFtIGNsb3NlZCBkdWUgdG8gYW4gZXJyb3IgZnJvbSBGRm1wZWcgc3RyZWFtOiAke2Vyci5zdGFjayB8fCBlcnIubWVzc2FnZSB8fCBlcnJ9YCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobS5pbmNsdWRlcygncHJlbWF0dXJlIGNsb3NlJykgfHwgbS5pbmNsdWRlcygnZXBpcGUnKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJFcnJvciwgdGhpcy5xdWV1ZSwgZXJyLCB0cmFjayk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmZtcGVnU3RyZWFtO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4vVHlwZVV0aWwnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBmZXRjaCB9IGZyb20gJ3VuZGljaSc7XG5cbi8vICNyZWdpb24gc2NhcnkgdGhpbmdzIGJlbG93ICpzaWdoKlxuY29uc3Qgc3BvdGlmeVNvbmdSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoaW50bC0oW2Etel18W0EtWl0pK1xcLyk/KD86dHJhY2tcXC98XFw/dXJpPXNwb3RpZnk6dHJhY2s6KSgoXFx3fC0pezIyfSkoXFw/c2k9LispPyQvO1xuY29uc3Qgc3BvdGlmeVBsYXlsaXN0UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OnBsYXlsaXN0XFwvfFxcP3VyaT1zcG90aWZ5OnBsYXlsaXN0OikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHNwb3RpZnlBbGJ1bVJlZ2V4ID0gL15odHRwcz86XFwvXFwvKD86ZW1iZWRcXC58b3BlblxcLikoPzpzcG90aWZ5XFwuY29tXFwvKShpbnRsLShbYS16XXxbQS1aXSkrXFwvKT8oPzphbGJ1bVxcL3xcXD91cmk9c3BvdGlmeTphbGJ1bTopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCB2aW1lb1JlZ2V4ID0gL14oaHR0cHxodHRwcyk/OlxcL1xcLyh3d3dcXC58cGxheWVyXFwuKT92aW1lb1xcLmNvbVxcLyg/OmNoYW5uZWxzXFwvKD86XFx3K1xcLyk/fGdyb3Vwc1xcLyhbXi9dKilcXC92aWRlb3NcXC98dmlkZW9cXC98KShcXGQrKSg/OnxcXC9cXD8pJC87XG5jb25zdCByZXZlcmJuYXRpb25SZWdleCA9IC9eaHR0cHM6XFwvXFwvKHd3dy4pP3JldmVyYm5hdGlvbi5jb21cXC8oLispXFwvc29uZ1xcLyguKykkLztcbmNvbnN0IGF0dGFjaG1lbnRSZWdleCA9IC9eaHR0cHM/OlxcL1xcLy4rJC87XG5jb25zdCBhcHBsZU11c2ljU29uZ1JlZ2V4ID0gL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcLyhzb25nfGFsYnVtKVxcLy4rPyhcXC8uKz9cXD9pPXxcXC8pKFswLTldKykkLztcbmNvbnN0IGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4ID0gL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL3BsYXlsaXN0XFwvLitcXC9wbFxcLih1LXxwbS0pP1thLXpBLVowLTldKyQvO1xuY29uc3QgYXBwbGVNdXNpY0FsYnVtUmVnZXggPSAvXmh0dHBzPzpcXC9cXC9tdXNpY1xcLmFwcGxlXFwuY29tXFwvLis/XFwvYWxidW1cXC8uK1xcLyhbMC05XSspJC87XG5jb25zdCBzb3VuZGNsb3VkVHJhY2tSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyhtLnx3d3cuKT9zb3VuZGNsb3VkLmNvbVxcLyhcXHd8LSkrXFwvKFxcd3wtKSsoLispPyQvO1xuY29uc3Qgc291bmRjbG91ZFBsYXlsaXN0UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8obS58d3d3Lik/c291bmRjbG91ZC5jb21cXC8oXFx3fC0pK1xcL3NldHNcXC8oXFx3fC0pKyguKyk/JC87XG5jb25zdCB5b3V0dWJlUGxheWxpc3RSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyh3d3cuKT95b3V0dWJlLmNvbVxcL3BsYXlsaXN0XFw/bGlzdD0oKFBMfEZMfFVVfExMfFJEfE9MKVthLXpBLVowLTktX117MTYsNDF9KSQvO1xuY29uc3QgeW91dHViZVZpZGVvVVJMUmVnZXggPSAvXigoPzpodHRwcz86KT9cXC9cXC8pPygoPzp3d3d8bSlcXC4pPygoPzp5b3V0dWJlXFwuY29tfHlvdXR1LmJlKSkoXFwvKD86W1xcdy1dK1xcP3Y9fGVtYmVkXFwvfHZcXC8pPykoW1xcdy1dKykoXFxTKyk/JC87XG5jb25zdCB5b3V0dWJlVmlkZW9JZFJlZ2V4ID0gL15bYS16QS1aMC05LV9dezExfSQvO1xuLy8gI2VuZHJlZ2lvbiBzY2FyeSB0aGluZ3MgYWJvdmUgKnNpZ2gqXG5cbmNvbnN0IERvbWFpbnNNYXAgPSB7XG4gICAgWW91VHViZTogWyd5b3V0dWJlLmNvbScsICd5b3V0dS5iZScsICdtdXNpYy55b3V0dWJlLmNvbScsICdnYW1pbmcueW91dHViZS5jb20nLCAnd3d3LnlvdXR1YmUuY29tJywgJ20ueW91dHViZS5jb20nXSxcbiAgICBTcG90aWZ5OiBbJ29wZW4uc3BvdGlmeS5jb20nLCAnZW1iZWQuc3BvdGlmeS5jb20nXSxcbiAgICBWaW1lbzogWyd2aW1lby5jb20nLCAncGxheWVyLnZpbWVvLmNvbSddLFxuICAgIFJldmVyYk5hdGlvbjogWydyZXZlcmJuYXRpb24uY29tJ10sXG4gICAgU291bmRDbG91ZDogWydzb3VuZGNsb3VkLmNvbSddLFxuICAgIEFwcGxlTXVzaWM6IFsnbXVzaWMuYXBwbGUuY29tJ11cbn07XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgcmVkaXJlY3REb21haW5zID0gbmV3IFNldChbXG4gICAgL15odHRwcz86XFwvXFwvc3BvdGlmeS5saW5rXFwvW0EtWmEtejAtOV0rJC8sXG5dKTtcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFF1ZXJ5IHtcbiAgICB0eXBlOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG4gICAgcXVlcnk6IHN0cmluZztcbn1cblxuY2xhc3MgUXVlcnlSZXNvbHZlciB7XG4gICAgLyoqXG4gICAgICogUXVlcnkgcmVzb2x2ZXJcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cblxuICAgIHN0YXRpYyBnZXQgcmVnZXgoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzcG90aWZ5QWxidW1SZWdleCxcbiAgICAgICAgICAgIHNwb3RpZnlQbGF5bGlzdFJlZ2V4LFxuICAgICAgICAgICAgc3BvdGlmeVNvbmdSZWdleCxcbiAgICAgICAgICAgIHZpbWVvUmVnZXgsXG4gICAgICAgICAgICByZXZlcmJuYXRpb25SZWdleCxcbiAgICAgICAgICAgIGF0dGFjaG1lbnRSZWdleCxcbiAgICAgICAgICAgIGFwcGxlTXVzaWNBbGJ1bVJlZ2V4LFxuICAgICAgICAgICAgYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXgsXG4gICAgICAgICAgICBhcHBsZU11c2ljU29uZ1JlZ2V4LFxuICAgICAgICAgICAgc291bmRjbG91ZFRyYWNrUmVnZXgsXG4gICAgICAgICAgICBzb3VuZGNsb3VkUGxheWxpc3RSZWdleCxcbiAgICAgICAgICAgIHlvdXR1YmVQbGF5bGlzdFJlZ2V4XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlLXJlc29sdmUgcmVkaXJlY3QgdXJsc1xuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBwcmVSZXNvbHZlKHF1ZXJ5OiBzdHJpbmcsIG1heERlcHRoID0gNSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKHF1ZXJ5LCAnc3RyaW5nJywgdHlwZW9mIHF1ZXJ5KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGRvbWFpbiBvZiByZWRpcmVjdERvbWFpbnMpIHtcbiAgICAgICAgICAgIGlmIChkb21haW4udGVzdChxdWVyeSkpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChxdWVyeSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnZm9sbG93J1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcy5vaykgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gc3BvdGlmeSBkb2VzIG5vdCBcInJlZGlyZWN0XCIsIGl0IHJldHVybnMgYSBwYWdlIHdpdGgganMgdGhhdCByZWRpcmVjdHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9eaHR0cHM/OlxcL1xcL3Nwb3RpZnkuYXBwLmxpbmtcXC8oLispJC8udGVzdChyZXMudXJsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBib2R5LnNwbGl0KCdodHRwczovL29wZW4uc3BvdGlmeS5jb20vdHJhY2svJylbMV0uc3BsaXQoJz9zaT0nKVswXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQpIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYGh0dHBzOi8vb3Blbi5zcG90aWZ5LmNvbS90cmFjay8ke3RhcmdldH1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXhEZXB0aCA8IDEgPyByZXMudXJsIDogdGhpcy5wcmVSZXNvbHZlKHJlcy51cmwsIG1heERlcHRoIC0gMSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBxdWVyeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gc2VhcmNoIHF1ZXJ5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IFRoZSBxdWVyeVxuICAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlKHF1ZXJ5OiBzdHJpbmcsIGZhbGxiYWNrU2VhcmNoRW5naW5lOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV0gPSBRdWVyeVR5cGUuQVVUT19TRUFSQ0gpOiBSZXNvbHZlZFF1ZXJ5IHtcbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc1N0cmluZyhxdWVyeSkpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUocXVlcnksICdzdHJpbmcnLCB0eXBlb2YgcXVlcnkpO1xuICAgICAgICBpZiAoIXF1ZXJ5Lmxlbmd0aCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5GT19SRVFVSVJFRCgncXVlcnknLCBTdHJpbmcocXVlcnkpKTtcblxuICAgICAgICBjb25zdCByZXNvbHZlciA9ICh0eXBlOiB0eXBlb2YgZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5OiBzdHJpbmcpID0+ICh7IHR5cGUsIHF1ZXJ5IH0pO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHF1ZXJ5KTtcblxuICAgICAgICAgICAgaWYgKERvbWFpbnNNYXAuWW91VHViZS5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2UoLyhtKHVzaWMpP3xnYW1pbmcpXFwuLywgJycpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwbGF5bGlzdElkID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoJ2xpc3QnKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWRlb0lkID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoJ3YnKTtcbiAgICAgICAgICAgICAgICBpZiAocGxheWxpc3RJZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9JZCAmJiBwbGF5bGlzdElkLnN0YXJ0c1dpdGgoJ1JEJykpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuWU9VVFVCRV9QTEFZTElTVCwgYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9JHt2aWRlb0lkfSZsaXN0PSR7cGxheWxpc3RJZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5ZT1VUVUJFX1BMQVlMSVNULCBgaHR0cHM6Ly93d3cueW91dHViZS5jb20vcGxheWxpc3Q/bGlzdD0ke3BsYXlsaXN0SWR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChRdWVyeVJlc29sdmVyLnZhbGlkYXRlSWQocXVlcnkpIHx8IFF1ZXJ5UmVzb2x2ZXIudmFsaWRhdGVVUkwocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLllPVVRVQkVfVklERU8sIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5TcG90aWZ5LmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkucmVwbGFjZSgvaW50bC0oW2EtekEtWl0rKVxcLy8sICcnKTtcbiAgICAgICAgICAgICAgICBpZiAoc3BvdGlmeVBsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICAgICAgICAgIGlmIChzcG90aWZ5QWxidW1SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TUE9USUZZX0FMQlVNLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgaWYgKHNwb3RpZnlTb25nUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9TT05HLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuVmltZW8uaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZpbWVvUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuVklNRU8sIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5SZXZlcmJOYXRpb24uaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJldmVyYm5hdGlvblJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlJFVkVSQk5BVElPTiwgcXVlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlNvdW5kQ2xvdWQuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNvdW5kY2xvdWRQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNPVU5EQ0xPVURfUExBWUxJU1QsIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICBpZiAoc291bmRjbG91ZFRyYWNrUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU09VTkRDTE9VRF9UUkFDSywgcXVlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLkFwcGxlTXVzaWMuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFwcGxlTXVzaWNBbGJ1bVJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX0FMQlVNLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgaWYgKGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX1BMQVlMSVNULCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgaWYgKGFwcGxlTXVzaWNTb25nUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVBQTEVfTVVTSUNfU09ORywgcXVlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFSQklUUkFSWSwgcXVlcnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHZpbWVvIGlkIGZyb20gdXJsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IFRoZSBxdWVyeVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldFZpbWVvSUQocXVlcnk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gUXVlcnlSZXNvbHZlci5yZXNvbHZlKHF1ZXJ5KS50eXBlID09PSBRdWVyeVR5cGUuVklNRU8gPyBxdWVyeS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKS5wb3AoKSA6IG51bGw7XG4gICAgfVxuXG4gICAgc3RhdGljIHZhbGlkYXRlSWQocTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB5b3V0dWJlVmlkZW9JZFJlZ2V4LnRlc3QocSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHZhbGlkYXRlVVJMKHE6IHN0cmluZykge1xuICAgICAgICByZXR1cm4geW91dHViZVZpZGVvVVJMUmVnZXgudGVzdChxKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFF1ZXJ5UmVzb2x2ZXIgfTtcbiIsICJpbXBvcnQgeyBTbm93Zmxha2VVdGlsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQWJvcnRTaWduYWwgdG8gY2FuY2VsIHRoaXMgZW50cnlcbiAgICAgKi9cbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuZXhwb3J0IHR5cGUgQXN5bmNRdWV1ZUV4Y2VwdGlvbkhhbmRsZXIgPSAoZXhjZXB0aW9uOiBFcnJvcikgPT4gdm9pZDtcblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBxdWV1ZWQgZW50cmllc1xuICAgICAqL1xuICAgIHB1YmxpYyBlbnRyaWVzOiBBcnJheTxBc3luY1F1ZXVlRW50cnk+ID0gW107XG5cbiAgICBwdWJsaWMgZXhjZXB0aW9uSGFuZGxlcj86IEFzeW5jUXVldWVFeGNlcHRpb25IYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgZW50cmllcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBjb25zdW1lIFdoZXRoZXIgb3Igbm90IHRvIGNvbnN1bWUgYWxsIGVudHJpZXMgYmVmb3JlIGNsZWFyaW5nXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKGNvbnN1bWUgPSBmYWxzZSkge1xuICAgICAgICBpZiAoY29uc3VtZSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiBlbnRyeS5jb25zdW1lKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnRyaWVzID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgcXVldWUuIFJldHVybnMgYDBgIGlmIG5vIGVudHJpZXMgYXJlIGF2YWlsYWJsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFjcXVpcmUgYW4gZW50cnkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSAvLyBsb2NrIHRoZSBxdWV1ZVxuICAgICAqIGNvbnN0IGVudHJ5ID0gYXN5bmNRdWV1ZS5hY3F1aXJlKCk7XG4gICAgICogLy8gd2FpdCB1bnRpbCBwcmV2aW91cyB0YXNrIGlzIGNvbXBsZXRlZFxuICAgICAqIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgKiAvLyBkbyBzb21ldGhpbmcgZXhwZW5zaXZlXG4gICAgICogYXdhaXQgcGVyZm9ybVNvbWV0aGluZ0V4cGVuc2l2ZSgpO1xuICAgICAqIC8vIG1ha2Ugc3VyZSB0byByZWxlYXNlIHRoZSBsb2NrIG9uY2UgZG9uZVxuICAgICAqIGFzeW5jUXVldWUucmVsZWFzZSgpO1xuICAgICAqXG4gICAgICovXG4gICAgcHVibGljIGFjcXVpcmUob3B0aW9ucz86IEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSBuZXcgQXN5bmNRdWV1ZUVudHJ5KHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmICh0aGlzLmV4Y2VwdGlvbkhhbmRsZXIpIGVudHJ5LmdldFRhc2soKS5jYXRjaCh0aGlzLmV4Y2VwdGlvbkhhbmRsZXIpO1xuXG4gICAgICAgIGlmICh0aGlzLmVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgICAgICBlbnRyeS5jb25zdW1lKCk7XG4gICAgICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlIHRoZSBjdXJyZW50IGFjcXVpc2l0aW9uIGFuZCBtb3ZlIHRvIG5leHQgZW50cnkuXG4gICAgICovXG4gICAgcHVibGljIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5lbnRyaWVzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuZW50cmllcy5zaGlmdCgpO1xuICAgICAgICB0aGlzLmVudHJpZXNbMF0/LmNvbnN1bWUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgYWxsIGVudHJpZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FuY2VsQWxsKCkge1xuICAgICAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IGVudHJ5LmNhbmNlbCgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIGVudHJ5IGZyb20gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGVudHJ5IFRoZSBlbnRyeSB0byByZW1vdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlRW50cnkoZW50cnk6IEFzeW5jUXVldWVFbnRyeSkge1xuICAgICAgICBjb25zdCBlbnRyeUlkeCA9IHRoaXMuZW50cmllcy5pbmRleE9mKGVudHJ5KTtcblxuICAgICAgICBpZiAoZW50cnlJZHggIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc3BsaWNlKGVudHJ5SWR4LCAxKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWVFbnRyeSB7XG4gICAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICAgIHB1YmxpYyBzaWduYWw6IEFib3J0U2lnbmFsIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIG9uQWJvcnQ6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcmVzb2x2ZSE6ICgpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSByZWplY3QhOiAoZXJyOiBFcnJvcikgPT4gdm9pZDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEFzeW5jUXVldWUsIHB1YmxpYyBvcHRpb25zPzogQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucykge1xuICAgICAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgdGhpcy5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnM/LnNpZ25hbCkge1xuICAgICAgICAgICAgdGhpcy5zZXRBYm9ydFNpZ25hbCh0aGlzLm9wdGlvbnMuc2lnbmFsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRBYm9ydFNpZ25hbChzaWduYWw6IEFib3J0U2lnbmFsKSB7XG4gICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNpZ25hbCA9IHNpZ25hbDtcbiAgICAgICAgdGhpcy5vbkFib3J0ID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5yZW1vdmVFbnRyeSh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25zdW1lKCkge1xuICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgICAgdGhpcy5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbGVhc2UoKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpO1xuICAgICAgICB0aGlzLnF1ZXVlLnJlbGVhc2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuY2VsKCkge1xuICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgICAgdGhpcy5yZWplY3QobmV3IEVycm9yKCdDYW5jZWxsZWQnKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFudXAoKSB7XG4gICAgICAgIGlmICh0aGlzLm9uQWJvcnQpIHRoaXMuc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIHRoaXMub25BYm9ydCk7XG4gICAgICAgIHRoaXMuc2lnbmFsID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbkFib3J0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VGFzaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRmlsdGVyc05hbWUsIFF1ZXVlRmlsdGVycyB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IEF1ZGlvRmlsdGVycyB9IGZyb20gJy4uL3V0aWxzL0F1ZGlvRmlsdGVycyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgQmlxdWFkRmlsdGVycywgRXF1YWxpemVyLCBFcXVhbGl6ZXJCYW5kLCBQQ01GaWx0ZXJzIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBGRm1wZWdTdHJlYW1PcHRpb25zLCBjcmVhdGVGRm1wZWdTdHJlYW0gfSBmcm9tICcuLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbnR5cGUgRmlsdGVycyA9IGtleW9mIHR5cGVvZiBBdWRpb0ZpbHRlcnMuZmlsdGVycztcblxuY29uc3QgbWFrZUJhbmRzID0gKGFycjogbnVtYmVyW10pID0+IHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgICAge1xuICAgICAgICAgICAgbGVuZ3RoOiBFcXVhbGl6ZXIuQkFORF9DT1VOVFxuICAgICAgICB9LFxuICAgICAgICAoXywgaSkgPT4gKHtcbiAgICAgICAgICAgIGJhbmQ6IGksXG4gICAgICAgICAgICBnYWluOiBhcnJbaV0gPyBhcnJbaV0gLyAzMCA6IDBcbiAgICAgICAgfSlcbiAgICApIGFzIEVxdWFsaXplckJhbmRbXTtcbn07XG5cbnR5cGUgRVFQcmVzZXQgPSB7XG4gICAgRmxhdDogRXF1YWxpemVyQmFuZFtdO1xuICAgIENsYXNzaWNhbDogRXF1YWxpemVyQmFuZFtdO1xuICAgIENsdWI6IEVxdWFsaXplckJhbmRbXTtcbiAgICBEYW5jZTogRXF1YWxpemVyQmFuZFtdO1xuICAgIEZ1bGxCYXNzOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgRnVsbEJhc3NUcmVibGU6IEVxdWFsaXplckJhbmRbXTtcbiAgICBGdWxsVHJlYmxlOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgSGVhZHBob25lczogRXF1YWxpemVyQmFuZFtdO1xuICAgIExhcmdlSGFsbDogRXF1YWxpemVyQmFuZFtdO1xuICAgIExpdmU6IEVxdWFsaXplckJhbmRbXTtcbiAgICBQYXJ0eTogRXF1YWxpemVyQmFuZFtdO1xuICAgIFBvcDogRXF1YWxpemVyQmFuZFtdO1xuICAgIFJlZ2dhZTogRXF1YWxpemVyQmFuZFtdO1xuICAgIFJvY2s6IEVxdWFsaXplckJhbmRbXTtcbiAgICBTa2E6IEVxdWFsaXplckJhbmRbXTtcbiAgICBTb2Z0OiBFcXVhbGl6ZXJCYW5kW107XG4gICAgU29mdFJvY2s6IEVxdWFsaXplckJhbmRbXTtcbiAgICBUZWNobm86IEVxdWFsaXplckJhbmRbXTtcbn07XG5cbmV4cG9ydCBjb25zdCBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0OiBSZWFkb25seTxFUVByZXNldD4gPSBPYmplY3QuZnJlZXplKHtcbiAgICBGbGF0OiBtYWtlQmFuZHMoW10pLFxuICAgIENsYXNzaWNhbDogbWFrZUJhbmRzKFstMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNy4yLCAtNy4yLCAtOS42XSksXG4gICAgQ2x1YjogbWFrZUJhbmRzKFstMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgOC4wLCA1LjYsIDUuNiwgNS42LCAzLjIsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdKSxcbiAgICBEYW5jZTogbWFrZUJhbmRzKFs5LjYsIDcuMiwgMi40LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTcuMiwgLTcuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdKSxcbiAgICBGdWxsQmFzczogbWFrZUJhbmRzKFstOC4wLCA5LjYsIDkuNiwgNS42LCAxLjYsIC00LjAsIC04LjAsIC0xMC40LCAtMTEuMiwgLTExLjJdKSxcbiAgICBGdWxsQmFzc1RyZWJsZTogbWFrZUJhbmRzKFs3LjIsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNC44LCAxLjYsIDguMCwgMTEuMiwgMTIuMCwgMTIuMF0pLFxuICAgIEZ1bGxUcmVibGU6IG1ha2VCYW5kcyhbLTkuNiwgLTkuNiwgLTkuNiwgLTQuMCwgMi40LCAxMS4yLCAxNi4wLCAxNi4wLCAxNi4wLCAxNi44XSksXG4gICAgSGVhZHBob25lczogbWFrZUJhbmRzKFs0LjgsIDExLjIsIDUuNiwgLTMuMiwgLTIuNCwgMS42LCA0LjgsIDkuNiwgMTIuOCwgMTQuNF0pLFxuICAgIExhcmdlSGFsbDogbWFrZUJhbmRzKFsxMC40LCAxMC40LCA1LjYsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNC44LCAtNC44LCAtNC44LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV0pLFxuICAgIExpdmU6IG1ha2VCYW5kcyhbLTQuOCwgLTEuMTEwMjJlLTE1LCA0LjAsIDUuNiwgNS42LCA1LjYsIDQuMCwgMi40LCAyLjQsIDIuNF0pLFxuICAgIFBhcnR5OiBtYWtlQmFuZHMoWzcuMiwgNy4yLCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCA3LjIsIDcuMl0pLFxuICAgIFBvcDogbWFrZUJhbmRzKFstMS42LCA0LjgsIDcuMiwgOC4wLCA1LjYsIC0xLjExMDIyZS0xNSwgLTIuNCwgLTIuNCwgLTEuNiwgLTEuNl0pLFxuICAgIFJlZ2dhZTogbWFrZUJhbmRzKFstMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtNS42LCAtMS4xMTAyMmUtMTUsIDYuNCwgNi40LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1XSksXG4gICAgUm9jazogbWFrZUJhbmRzKFs4LjAsIDQuOCwgLTUuNiwgLTguMCwgLTMuMiwgNC4wLCA4LjgsIDExLjIsIDExLjIsIDExLjJdKSxcbiAgICBTa2E6IG1ha2VCYW5kcyhbLTIuNCwgLTQuOCwgLTQuMCwgLTEuMTEwMjJlLTE1LCA0LjAsIDUuNiwgOC44LCA5LjYsIDExLjIsIDkuNl0pLFxuICAgIFNvZnQ6IG1ha2VCYW5kcyhbNC44LCAxLjYsIC0xLjExMDIyZS0xNSwgLTIuNCwgLTEuMTEwMjJlLTE1LCA0LjAsIDguMCwgOS42LCAxMS4yLCAxMi4wXSksXG4gICAgU29mdFJvY2s6IG1ha2VCYW5kcyhbNC4wLCA0LjAsIDIuNCwgLTEuMTEwMjJlLTE1LCAtNC4wLCAtNS42LCAtMy4yLCAtMS4xMTAyMmUtMTUsIDIuNCwgOC44XSksXG4gICAgVGVjaG5vOiBtYWtlQmFuZHMoWzguMCwgNS42LCAtMS4xMTAyMmUtMTUsIC01LjYsIC00LjgsIC0xLjExMDIyZS0xNSwgOC4wLCA5LjYsIDkuNiwgOC44XSlcbn0pO1xuXG5leHBvcnQgY2xhc3MgRkZtcGVnRmlsdGVyZXI8TWV0YSA9IHVua25vd24+IHtcbiAgICAjZmZtcGVnRmlsdGVyczogRmlsdGVyc1tdID0gW107XG4gICAgI2lucHV0QXJnczogc3RyaW5nW10gPSBbXTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGFmOiBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgZmZtcGVnIG1heSBiZSBza2lwcGVkXG4gICAgICovXG4gICAgcHVibGljIGdldCBza2lwcGFibGUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuYWYucXVldWUucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZztcbiAgICB9XG5cbiAgICAjc2V0RmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJzW10pIHtcbiAgICAgICAgY29uc3QgeyBxdWV1ZSB9ID0gdGhpcy5hZjtcbiAgICAgICAgLy8gc2tpcCBpZiBmaWx0ZXJzIGFyZSB0aGUgc2FtZVxuICAgICAgICBpZiAoZmlsdGVycy5ldmVyeSgoZikgPT4gdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmKSkgJiYgdGhpcy4jZmZtcGVnRmlsdGVycy5ldmVyeSgoZikgPT4gZmlsdGVycy5pbmNsdWRlcyhmKSkpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgICAgICBjb25zdCBpZ25vcmVGaWx0ZXJzID0gdGhpcy5maWx0ZXJzLnNvbWUoKGZmKSA9PiBmZiA9PT0gJ25pZ2h0Y29yZScgfHwgZmYgPT09ICd2YXBvcndhdmUnKSAmJiAhZmlsdGVycy5zb21lKChmZikgPT4gZmYgPT09ICduaWdodGNvcmUnIHx8IGZmID09PSAndmFwb3J3YXZlJyk7XG4gICAgICAgIGNvbnN0IHNlZWtUaW1lID0gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyk/LmN1cnJlbnQudmFsdWUgfHwgMDtcbiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuc2xpY2UoKTtcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IFsuLi5uZXcgU2V0KGZpbHRlcnMpXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hZi50cmlnZ2VyUmVwbGF5KHNlZWtUaW1lKS50aGVuKCh0KSA9PiB7XG4gICAgICAgICAgICBxdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb0ZpbHRlcnNVcGRhdGUsIHF1ZXVlLCBwcmV2LCB0aGlzLiNmZm1wZWdGaWx0ZXJzLnNsaWNlKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBpbnB1dCBhcmdzIGZvciBGRm1wZWdcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0SW5wdXRBcmdzKGFyZ3M6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghYXJncy5ldmVyeSgoYXJnKSA9PiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJykpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2FyZ3MnLCAnQXJyYXk8c3RyaW5nPicsICdpbnZhbGlkIGl0ZW0ocyknKTtcbiAgICAgICAgdGhpcy4jaW5wdXRBcmdzID0gYXJncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgaW5wdXQgYXJnc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaW5wdXRBcmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaW5wdXRBcmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBlbmNvZGVyIGFyZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVuY29kZXJBcmdzKCkge1xuICAgICAgICBpZiAoIXRoaXMuZmlsdGVycy5sZW5ndGgpIHJldHVybiBbXTtcblxuICAgICAgICByZXR1cm4gWyctYWYnLCB0aGlzLnRvU3RyaW5nKCldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBmaW5hbCBmZm1wZWcgYXJnc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYXJncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRBcmdzLmNvbmNhdCh0aGlzLmVuY29kZXJBcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZmZtcGVnIHN0cmVhbVxuICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIHN0cmVhbSBzb3VyY2VcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgc3RyZWFtIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlU3RyZWFtKHNvdXJjZTogc3RyaW5nIHwgUmVhZGFibGUsIG9wdGlvbnM6IEZGbXBlZ1N0cmVhbU9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRoaXMuI2lucHV0QXJncy5sZW5ndGgpIG9wdGlvbnMuZW5jb2RlckFyZ3MgPSBbLi4udGhpcy4jaW5wdXRBcmdzLCAuLi4ob3B0aW9ucy5lbmNvZGVyQXJncyB8fCBbXSldO1xuICAgICAgICByZXR1cm4gY3JlYXRlRkZtcGVnU3RyZWFtKHNvdXJjZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGZmbXBlZyBmaWx0ZXJzXG4gICAgICogQHBhcmFtIGZpbHRlcnMgVGhlIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJzW10gfCBSZWNvcmQ8RmlsdGVycywgYm9vbGVhbj4gfCBib29sZWFuKSB7XG4gICAgICAgIGxldCBfZmlsdGVyczogRmlsdGVyc1tdID0gW107XG4gICAgICAgIGlmICh0eXBlb2YgZmlsdGVycyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBfZmlsdGVycyA9ICFmaWx0ZXJzID8gW10gOiAoT2JqZWN0LmtleXMoQXVkaW9GaWx0ZXJzLmZpbHRlcnMpIGFzIEZpbHRlcnNbXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkge1xuICAgICAgICAgICAgX2ZpbHRlcnMgPSBmaWx0ZXJzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX2ZpbHRlcnMgPSBPYmplY3QuZW50cmllcyhmaWx0ZXJzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHJlcykgPT4gcmVzWzFdID09PSB0cnVlKVxuICAgICAgICAgICAgICAgIC5tYXAoKG0pID0+IG1bMF0pIGFzIEZpbHRlcnNbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLiNzZXRGaWx0ZXJzKF9maWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50bHkgYWN0aXZlIGZmbXBlZyBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZmZtcGVnRmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdKSB7XG4gICAgICAgIHRoaXMuc2V0RmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgZ2l2ZW4gZmZtcGVnIGZpbHRlcihzKVxuICAgICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBmaWx0ZXIocylcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKGZpbHRlcnM6IEZpbHRlcnNbXSB8IEZpbHRlcnMpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSBmaWx0ZXJzID0gW2ZpbHRlcnNdO1xuICAgICAgICBjb25zdCBmcmVzaDogRmlsdGVyc1tdID0gW107XG5cbiAgICAgICAgZmlsdGVycy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLmluY2x1ZGVzKGYpKSByZXR1cm47XG4gICAgICAgICAgICBmcmVzaC5wdXNoKGYpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyh0aGlzLiNmZm1wZWdGaWx0ZXJzLmZpbHRlcigocikgPT4gIWZpbHRlcnMuaW5jbHVkZXMocikpLmNvbmNhdChmcmVzaCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBkZWZhdWx0IGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gZmYgRmlsdGVycyBsaXN0XG4gICAgICovXG4gICAgcHVibGljIHNldERlZmF1bHRzKGZmOiBGaWx0ZXJzW10pIHtcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IGZmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBsaXN0IG9mIGVuYWJsZWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXJzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGxpc3Qgb2YgZGlzYWJsZWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXJzRGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb0ZpbHRlcnMubmFtZXMuZmlsdGVyKChmKSA9PiAhdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBlbmFibGVkXG4gICAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyXG4gICAgICovXG4gICAgcHVibGljIGlzRW5hYmxlZDxUIGV4dGVuZHMgRmlsdGVycz4oZmlsdGVyOiBUKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGZpbHRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBkaXNhYmxlZFxuICAgICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlclxuICAgICAqL1xuICAgIHB1YmxpYyBpc0Rpc2FibGVkPFQgZXh0ZW5kcyBGaWx0ZXJzPihmaWx0ZXI6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzRW5hYmxlZChmaWx0ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgYSB2YWxpZCBmaWx0ZXJcbiAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gdGVzdFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1ZhbGlkRmlsdGVyKGZpbHRlcjogc3RyaW5nKTogZmlsdGVyIGlzIEZpbHRlcnNOYW1lIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5oYXMoZmlsdGVyIGFzIEZpbHRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgY3VycmVudCBmaWx0ZXJzIHRvIGFycmF5XG4gICAgICovXG4gICAgcHVibGljIHRvQXJyYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcnMubWFwKChmaWx0ZXIpID0+IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBjdXJyZW50IGZpbHRlcnMgdG8gSlNPTiBvYmplY3RcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9KU09OKCkge1xuICAgICAgICBjb25zdCBvYmogPSB7fSBhcyBSZWNvcmQ8a2V5b2YgUXVldWVGaWx0ZXJzLCBzdHJpbmc+O1xuXG4gICAgICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChmaWx0ZXIpID0+IChvYmpbZmlsdGVyXSA9IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSkpO1xuXG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGN1cnJlbnQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5jcmVhdGUodGhpcy5maWx0ZXJzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUge1xuICAgIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICAgIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IG51bGw7XG4gICAgZmlsdGVyczogUENNRmlsdGVyc1tdO1xuICAgIHZvbHVtZTogbnVtYmVyO1xuICAgIHNhbXBsZVJhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgZ3JhcGggPSBuZXcgQUZpbHRlckdyYXBoPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBmZm1wZWcgPSBuZXcgRkZtcGVnRmlsdGVyZXI8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIGVxdWFsaXplclByZXNldHMgPSBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0O1xuICAgIHB1YmxpYyBfbGFzdEZpbHRlcnNDYWNoZTogR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUgPSB7XG4gICAgICAgIGJpcXVhZDogbnVsbCxcbiAgICAgICAgZXF1YWxpemVyOiBbXSxcbiAgICAgICAgZmlsdGVyczogW10sXG4gICAgICAgIHZvbHVtZTogMTAwLFxuICAgICAgICBzYW1wbGVSYXRlOiAtMVxuICAgIH07XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy52b2x1bWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHRoaXMucXVldWUub3B0aW9ucy52b2x1bWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBlbmFibGUgdGhpcyBpbiB0aGUgZnV0dXJlXG4gICAgLy8gcHVibGljIGdldCBmZm1wZWcoKTogRkZtcGVnRmlsdGVyZXI8TWV0YT4gfCBudWxsIHtcbiAgICAvLyAgICAgaWYgKHRoaXMucXVldWUucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZykge1xuICAgIC8vICAgICAgICAgaWYgKHRoaXMuI2ZmbXBlZykgdGhpcy4jZmZtcGVnID0gbnVsbDtcbiAgICAvLyAgICAgICAgIHJldHVybiBudWxsO1xuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgaWYgKCF0aGlzLiNmZm1wZWcpIHtcbiAgICAvLyAgICAgICAgIHRoaXMuI2ZmbXBlZyA9IG5ldyBGRm1wZWdGaWx0ZXJlcjxNZXRhPih0aGlzKTtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIHJldHVybiB0aGlzLiNmZm1wZWc7XG4gICAgLy8gfVxuXG4gICAgLyoqXG4gICAgICogVm9sdW1lIHRyYW5zZm9ybWVyXG4gICAgICovXG4gICAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmRzcD8udm9sdW1lIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogMTUgQmFuZCBFcXVhbGl6ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZXF1YWxpemVyIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlnaXRhbCBiaXF1YWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5iaXF1YWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEU1AgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZmlsdGVycyB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF1ZGlvIHJlc2FtcGxlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5yZXNhbXBsZXIgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYXkgY3VycmVudCB0cmFjayBpbiB0cmFuc2l0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gc2VlayBUaGUgZHVyYXRpb24gdG8gc2VlayB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB0cmlnZ2VyUmVwbGF5KHNlZWsgPSAwKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLnF1ZXVlLm5vZGUudGFza3NRdWV1ZS5hY3F1aXJlKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLm5vZGUucGxheSh0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaywge1xuICAgICAgICAgICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZWVrLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25Nb2RlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFGaWx0ZXJHcmFwaDxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYWY6IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4pIHt9XG5cbiAgICBwdWJsaWMgZ2V0IGZmbXBlZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWYuZmZtcGVnPy5maWx0ZXJzID8/IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuYWYuZXF1YWxpemVyPy5iYW5kTXVsdGlwbGllcnMgfHwgW10pLm1hcCgobSwgaSkgPT4gKHtcbiAgICAgICAgICAgIGJhbmQ6IGksXG4gICAgICAgICAgICBnYWluOiBtXG4gICAgICAgIH0pKSBhcyBFcXVhbGl6ZXJCYW5kW107XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5hZi5iaXF1YWQ/LmdldEZpbHRlck5hbWUoKSBhcyBFeGNsdWRlPEJpcXVhZEZpbHRlcnMsIG51bWJlcj4gfCBudWxsKSB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWYuZmlsdGVycz8uZmlsdGVycyB8fCBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWYudm9sdW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi5yZXNhbXBsZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGR1bXAoKTogRmlsdGVyR3JhcGgge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmZtcGVnOiB0aGlzLmZmbXBlZyxcbiAgICAgICAgICAgIGVxdWFsaXplcjogdGhpcy5lcXVhbGl6ZXIsXG4gICAgICAgICAgICBiaXF1YWQ6IHRoaXMuYmlxdWFkLFxuICAgICAgICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzLFxuICAgICAgICAgICAgc2FtcGxlUmF0ZTogdGhpcy5yZXNhbXBsZXI/LnRhcmdldFNhbXBsZVJhdGUgfHwgdGhpcy5yZXNhbXBsZXI/LnNhbXBsZVJhdGUgfHwgNDgwMDAsXG4gICAgICAgICAgICB2b2x1bWU6IHRoaXMudm9sdW1lPy52b2x1bWUgPz8gMTAwXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckdyYXBoIHtcbiAgICBmZm1wZWc6IEZpbHRlcnNbXTtcbiAgICBlcXVhbGl6ZXI6IEVxdWFsaXplckJhbmRbXTtcbiAgICBiaXF1YWQ6IEV4Y2x1ZGU8QmlxdWFkRmlsdGVycywgbnVtYmVyPiB8IG51bGw7XG4gICAgZmlsdGVyczogUENNRmlsdGVyc1tdO1xuICAgIHZvbHVtZTogbnVtYmVyO1xuICAgIHNhbXBsZVJhdGU6IG51bWJlcjtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IER1cGxleCwgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0ICogYXMgcHJpc20gZnJvbSAncHJpc20tbWVkaWEnO1xuaW1wb3J0IHsgRkZtcGVnIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRkZtcGVnU3RyZWFtT3B0aW9ucyB7XG4gICAgZm10Pzogc3RyaW5nO1xuICAgIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gICAgc2Vlaz86IG51bWJlcjtcbiAgICBza2lwPzogYm9vbGVhbjtcbiAgICBjb29raWVzPzogc3RyaW5nO1xuICAgIHVzZUxlZ2FjeUZGbXBlZz86IGJvb2xlYW47XG59XG5cbmNvbnN0IGdldEZGbXBlZ1Byb3ZpZGVyID0gKGxlZ2FjeSA9IGZhbHNlKSA9PiAobGVnYWN5ID8gKHByaXNtIGFzIHR5cGVvZiBwcmlzbSAmIHsgZGVmYXVsdDogdHlwZW9mIHByaXNtIH0pLmRlZmF1bHQ/LkZGbXBlZyB8fCBwcmlzbS5GRm1wZWcgOiBGRm1wZWcpO1xuXG5leHBvcnQgZnVuY3Rpb24gRkZNUEVHX0FSR1NfU1RSSU5HKHN0cmVhbTogc3RyaW5nLCBmbXQ/OiBzdHJpbmcsIGNvb2tpZXM/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgICAnLXJlY29ubmVjdCcsXG4gICAgICAgICcxJyxcbiAgICAgICAgJy1yZWNvbm5lY3Rfc3RyZWFtZWQnLFxuICAgICAgICAnMScsXG4gICAgICAgICctcmVjb25uZWN0X2RlbGF5X21heCcsXG4gICAgICAgICc1JyxcbiAgICAgICAgJy1pJyxcbiAgICAgICAgc3RyZWFtLFxuICAgICAgICAnLWFuYWx5emVkdXJhdGlvbicsXG4gICAgICAgICcwJyxcbiAgICAgICAgJy1sb2dsZXZlbCcsXG4gICAgICAgICcwJyxcbiAgICAgICAgJy1hcicsXG4gICAgICAgICc0ODAwMCcsXG4gICAgICAgICctYWMnLFxuICAgICAgICAnMicsXG4gICAgICAgICctZicsXG4gICAgICAgIGAke3R5cGVvZiBmbXQgPT09ICdzdHJpbmcnID8gZm10IDogJ3MxNmxlJ31gXG4gICAgXTtcblxuICAgIGlmIChmbXQgPT09ICdvcHVzJykge1xuICAgICAgICBhcmdzLnB1c2goJy1hY29kZWMnLCAnbGlib3B1cycpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29va2llcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9mZm1wZWcub3JnL2ZmbXBlZy1wcm90b2NvbHMuaHRtbCNIVFRQLUNvb2tpZXNcbiAgICAgICAgYXJncy5wdXNoKCctY29va2llcycsIGNvb2tpZXMuc3RhcnRzV2l0aCgnXCInKSA/IGNvb2tpZXMgOiBgXCIke2Nvb2tpZXN9XCJgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZGTVBFR19BUkdTX1BJUEVEKGZtdD86IHN0cmluZykge1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIGNvbnN0IGFyZ3MgPSBbXG4gICAgICAgICctYW5hbHl6ZWR1cmF0aW9uJyxcbiAgICAgICAgJzAnLFxuICAgICAgICAnLWxvZ2xldmVsJyxcbiAgICAgICAgJzAnLFxuICAgICAgICAnLWFyJyxcbiAgICAgICAgJzQ4MDAwJyxcbiAgICAgICAgJy1hYycsXG4gICAgICAgICcyJyxcbiAgICAgICAgJy1mJyxcbiAgICAgICAgYCR7dHlwZW9mIGZtdCA9PT0gJ3N0cmluZycgPyBmbXQgOiAnczE2bGUnfWAsXG4gICAgXTtcblxuICAgIGlmIChmbXQgPT09ICdvcHVzJykge1xuICAgICAgICBhcmdzLnB1c2goJy1hY29kZWMnLCAnbGlib3B1cycpO1xuICAgIH1cblxuICAgIHJldHVybiBhcmdzO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgRkZtcGVnIHN0cmVhbVxuICogQHBhcmFtIHN0cmVhbSBUaGUgc291cmNlIHN0cmVhbVxuICogQHBhcmFtIG9wdGlvbnMgRkZtcGVnIHN0cmVhbSBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGRm1wZWdTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZSB8IER1cGxleCB8IHN0cmluZywgb3B0aW9ucz86IEZGbXBlZ1N0cmVhbU9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucz8uc2tpcCAmJiB0eXBlb2Ygc3RyZWFtICE9PSAnc3RyaW5nJykgcmV0dXJuIHN0cmVhbTtcbiAgICBvcHRpb25zID8/PSB7fTtcbiAgICBjb25zdCBhcmdzID0gdHlwZW9mIHN0cmVhbSA9PT0gJ3N0cmluZycgPyBGRk1QRUdfQVJHU19TVFJJTkcoc3RyZWFtLCBvcHRpb25zLmZtdCwgb3B0aW9ucy5jb29raWVzKSA6IEZGTVBFR19BUkdTX1BJUEVEKG9wdGlvbnMuZm10KTtcblxuICAgIGlmICghTnVtYmVyLmlzTmFOKG9wdGlvbnMuc2VlaykpIGFyZ3MudW5zaGlmdCgnLXNzJywgU3RyaW5nKG9wdGlvbnMuc2VlaykpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuZW5jb2RlckFyZ3MpKSBhcmdzLnB1c2goLi4ub3B0aW9ucy5lbmNvZGVyQXJncyk7XG5cbiAgICBjb25zdCBGRk1QRUcgPSBnZXRGRm1wZWdQcm92aWRlcighIW9wdGlvbnMudXNlTGVnYWN5RkZtcGVnKTtcblxuICAgIGNvbnN0IHRyYW5zY29kZXIgPSBuZXcgRkZNUEVHKHsgc2hlbGw6IGZhbHNlLCBhcmdzIH0pO1xuXG4gICAgdHJhbnNjb2Rlci5vbignY2xvc2UnLCAoKSA9PiB0cmFuc2NvZGVyLmRlc3Ryb3koKSk7XG5cbiAgICBpZiAodHlwZW9mIHN0cmVhbSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3RyZWFtLm9uKCdlcnJvcicsICgpID0+IHRyYW5zY29kZXIuZGVzdHJveSgpKTtcbiAgICAgICAgc3RyZWFtLnBpcGUodHJhbnNjb2Rlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zY29kZXI7XG59XG4iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSB7XG4gICAgbGF0ZW5jeToge1xuICAgICAgICBldmVudExvb3A6IG51bWJlcjtcbiAgICAgICAgdm9pY2VDb25uZWN0aW9uOiBudW1iZXI7XG4gICAgfTtcbiAgICBzdGF0dXM6IHtcbiAgICAgICAgYnVmZmVyaW5nOiBib29sZWFuO1xuICAgICAgICBwbGF5aW5nOiBib29sZWFuO1xuICAgICAgICBwYXVzZWQ6IGJvb2xlYW47XG4gICAgICAgIGlkbGU6IGJvb2xlYW47XG4gICAgfTtcbiAgICB0cmFja3NDb3VudDogbnVtYmVyO1xuICAgIGhpc3RvcnlTaXplOiBudW1iZXI7XG4gICAgZXh0cmFjdG9yczogbnVtYmVyO1xuICAgIGxpc3RlbmVyczogbnVtYmVyO1xuICAgIG1lbW9yeVVzYWdlOiBOb2RlSlMuTWVtb3J5VXNhZ2U7XG4gICAgdmVyc2lvbnM6IHtcbiAgICAgICAgbm9kZTogc3RyaW5nO1xuICAgICAgICBwbGF5ZXI6IHN0cmluZztcbiAgICB9O1xufVxuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgc3RhdGlzdGljcyBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdlbmVyYXRlKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGF0ZW5jeToge1xuICAgICAgICAgICAgICAgIGV2ZW50TG9vcDogdGhpcy5xdWV1ZS5wbGF5ZXIuZXZlbnRMb29wTGFnLFxuICAgICAgICAgICAgICAgIHZvaWNlQ29ubmVjdGlvbjogdGhpcy5xdWV1ZS5waW5nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgYnVmZmVyaW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNCdWZmZXJpbmcoKSxcbiAgICAgICAgICAgICAgICBwbGF5aW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNQbGF5aW5nKCksXG4gICAgICAgICAgICAgICAgcGF1c2VkOiB0aGlzLnF1ZXVlLm5vZGUuaXNQYXVzZWQoKSxcbiAgICAgICAgICAgICAgICBpZGxlOiB0aGlzLnF1ZXVlLm5vZGUuaXNJZGxlKClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cmFja3NDb3VudDogdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSxcbiAgICAgICAgICAgIGhpc3RvcnlTaXplOiB0aGlzLnF1ZXVlLmhpc3RvcnkudHJhY2tzLnNpemUsXG4gICAgICAgICAgICBleHRyYWN0b3JzOiB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnNpemUsXG4gICAgICAgICAgICBsaXN0ZW5lcnM6IHRoaXMucXVldWUuZ3VpbGQubWVtYmVycy5tZT8udm9pY2UuY2hhbm5lbD8ubWVtYmVycy5maWx0ZXIoKG0pID0+ICFtLnVzZXIuYm90KS5zaXplIHx8IDAsXG4gICAgICAgICAgICBtZW1vcnlVc2FnZTogcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLFxuICAgICAgICAgICAgdmVyc2lvbnM6IHtcbiAgICAgICAgICAgICAgICBub2RlOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgICAgICAgICAgICAgcGxheWVyOiAnNi42LjgnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gYXMgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQbGF5ZXIgfSBmcm9tICcuLi8uLi9QbGF5ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBpbnN0YW5jZXMgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIFBsYXllcj4oKTtcbmV4cG9ydCBjb25zdCBnbG9iYWxSZWdpc3RyeSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgdW5rbm93bj4oKTtcbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi8uLi9QbGF5ZXInO1xuaW1wb3J0IHsgaW5zdGFuY2VzIH0gZnJvbSAnLi9fY29udGFpbmVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFBsYXllcihwbGF5ZXI6IFBsYXllcikge1xuICAgIGlmIChpbnN0YW5jZXMuaGFzKHBsYXllci5pZCkpIHJldHVybiB0cnVlO1xuXG4gICAgaW5zdGFuY2VzLnNldChwbGF5ZXIuaWQsIHBsYXllcik7XG5cbiAgICByZXR1cm4gaW5zdGFuY2VzLmhhcyhwbGF5ZXIuaWQpO1xufVxuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uLy4uL1BsYXllcic7XG5pbXBvcnQgeyBpbnN0YW5jZXMgfSBmcm9tICcuL19jb250YWluZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJQbGF5ZXIocGxheWVyOiBQbGF5ZXIpIHtcbiAgICByZXR1cm4gaW5zdGFuY2VzLmRlbGV0ZShwbGF5ZXIuaWQpO1xufVxuIiwgImltcG9ydCB7IGluc3RhbmNlcyB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQbGF5ZXJzKCkge1xuICAgIHJldHVybiBpbnN0YW5jZXMuYXJyYXkoKTtcbn1cbiIsICJpbXBvcnQgeyBnbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxSZWdpc3RyeSgpIHtcbiAgICByZXR1cm4gZ2xvYmFsUmVnaXN0cnk7XG59XG4iLCAiaW1wb3J0IHsgVm9pY2VDaGFubmVsLCBTdGFnZUNoYW5uZWwsIFNub3dmbGFrZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciwgam9pblZvaWNlQ2hhbm5lbCwgVm9pY2VDb25uZWN0aW9uLCBnZXRWb2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cywgQXVkaW9QbGF5ZXIgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4vU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5jbGFzcyBWb2ljZVV0aWxzIHtcbiAgICAvKipcbiAgICAgKiBWb2ljZSBjb25uZWN0aW9uIGNhY2hlIHRvIHN0b3JlIHZvaWNlIGNvbm5lY3Rpb25zIG9mIHRoZSBQbGF5ZXIgY29tcG9uZW50cy5cbiAgICAgKiBUaGlzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLlxuICAgICAqIEl0IG9ubHkgZXhpc3RzIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FjaGU6IENvbGxlY3Rpb248U25vd2ZsYWtlLCBTdHJlYW1EaXNwYXRjaGVyPiA9IG5ldyBDb2xsZWN0aW9uPFNub3dmbGFrZSwgU3RyZWFtRGlzcGF0Y2hlcj4oKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSB1dGlscyBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge31cblxuICAgIC8qKlxuICAgICAqIEpvaW5zIGEgdm9pY2UgY2hhbm5lbCwgY3JlYXRpbmcgYmFzaWMgc3RyZWFtIGRpc3BhdGNoIG1hbmFnZXJcbiAgICAgKiBAcGFyYW0ge1N0YWdlQ2hhbm5lbHxWb2ljZUNoYW5uZWx9IGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIEpvaW4gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+fVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBjb25uZWN0KFxuICAgICAgICBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgICBkZWFmPzogYm9vbGVhbjtcbiAgICAgICAgICAgIG1heFRpbWU/OiBudW1iZXI7XG4gICAgICAgICAgICBxdWV1ZTogR3VpbGRRdWV1ZTtcbiAgICAgICAgICAgIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG4gICAgICAgICAgICBncm91cD86IHN0cmluZztcbiAgICAgICAgfVxuICAgICk6IFByb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj4ge1xuICAgICAgICBpZiAoIW9wdGlvbnM/LnF1ZXVlKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19HVUlMRF9RVUVVRSgpO1xuICAgICAgICBjb25zdCBjb25uID0gYXdhaXQgdGhpcy5qb2luKGNoYW5uZWwsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBzdWIgPSBuZXcgU3RyZWFtRGlzcGF0Y2hlcihjb25uLCBjaGFubmVsLCBvcHRpb25zLnF1ZXVlLCBvcHRpb25zLm1heFRpbWUsIG9wdGlvbnMuYXVkaW9QbGF5ZXIpO1xuICAgICAgICByZXR1cm4gc3ViO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEpvaW5zIGEgdm9pY2UgY2hhbm5lbFxuICAgICAqIEBwYXJhbSB7U3RhZ2VDaGFubmVsfFZvaWNlQ2hhbm5lbH0gW2NoYW5uZWxdIFRoZSB2b2ljZS9zdGFnZSBjaGFubmVsIHRvIGpvaW5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIEpvaW4gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtWb2ljZUNvbm5lY3Rpb259XG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGpvaW4oXG4gICAgICAgIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgICAgICAgb3B0aW9ucz86IHtcbiAgICAgICAgICAgIGRlYWY/OiBib29sZWFuO1xuICAgICAgICAgICAgbWF4VGltZT86IG51bWJlcjtcbiAgICAgICAgICAgIGdyb3VwPzogc3RyaW5nO1xuICAgICAgICB9XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGNvbm4gPSBqb2luVm9pY2VDaGFubmVsKHtcbiAgICAgICAgICAgIGd1aWxkSWQ6IGNoYW5uZWwuZ3VpbGQuaWQsXG4gICAgICAgICAgICBjaGFubmVsSWQ6IGNoYW5uZWwuaWQsXG4gICAgICAgICAgICBhZGFwdGVyQ3JlYXRvcjogY2hhbm5lbC5ndWlsZC52b2ljZUFkYXB0ZXJDcmVhdG9yIGFzIHVua25vd24gYXMgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvcixcbiAgICAgICAgICAgIHNlbGZEZWFmOiBCb29sZWFuKG9wdGlvbnM/LmRlYWYpLFxuICAgICAgICAgICAgZGVidWc6IHRoaXMucGxheWVyLmV2ZW50cy5saXN0ZW5lckNvdW50KCdkZWJ1ZycpID4gMCxcbiAgICAgICAgICAgIGdyb3VwOiBvcHRpb25zPy5ncm91cFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY29ubjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0cyB2b2ljZSBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIHtWb2ljZUNvbm5lY3Rpb259IGNvbm5lY3Rpb24gVGhlIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzY29ubmVjdChjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24gfCBTdHJlYW1EaXNwYXRjaGVyKSB7XG4gICAgICAgIGlmIChjb25uZWN0aW9uIGluc3RhbmNlb2YgU3RyZWFtRGlzcGF0Y2hlcikgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24udm9pY2VDb25uZWN0aW9uO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHJldHVybiBjb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvL1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBEaXNjb3JkIFBsYXllciB2b2ljZSBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIHtTbm93Zmxha2V9IGd1aWxkIFRoZSBndWlsZCBpZFxuICAgICAqIEByZXR1cm5zIHtTdHJlYW1EaXNwYXRjaGVyfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb25uZWN0aW9uKGd1aWxkOiBTbm93Zmxha2UsIGdyb3VwPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBnZXRWb2ljZUNvbm5lY3Rpb24oZ3VpbGQsIGdyb3VwKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFZvaWNlVXRpbHMgfTtcbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi4vZmFicmljL1NlYXJjaFJlc3VsdCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDYWNoZU9wdGlvbnMge1xuICAgIGNoZWNrSW50ZXJ2YWw/OiBudW1iZXI7XG59XG5cbi8vIDVoXG5jb25zdCBERUZBVUxUX0VYUElSWV9USU1FT1VUID0gMThfMDAwXzAwMDtcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlUHJvdmlkZXI8VD4ge1xuICAgIGdldERhdGEoKTogUHJvbWlzZTxEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUPltdPjtcbiAgICBhZGREYXRhKGRhdGE6IFNlYXJjaFJlc3VsdCk6IFByb21pc2U8dm9pZD47XG4gICAgcmVzb2x2ZShjb250ZXh0OiBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0KTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xufVxuXG5leHBvcnQgY2xhc3MgUXVlcnlDYWNoZSBpbXBsZW1lbnRzIFF1ZXJ5Q2FjaGVQcm92aWRlcjxUcmFjaz4ge1xuICAgICNkZWZhdWx0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VHJhY2s+PigpO1xuICAgIHB1YmxpYyB0aW1lcjogTm9kZUpTLlRpbWVyO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHBsYXllcjogUGxheWVyLFxuICAgICAgICBwdWJsaWMgb3B0aW9uczogUXVlcnlDYWNoZU9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjaGVja0ludGVydmFsOiBERUZBVUxUX0VYUElSWV9USU1FT1VUXG4gICAgICAgIH1cbiAgICApIHtcbiAgICAgICAgdGhpcy50aW1lciA9IHNldEludGVydmFsKHRoaXMuY2xlYW51cC5iaW5kKHRoaXMpLCB0aGlzLmNoZWNrSW50ZXJ2YWwpLnVucmVmKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjaGVja0ludGVydmFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNoZWNrSW50ZXJ2YWwgPz8gREVGQVVMVF9FWFBJUllfVElNRU9VVDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2xlYW51cCgpIHtcbiAgICAgICAgZm9yIChjb25zdCBbaWQsIHZhbHVlXSBvZiB0aGlzLiNkZWZhdWx0Q2FjaGUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5oYXNFeHBpcmVkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy4jZGVmYXVsdENhY2hlLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldERhdGEoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy4jZGVmYXVsdENhY2hlLnZhbHVlcygpXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYWRkRGF0YShkYXRhOiBTZWFyY2hSZXN1bHQpIHtcbiAgICAgICAgZGF0YS50cmFja3MuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2RlZmF1bHRDYWNoZS5oYXMoZC51cmwpKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuc2V0KGQudXJsLCBuZXcgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGUoZCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVzb2x2ZShjb250ZXh0OiBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI2RlZmF1bHRDYWNoZS5nZXQoY29udGV4dC5xdWVyeSk7XG4gICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcy5wbGF5ZXIsIHtcbiAgICAgICAgICAgICAgICBxdWVyeTogY29udGV4dC5xdWVyeSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogY29udGV4dC5yZXF1ZXN0ZWRCeSxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGU6IGNvbnRleHQucXVlcnlUeXBlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLnBsYXllciwge1xuICAgICAgICAgICAgcXVlcnk6IGNvbnRleHQucXVlcnksXG4gICAgICAgICAgICB0cmFja3M6IFtyZXN1bHQuZGF0YV0sXG4gICAgICAgICAgICBwbGF5bGlzdDogbnVsbCxcbiAgICAgICAgICAgIHF1ZXJ5VHlwZTogY29udGV4dC5xdWVyeVR5cGUsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogY29udGV4dC5yZXF1ZXN0ZWRCeVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBleHBpcmVBZnRlciA9IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQ7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBkYXRhOiBULCBleHBpcmVBZnRlcjogbnVtYmVyID0gREVGQVVMVF9FWFBJUllfVElNRU9VVCkge1xuICAgICAgICBpZiAodHlwZW9mIGV4cGlyZUFmdGVyID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5leHBpcmVBZnRlciA9IERhdGUubm93KCkgKyBleHBpcmVBZnRlcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoYXNFeHBpcmVkKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZXhwaXJlQWZ0ZXIgIT09ICdudW1iZXInIHx8IGlzTmFOKHRoaXMuZXhwaXJlQWZ0ZXIpIHx8IHRoaXMuZXhwaXJlQWZ0ZXIgPCAxKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdygpIDw9IHRoaXMuZXhwaXJlQWZ0ZXI7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQge1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyO1xuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IGBleHQ6JHtzdHJpbmd9YDtcbn1cbiIsICJpbXBvcnQgeyBGRm1wZWcgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcbmltcG9ydCB7IENsaWVudCwgU25vd2ZsYWtlVXRpbCwgVm9pY2VTdGF0ZSwgSW50ZW50c0JpdEZpZWxkLCBVc2VyLCBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsIHZlcnNpb24gYXMgZGpzVmVyc2lvbiB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGxheWxpc3QsIFRyYWNrLCBTZWFyY2hSZXN1bHQgfSBmcm9tICcuL2ZhYnJpYyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlRXZlbnRzLCBWb2ljZUNvbm5lY3RDb25maWcsIEd1aWxkTm9kZUNyZWF0ZU9wdGlvbnMsIEd1aWxkTm9kZU1hbmFnZXIsIEd1aWxkUXVldWUsIFJlc291cmNlUGxheU9wdGlvbnMsIEd1aWxkUXVldWVFdmVudCB9IGZyb20gJy4vbWFuYWdlcic7XG5pbXBvcnQgeyBWb2ljZVV0aWxzIH0gZnJvbSAnLi9Wb2ljZUludGVyZmFjZS9Wb2ljZVV0aWxzJztcbmltcG9ydCB7IFBsYXllckV2ZW50cywgUXVlcnlUeXBlLCBTZWFyY2hPcHRpb25zLCBQbGF5ZXJJbml0T3B0aW9ucywgUGxheWxpc3RJbml0RGF0YSwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBRdWVyeVJlc29sdmVyLCBSZXNvbHZlZFF1ZXJ5IH0gZnJvbSAnLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEZXBlbmRlbmN5UmVwb3J0LCB2ZXJzaW9uIGFzIGRWb2ljZVZlcnNpb24gfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4vZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0JztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IgfSBmcm9tICcuL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgKiBhcyBfaW50ZXJuYWxzIGZyb20gJy4vdXRpbHMvX19pbnRlcm5hbF9fJztcbmltcG9ydCB7IFF1ZXJ5Q2FjaGUgfSBmcm9tICcuL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzRW1pdHRlciB9IGZyb20gJy4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgZGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyIH0gZnJvbSAnLi9EZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXInO1xuaW1wb3J0IHsgSVBSb3RhdG9yIH0gZnJvbSAnLi91dGlscy9JUFJvdGF0b3InO1xuaW1wb3J0IHsgQ29udGV4dCwgY3JlYXRlQ29udGV4dCB9IGZyb20gJy4vaG9va3MnO1xuaW1wb3J0IHsgSG9va3NDdHggfSBmcm9tICcuL2hvb2tzL2NvbW1vbic7XG5cbmNvbnN0IGtTaW5nbGV0b24gPSBTeW1ib2woJ0luc3RhbmNlRGlzY29yZFBsYXllclNpbmdsZXRvbicpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUID0gdW5rbm93bj4ge1xuICAgIHRyYWNrOiBUcmFjaztcbiAgICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsO1xuICAgIHNlYXJjaFJlc3VsdDogU2VhcmNoUmVzdWx0O1xuICAgIHF1ZXVlOiBHdWlsZFF1ZXVlPFQ+O1xufVxuXG5leHBvcnQgdHlwZSBUcmFja0xpa2UgPSBzdHJpbmcgfCBUcmFjayB8IFNlYXJjaFJlc3VsdCB8IFRyYWNrW10gfCBQbGF5bGlzdDtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+IGV4dGVuZHMgU2VhcmNoT3B0aW9ucyB7XG4gICAgbm9kZU9wdGlvbnM/OiBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQ+O1xuICAgIGNvbm5lY3Rpb25PcHRpb25zPzogVm9pY2VDb25uZWN0Q29uZmlnO1xuICAgIGF1ZGlvUGxheWVyT3B0aW9ucz86IFJlc291cmNlUGxheU9wdGlvbnM7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gICAgYWZ0ZXJTZWFyY2g/OiAocmVzdWx0OiBTZWFyY2hSZXN1bHQpID0+IFByb21pc2U8U2VhcmNoUmVzdWx0Pjtcbn1cblxuZXhwb3J0IHR5cGUgVm9pY2VTdGF0ZUhhbmRsZXIgPSAocGxheWVyOiBQbGF5ZXIsIHF1ZXVlOiBHdWlsZFF1ZXVlLCBvbGRWb2ljZVN0YXRlOiBWb2ljZVN0YXRlLCBuZXdWb2ljZVN0YXRlOiBWb2ljZVN0YXRlKSA9PiBBd2FpdGVkPHZvaWQ+O1xuXG5leHBvcnQgY2xhc3MgUGxheWVyIGV4dGVuZHMgUGxheWVyRXZlbnRzRW1pdHRlcjxQbGF5ZXJFdmVudHM+IHtcbiAgICAjbGFzdExhdGVuY3kgPSAtMTtcbiAgICAjdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyID0gdGhpcy5oYW5kbGVWb2ljZVN0YXRlLmJpbmQodGhpcyk7XG4gICAgI2xhZ01vbml0b3JUaW1lb3V0ITogTm9kZUpTLlRpbWVvdXQ7XG4gICAgI2xhZ01vbml0b3JJbnRlcnZhbCE6IE5vZGVKUy5UaW1lcjtcbiAgICAjb25Wb2ljZVN0YXRlVXBkYXRlOiBWb2ljZVN0YXRlSGFuZGxlciA9IGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcjtcbiAgICAjaG9va3NDdHg6IENvbnRleHQ8SG9va3NDdHg+IHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmcgPSAnNi42LjgnO1xuICAgIHB1YmxpYyBzdGF0aWMgX3NpbmdsZXRvbktleSA9IGtTaW5nbGV0b247XG4gICAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gICAgcHVibGljIHJlYWRvbmx5IGNsaWVudCE6IENsaWVudDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9ucyE6IFBsYXllckluaXRPcHRpb25zO1xuICAgIHB1YmxpYyBub2RlcyA9IG5ldyBHdWlsZE5vZGVNYW5hZ2VyKHRoaXMpO1xuICAgIHB1YmxpYyByZWFkb25seSB2b2ljZVV0aWxzID0gbmV3IFZvaWNlVXRpbHModGhpcyk7XG4gICAgcHVibGljIGV4dHJhY3RvcnMgPSBuZXcgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCh0aGlzKTtcbiAgICBwdWJsaWMgZXZlbnRzID0gbmV3IFBsYXllckV2ZW50c0VtaXR0ZXI8R3VpbGRRdWV1ZUV2ZW50cz4oWydlcnJvcicsICdwbGF5ZXJFcnJvciddKTtcbiAgICBwdWJsaWMgcm91dGVQbGFubmVyOiBJUFJvdGF0b3IgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IERpc2NvcmQgUGxheWVyXG4gICAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCBUaGUgRGlzY29yZCBDbGllbnRcbiAgICAgKiBAcGFyYW0ge1BsYXllckluaXRPcHRpb25zfSBbb3B0aW9uc10gVGhlIHBsYXllciBpbml0IG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IFBsYXllckluaXRPcHRpb25zID0ge30pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUluc3RhbmNlICYmIGtTaW5nbGV0b24gaW4gUGxheWVyKSByZXR1cm4gKDxhbnk+UGxheWVyKVtrU2luZ2xldG9uXSBhcyBQbGF5ZXI7XG5cbiAgICAgICAgc3VwZXIoWydlcnJvciddKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRpc2NvcmQuanMgY2xpZW50XG4gICAgICAgICAqIEB0eXBlIHtDbGllbnR9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcblxuICAgICAgICBjb25zdCBpYmYgPSB0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMgaW5zdGFuY2VvZiBJbnRlbnRzQml0RmllbGQgPyB0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMgOiBuZXcgSW50ZW50c0JpdEZpZWxkKHRoaXMuY2xpZW50Lm9wdGlvbnMuaW50ZW50cyk7XG5cbiAgICAgICAgaWYgKCFpYmYuaGFzKEludGVudHNCaXRGaWVsZC5GbGFncy5HdWlsZFZvaWNlU3RhdGVzKSkge1xuICAgICAgICAgICAgVXRpbC53YXJuKCdjbGllbnQgaXMgbWlzc2luZyBcIkd1aWxkVm9pY2VTdGF0ZXNcIiBpbnRlbnQnLCAnSW52YWxpZEludGVudHNCaXRGaWVsZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICAgICAgbG9ja1ZvaWNlU3RhdGVIYW5kbGVyOiBmYWxzZSxcbiAgICAgICAgICAgIGJsb2NrRXh0cmFjdG9yczogW10sXG4gICAgICAgICAgICBibG9ja1N0cmVhbUZyb206IFtdLFxuICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IDIwMDAwLFxuICAgICAgICAgICAgbGFnTW9uaXRvcjogMzAwMDAsXG4gICAgICAgICAgICBxdWVyeUNhY2hlOiBvcHRpb25zLnF1ZXJ5Q2FjaGUgPT09IG51bGwgPyBudWxsIDogb3B0aW9ucy5xdWVyeUNhY2hlIHx8IG5ldyBRdWVyeUNhY2hlKHRoaXMpLFxuICAgICAgICAgICAgdXNlTGVnYWN5RkZtcGVnOiBmYWxzZSxcbiAgICAgICAgICAgIHNraXBGRm1wZWc6IHRydWUsXG4gICAgICAgICAgICBwcm9iZVRpbWVvdXQ6IDUwMDAsXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgeXRkbE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBoaWdoV2F0ZXJNYXJrOiAxIDw8IDI1LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMueXRkbE9wdGlvbnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBQbGF5ZXJJbml0T3B0aW9ucztcblxuICAgICAgICB0aGlzLmNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIHRoaXMuI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lcik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMubGFnTW9uaXRvciA9PT0gJ251bWJlcicgJiYgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNsYWdNb25pdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNsYXN0TGF0ZW5jeSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbTGFnIE1vbml0b3JdIEV2ZW50IGxvb3AgbGF0ZW5jeTogJHt0aGlzLiNsYXN0TGF0ZW5jeX1tc2ApO1xuICAgICAgICAgICAgICAgIH0sIDApLnVucmVmKCk7XG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMubGFnTW9uaXRvcikudW5yZWYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaXBjb25maWcpIHtcbiAgICAgICAgICAgIHRoaXMucm91dGVQbGFubmVyID0gbmV3IElQUm90YXRvcih0aGlzLm9wdGlvbnMuaXBjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgX2ludGVybmFscy5hZGRQbGF5ZXIodGhpcyk7XG5cbiAgICAgICAgaWYgKCEoa1NpbmdsZXRvbiBpbiBQbGF5ZXIpKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUGxheWVyLCBrU2luZ2xldG9uLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBob29rcyBjb250ZXh0IGZvciB0aGlzIHBsYXllciBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbnRleHQoKSB7XG4gICAgICAgIGlmICghdGhpcy4jaG9va3NDdHgpIHtcbiAgICAgICAgICAgIHRoaXMuI2hvb2tzQ3R4ID0gY3JlYXRlQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuI2hvb2tzQ3R4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXJcbiAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBvblZvaWNlU3RhdGVVcGRhdGUoaGFuZGxlcjogVm9pY2VTdGF0ZUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy4jb25Wb2ljZVN0YXRlVXBkYXRlID0gaGFuZGxlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2RlYnVnJywgbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBkaXNjb3JkLXBsYXllciBzaW5nbGV0b24gaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIGNsaWVudCBUaGUgY2xpZW50IHRoYXQgaW5zdGFudGlhdGVkIHBsYXllclxuICAgICAqIEBwYXJhbSBvcHRpb25zIFBsYXllciBpbml0aWFsaXplciBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzaW5nbGV0b24oY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IE9taXQ8UGxheWVySW5pdE9wdGlvbnMsICdpZ25vcmVJbnN0YW5jZSc+ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQbGF5ZXIoY2xpZW50LCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgaWdub3JlSW5zdGFuY2U6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IGRpc2NvcmQtcGxheWVyIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBjbGllbnQgVGhlIGNsaWVudCB0aGF0IGluc3RhbnRpYXRlZCBwbGF5ZXJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBQbGF5ZXIgaW5pdGlhbGl6ZXIgb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBPbWl0PFBsYXllckluaXRPcHRpb25zLCAnaWdub3JlSW5zdGFuY2UnPiA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgUGxheWVyKGNsaWVudCwge1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIGlnbm9yZUluc3RhbmNlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgYWN0aXZlIG1hc3RlciBwbGF5ZXIgaW5zdGFuY2VzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbGxQbGF5ZXJzKCkge1xuICAgICAgICByZXR1cm4gX2ludGVybmFscy5nZXRQbGF5ZXJzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIG1hc3RlciBwbGF5ZXIgaW5zdGFuY2VzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjbGVhckFsbFBsYXllcnMoKSB7XG4gICAgICAgIHJldHVybiBfaW50ZXJuYWxzLmluc3RhbmNlcy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHF1ZXJ5IGNhY2hlIHByb3ZpZGVyIGluIHVzZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcXVlcnlDYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5xdWVyeUNhY2hlID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgdG8gYFBsYXllci5ub2Rlc2AuXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWV1ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGxvb3AgbGF0ZW5jeSBpbiBtcy4gSWYgeW91ciBib3QgaXMgbGFnZ3kgYW5kIHRoaXMgcmV0dXJucyBhIG51bWJlciBhYm92ZSAyMG1zIGZvciBleGFtcGxlLFxuICAgICAqIHNvbWUgZXhwZW5zaXZlIHRhc2sgaXMgYmVpbmcgZXhlY3V0ZWQgb24gdGhlIGN1cnJlbnQgdGhyZWFkIHdoaWNoIGlzIHNsb3dpbmcgZG93biB0aGUgZXZlbnQgbG9vcC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXZlbnRMb29wTGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbGFzdExhdGVuY3k7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHN0YXRpc3RpY3MgdGhhdCBjb3VsZCBiZSB1c2VmdWwuIFN0YXRpc3RpY3MgZ2VuZXJhdG9yIGlzIHN0aWxsIGV4cGVyaW1lbnRhbC5cbiAgICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc3RhdHMgPSBwbGF5ZXIuZ2VuZXJhdGVTdGF0aXN0aWNzKCk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhzdGF0cyk7XG4gICAgICpcbiAgICAgKiAvLyBvdXRwdXRzIHNvbWV0aGluZyBsaWtlXG4gICAgICogLy8ge1xuICAgICAqIC8vICAgaW5zdGFuY2VzOiBudW1iZXIsXG4gICAgICogLy8gICBxdWV1ZXNDb3VudDogbnVtYmVyLFxuICAgICAqIC8vICAgcXVlcnlDYWNoZUVuYWJsZWQ6IGJvb2xlYW4sXG4gICAgICogLy8gICBxdWV1ZXM6IFtcbiAgICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICAgKiAvLyAgICAgIC4uLlxuICAgICAqIC8vICAgXVxuICAgICAqIC8vIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2VuZXJhdGVTdGF0aXN0aWNzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5zdGFuY2VzOiBfaW50ZXJuYWxzLmluc3RhbmNlcy5zaXplLFxuICAgICAgICAgICAgcXVldWVzQ291bnQ6IHRoaXMucXVldWVzLmNhY2hlLnNpemUsXG4gICAgICAgICAgICBxdWVyeUNhY2hlRW5hYmxlZDogdGhpcy5xdWVyeUNhY2hlICE9IG51bGwsXG4gICAgICAgICAgICBxdWV1ZXM6IHRoaXMucXVldWVzLmNhY2hlLm1hcCgobSkgPT4gbS5zdGF0cy5nZW5lcmF0ZSgpKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgZXZlcnkgc2luZ2xlIHF1ZXVlcyBtYW5hZ2VkIGJ5IHRoaXMgbWFzdGVyIHBsYXllciBpbnN0YW5jZVxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyB1c2UgbWUgd2hlbiB5b3Ugd2FudCB0byBpbW1lZGlhdGVseSB0ZXJtaW5hdGUgZXZlcnkgc2luZ2xlIHF1ZXVlcyBpbiBleGlzdGVuY2UgXHVEODNEXHVERDJBXG4gICAgICogYXdhaXQgcGxheWVyLmRlc3Ryb3koKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5ub2Rlcy5jYWNoZS5mb3JFYWNoKChub2RlKSA9PiBub2RlLmRlbGV0ZSgpKTtcbiAgICAgICAgdGhpcy5jbGllbnQub2ZmKCd2b2ljZVN0YXRlVXBkYXRlJywgdGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5ldmVudHMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZXh0cmFjdG9ycy51bnJlZ2lzdGVyQWxsKCk7XG4gICAgICAgIGlmICh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvckludGVydmFsKTtcbiAgICAgICAgaWYgKHRoaXMuI2xhZ01vbml0b3JUaW1lb3V0KSBjbGVhckludGVydmFsKHRoaXMuI2xhZ01vbml0b3JUaW1lb3V0KTtcbiAgICAgICAgX2ludGVybmFscy5jbGVhclBsYXllcih0aGlzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkge1xuICAgICAgICBjb25zdCBxdWV1ZSA9IHRoaXMubm9kZXMuZ2V0KG9sZFN0YXRlLmd1aWxkLmlkKTtcbiAgICAgICAgaWYgKCFxdWV1ZSB8fCAhcXVldWUuY29ubmVjdGlvbiB8fCAhcXVldWUuY2hhbm5lbCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIGRpc3BhdGNoIHZvaWNlIHN0YXRlIHVwZGF0ZVxuICAgICAgICBjb25zdCB3YXNIYW5kbGVkID0gdGhpcy5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQudm9pY2VTdGF0ZVVwZGF0ZSwgcXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgICAgIC8vIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgcmV0dXJuIGFzc3VtaW5nIHRoZSBsaXN0ZW5lciBpbXBsZW1lbnRlZCBhbGwgb2YgdGhlIGxvZ2ljIGJlbG93XG4gICAgICAgIGlmICh3YXNIYW5kbGVkICYmICF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKSByZXR1cm47XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuI29uVm9pY2VTdGF0ZVVwZGF0ZSh0aGlzLCBxdWV1ZSwgb2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHZvaWNlIHN0YXRlIHVwZGF0ZVxuICAgICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBwYXNzaW5nIHZvaWNlIHN0YXRlIHVwZGF0ZSBkYXRhIHRvIHRoaXMgbWV0aG9kIHdpbGwgdHJpZ2dlciB2b2ljZSBzdGF0ZSBoYW5kbGVyXG4gICAgICpcbiAgICAgKiBjbGllbnQub24oJ3ZvaWNlU3RhdGVVcGRhdGUnLCAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICogICAvLyB0aGlzIGlzIGRlZmluaXRlbHkgYSByb2NrZXQgc2NpZW5jZSwgcmlnaHQgaGVyZVxuICAgICAqICAgcGxheWVyLmhhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvY2sgdm9pY2Ugc3RhdGUgaGFuZGxlci4gV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGRpc2NvcmQtcGxheWVyIHdpbGwga2VlcCB1c2luZyB0aGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciwgZXZlbiBpZiBjdXN0b20gaW1wbGVtZW50YXRpb24gZXhpc3RzLlxuICAgICAqL1xuICAgIHB1YmxpYyBsb2NrVm9pY2VTdGF0ZUhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVubG9jayB2b2ljZSBzdGF0ZSBoYW5kbGVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgd2lsbCBzdG9wIHVzaW5nIHRoZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBleGlzdHMuXG4gICAgICovXG4gICAgcHVibGljIHVubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHZvaWNlIHN0YXRlIGhhbmRsZXIgaXMgbG9ja2VkLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYXRlIGF1ZGlvIHBsYXllclxuICAgICAqIEBwYXJhbSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoZSBtdXNpYyBzaG91bGQgYmUgcGxheWVkXG4gICAgICogQHBhcmFtIHF1ZXJ5IFRoZSB0cmFjayBvciBzb3VyY2UgdG8gcGxheVxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHBsYXllclxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHF1ZXVlIG1hbmFnZW1lbnQsIGp1c3QgdXNlIHRoaXMgbWV0aG9kIFx1RDgzRFx1REUwNFxuICAgICAqIGNvbnN0IHF1ZXJ5ID0gJ3RoaXMgaXMgbXkgc3VwZXIgY29vbCBzZWFyY2ggcXVlcnkgdGhhdCBJIHdhbnQgdG8gcGxheSc7XG4gICAgICpcbiAgICAgKiB0cnkge1xuICAgICAqICAgIGNvbnN0IHsgdHJhY2sgfSA9IGF3YWl0IHBsYXllci5wbGF5KHZvaWNlQ2hhbm5lbCwgcXVlcnkpO1xuICAgICAqICAgY29uc29sZS5sb2coYFx1RDgzQ1x1REY4OSBJIGFtIHBsYXlpbmcgJHt0cmFjay50aXRsZX0gXHVEODNDXHVERjg5YCk7XG4gICAgICogfSBjYXRjaChlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgXHVEODNEXHVERTJEIEZhaWxlZCB0byBwbGF5IGVycm9yIG9oIG5vOlxcblxcbiR7ZX1gKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgcXVlcnk6IFRyYWNrTGlrZSwgb3B0aW9uczogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPiA9IHt9KTogUHJvbWlzZTxQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VD4+IHtcbiAgICAgICAgY29uc3QgdmMgPSB0aGlzLmNsaWVudC5jaGFubmVscy5yZXNvbHZlKGNoYW5uZWwpO1xuICAgICAgICBpZiAoIXZjPy5pc1ZvaWNlQmFzZWQoKSkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnY2hhbm5lbCcsICdWb2ljZUJhc2VkQ2hhbm5lbCcsICF2YyA/ICd1bmRlZmluZWQnIDogYGNoYW5uZWwgdHlwZSAke3ZjLnR5cGV9YCk7XG5cbiAgICAgICAgY29uc3Qgb3JpZ2luYWxSZXN1bHQgPSBxdWVyeSBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdCA/IHF1ZXJ5IDogYXdhaXQgdGhpcy5zZWFyY2gocXVlcnksIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgb3B0aW9ucy5hZnRlclNlYXJjaD8uKG9yaWdpbmFsUmVzdWx0KSkgfHwgb3JpZ2luYWxSZXN1bHQ7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoYE5vIHJlc3VsdHMgZm91bmQgZm9yIFwiJHtxdWVyeX1cIiAoRXh0cmFjdG9yOiAke3Jlc3VsdC5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVldWUgPSB0aGlzLm5vZGVzLmNyZWF0ZSh2Yy5ndWlsZCwgb3B0aW9ucy5ub2RlT3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBBY3F1aXJpbmcgYW4gZW50cnkuLi5gKTtcbiAgICAgICAgY29uc3QgZW50cnkgPSBxdWV1ZS50YXNrc1F1ZXVlLmFjcXVpcmUoeyBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0pO1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyBhY3F1aXJlZCBzdWNjZXNzZnVsbHkhYCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBXYWl0aW5nIGZvciB0aGUgcXVldWUgdG8gcmVzb2x2ZS4uLmApO1xuICAgICAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gRW50cnkgJHtlbnRyeS5pZH0gd2FzIHJlc29sdmVkIWApO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXF1ZXVlLmNoYW5uZWwpIGF3YWl0IHF1ZXVlLmNvbm5lY3QodmMsIG9wdGlvbnMuY29ubmVjdGlvbk9wdGlvbnMpO1xuXG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5wbGF5bGlzdCkge1xuICAgICAgICAgICAgICAgIHF1ZXVlLmFkZFRyYWNrKHJlc3VsdC50cmFja3NbMF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5hZGRUcmFjayhyZXN1bHQucGxheWxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFxdWV1ZS5pc1BsYXlpbmcoKSkgYXdhaXQgcXVldWUubm9kZS5wbGF5KG51bGwsIG9wdGlvbnMuYXVkaW9QbGF5ZXJPcHRpb25zKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gUmVsZWFzaW5nIGFuIGVudHJ5IGZyb20gdGhlIHF1ZXVlLi4uYCk7XG4gICAgICAgICAgICBxdWV1ZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0cmFjazogcmVzdWx0LnRyYWNrc1swXSxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogcmVzdWx0LmV4dHJhY3RvcixcbiAgICAgICAgICAgIHNlYXJjaFJlc3VsdDogcmVzdWx0LFxuICAgICAgICAgICAgcXVldWVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWFyY2ggdHJhY2tzXG4gICAgICogQHBhcmFtIHtzdHJpbmcgfCBUcmFjayB8IFRyYWNrW10gfCBQbGF5bGlzdCB8IFNlYXJjaFJlc3VsdH0gcXVlcnkgVGhlIHNlYXJjaCBxdWVyeVxuICAgICAqIEBwYXJhbSB7U2VhcmNoT3B0aW9uc30gb3B0aW9ucyBUaGUgc2VhcmNoIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZWFyY2hSZXN1bHQ+fVxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzZWFyY2hRdWVyeSA9ICdwYXNzIHVybCBvciB0ZXh0IG9yIGRpc2NvcmQtcGxheWVyIHRyYWNrIGNvbnN0cnVjdGFibGUgb2JqZWN0cywgd2UgZ290IHlvdSBjb3ZlcmVkIFx1RDgzRFx1REUwRSc7XG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgcGxheWVyLnNlYXJjaChzZWFyY2hRdWVyeSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvLyBMb2dzIGBTZWFyY2hSZXN1bHRgIG9iamVjdFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZWFyY2goc2VhcmNoUXVlcnk6IHN0cmluZyB8IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0IHwgU2VhcmNoUmVzdWx0LCBvcHRpb25zOiBTZWFyY2hPcHRpb25zID0ge30pOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgICAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQpIHJldHVybiBzZWFyY2hRdWVyeTtcblxuICAgICAgICBpZiAob3B0aW9ucy5yZXF1ZXN0ZWRCeSAhPSBudWxsKSBvcHRpb25zLnJlcXVlc3RlZEJ5ID0gdGhpcy5jbGllbnQudXNlcnMucmVzb2x2ZShvcHRpb25zLnJlcXVlc3RlZEJ5KSE7XG4gICAgICAgIG9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzID8/PSB0aGlzLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzO1xuICAgICAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICAgICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgVHJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBwbGF5bGlzdDogc2VhcmNoUXVlcnkucGxheWxpc3QgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICB0cmFja3M6IFtzZWFyY2hRdWVyeV0sXG4gICAgICAgICAgICAgICAgcXVlcnk6IHNlYXJjaFF1ZXJ5LnRpdGxlLFxuICAgICAgICAgICAgICAgIGV4dHJhY3Rvcjogc2VhcmNoUXVlcnkuZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZTogc2VhcmNoUXVlcnkucXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWFyY2hRdWVyeSBpbnN0YW5jZW9mIFBsYXlsaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IHNlYXJjaFF1ZXJ5LFxuICAgICAgICAgICAgICAgIHRyYWNrczogc2VhcmNoUXVlcnkudHJhY2tzLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiBzZWFyY2hRdWVyeS50aXRsZSxcbiAgICAgICAgICAgICAgICBleHRyYWN0b3I6IHNlYXJjaFF1ZXJ5LnRyYWNrc1swXT8uZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZTogUXVlcnlUeXBlLkFVVE8sXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VhcmNoUXVlcnkpKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFja3MgPSBzZWFyY2hRdWVyeS5maWx0ZXIoKHQpID0+IHQgaW5zdGFuY2VvZiBUcmFjayk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IG51bGwsXG4gICAgICAgICAgICAgICAgdHJhY2tzLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiAnQEAjJXt7VXNlckxvYWRlZENvbnRlbnR9fSUjQEAnLFxuICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogbnVsbCxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGU6IFF1ZXJ5VHlwZS5BVVRPLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBTZWFyY2hpbmcgJHtzZWFyY2hRdWVyeX1gKTtcblxuICAgICAgICBsZXQgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGwsXG4gICAgICAgICAgICBwcm90b2NvbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgb3B0aW9ucy5zZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPO1xuICAgICAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFNlYXJjaCBlbmdpbmUgc2V0IHRvICR7b3B0aW9ucy5zZWFyY2hFbmdpbmV9LCBmYWxsYmFjayBzZWFyY2ggZW5naW5lIHNldCB0byAke29wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmV9YCk7XG5cbiAgICAgICAgaWYgKC9eXFx3KzovLnRlc3Qoc2VhcmNoUXVlcnkpKSB7XG4gICAgICAgICAgICBjb25zdCBbcHJvdG9jb2xOYW1lLCAuLi5xdWVyeV0gPSBzZWFyY2hRdWVyeS5zcGxpdCgnOicpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFByb3RvY29sICR7cHJvdG9jb2xOYW1lfSBkZXRlY3RlZCBpbiBxdWVyeWApO1xuXG4gICAgICAgICAgICBjb25zdCBtYXRjaGluZ0V4dHJhY3RvciA9IHRoaXMuZXh0cmFjdG9ycy5zdG9yZS5maW5kKChlKSA9PiAhdGhpcy5leHRyYWN0b3JzLmlzRGlzYWJsZWQoZS5pZGVudGlmaWVyKSAmJiBlLnByb3RvY29scy5pbmNsdWRlcyhwcm90b2NvbE5hbWUpKTtcblxuICAgICAgICAgICAgaWYgKG1hdGNoaW5nRXh0cmFjdG9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFByb3RvY29sICR7cHJvdG9jb2xOYW1lfSBpcyBzdXBwb3J0ZWQgYnkgJHttYXRjaGluZ0V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IhYCk7XG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yID0gbWF0Y2hpbmdFeHRyYWN0b3I7XG4gICAgICAgICAgICAgICAgc2VhcmNoUXVlcnkgPSBxdWVyeS5qb2luKCc6Jyk7XG4gICAgICAgICAgICAgICAgcHJvdG9jb2wgPSBwcm90b2NvbE5hbWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDb3VsZCBub3QgZmluZCBhbiBleHRyYWN0b3IgdGhhdCBzdXBwb3J0cyAke3Byb3RvY29sTmFtZX0gcHJvdG9jb2wuIEZhbGxpbmcgYmFjayB0byBkZWZhdWx0IGJlaGF2aW9yLi4uYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWRpcmVjdGVkID0gYXdhaXQgUXVlcnlSZXNvbHZlci5wcmVSZXNvbHZlKHNlYXJjaFF1ZXJ5KTtcbiAgICAgICAgY29uc3QgeyB0eXBlOiBxdWVyeVR5cGUsIHF1ZXJ5IH0gPVxuICAgICAgICAgICAgb3B0aW9ucy5zZWFyY2hFbmdpbmUgPT09IFF1ZXJ5VHlwZS5BVVRPID8gUXVlcnlSZXNvbHZlci5yZXNvbHZlKHJlZGlyZWN0ZWQsIG9wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmUpIDogKHsgdHlwZTogb3B0aW9ucy5zZWFyY2hFbmdpbmUsIHF1ZXJ5OiByZWRpcmVjdGVkIH0gYXMgUmVzb2x2ZWRRdWVyeSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFF1ZXJ5IHR5cGUgaWRlbnRpZmllZCBhcyAke3F1ZXJ5VHlwZX0ke2V4dHJhY3RvciAmJiBwcm90b2NvbCA/ICcgYnV0IG1pZ2h0IG5vdCBiZSB1c2VkIGR1ZSB0byB0aGUgcHJlc2VuY2Ugb2YgcHJvdG9jb2wnIDogJyd9YCk7XG5cbiAgICAgICAgLy8gZm9yY2UgcGFydGljdWxhciBleHRyYWN0b3JcbiAgICAgICAgaWYgKG9wdGlvbnMuc2VhcmNoRW5naW5lLnN0YXJ0c1dpdGgoJ2V4dDonKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEZvcmNpbmcgJHtvcHRpb25zLnNlYXJjaEVuZ2luZS5zdWJzdHJpbmcoNCl9IGV4dHJhY3Rvci4uLmApO1xuICAgICAgICAgICAgZXh0cmFjdG9yID0gdGhpcy5leHRyYWN0b3JzLmdldChvcHRpb25zLnNlYXJjaEVuZ2luZS5zdWJzdHJpbmcoNCkpITtcbiAgICAgICAgICAgIGlmICghZXh0cmFjdG9yKVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcXVlcnkgYWxsIGV4dHJhY3RvcnNcbiAgICAgICAgaWYgKCFleHRyYWN0b3IpIHtcbiAgICAgICAgICAgIC8vIGNhY2hlIHZhbGlkYXRpb25cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDaGVja2luZyBjYWNoZS4uLmApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMucXVlcnlDYWNoZT8ucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gY2FjaGUgaGl0XG4gICAgICAgICAgICAgICAgaWYgKHJlcz8uaGFzVHJhY2tzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYENhY2hlIGhpdCBmb3IgcXVlcnkgJHtxdWVyeX1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgbWlzcyBmb3IgcXVlcnkgJHtxdWVyeX1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3JzLi4uYCk7XG5cbiAgICAgICAgICAgIC8vIGNhY2hlIG1pc3NcbiAgICAgICAgICAgIGV4dHJhY3RvciA9XG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2NrRXh0cmFjdG9ycz8uaW5jbHVkZXMoZXh0LmlkZW50aWZpZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXh0LnZhbGlkYXRlKHF1ZXJ5LCBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApPy5leHRyYWN0b3IgfHwgbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vIGV4dHJhY3RvcnMgYXZhaWxhYmxlXG4gICAgICAgIGlmICghZXh0cmFjdG9yKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRmFpbGVkIHRvIGZpbmQgYXBwcm9wcmlhdGUgZXh0cmFjdG9yJyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBFeGVjdXRpbmcgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yLi4uYCk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGV4dHJhY3RvclxuICAgICAgICAgICAgLmhhbmRsZShxdWVyeSwge1xuICAgICAgICAgICAgICAgIHR5cGU6IHF1ZXJ5VHlwZSBhcyBTZWFyY2hRdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnkgYXMgVXNlcixcbiAgICAgICAgICAgICAgICByZXF1ZXN0T3B0aW9uczogb3B0aW9ucy5yZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgICAgICBwcm90b2NvbFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKTtcblxuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnTWV0YWRhdGEgcXVlcnkgd2FzIHN1Y2Nlc3NmdWwhJyk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IHJlcy5wbGF5bGlzdCxcbiAgICAgICAgICAgICAgICB0cmFja3M6IHJlcy50cmFja3MsXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5xdWVyeUNhY2hlPy5hZGREYXRhKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRmFpbGVkIHRvIGZpbmQgcmVzdWx0IHVzaW5nIGFwcHJvcHJpYXRlIGV4dHJhY3Rvci4gUXVlcnlpbmcgYWxsIGV4dHJhY3RvcnMuLi4nKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leHRyYWN0b3JzLnJ1bihcbiAgICAgICAgICAgIGFzeW5jIChleHQpID0+XG4gICAgICAgICAgICAgICAgIW9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzPy5pbmNsdWRlcyhleHQuaWRlbnRpZmllcikgJiZcbiAgICAgICAgICAgICAgICAoYXdhaXQgZXh0LnZhbGlkYXRlKHF1ZXJ5KSkgJiZcbiAgICAgICAgICAgICAgICBleHQuaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHF1ZXJ5VHlwZSBhcyBTZWFyY2hRdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5IGFzIFVzZXIsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RPcHRpb25zOiBvcHRpb25zLnJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBwcm90b2NvbFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVzdWx0Py5yZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBGYWlsZWQgdG8gcXVlcnkgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtyZXN1bHQ/LmV4dHJhY3Rvci5pZGVudGlmaWVyIHx8ICdOL0EnfSBleHRyYWN0b3IuYCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5LFxuICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogcmVzdWx0Py5leHRyYWN0b3JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYE1ldGFkYXRhIHF1ZXJ5IHdhcyBzdWNjZXNzZnVsIHVzaW5nICR7cmVzdWx0LmV4dHJhY3Rvci5pZGVudGlmaWVyfSFgKTtcblxuICAgICAgICBjb25zdCBkYXRhID0gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHBsYXlsaXN0OiByZXN1bHQucmVzdWx0LnBsYXlsaXN0LFxuICAgICAgICAgICAgdHJhY2tzOiByZXN1bHQucmVzdWx0LnRyYWNrcyxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogcmVzdWx0LmV4dHJhY3RvcixcbiAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2FjaGU/LmFkZERhdGEoZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBgZGlzY29yZC12b2lwYCBtb2R1bGUuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zb2xlLmxvZyhwbGF5ZXIuc2NhbkRlcHMoKSk7XG4gICAgICogLy8gLT4gbG9ncyBkZXBlbmRlbmNpZXMgcmVwb3J0XG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBwdWJsaWMgc2NhbkRlcHMoKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSAnLScucmVwZWF0KDUwKTtcbiAgICAgICAgY29uc3QgcnVudGltZSA9ICdCdW4nIGluIGdsb2JhbFRoaXMgPyAnQnVuJyA6ICdEZW5vJyBpbiBnbG9iYWxUaGlzID8gJ0Rlbm8nIDogJ05vZGUnO1xuICAgICAgICBjb25zdCBkZXBzUmVwb3J0ID0gW1xuICAgICAgICAgICAgJ0Rpc2NvcmQgUGxheWVyJyxcbiAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICBgLSBkaXNjb3JkLXBsYXllcjogJHtQbGF5ZXIudmVyc2lvbn1gLFxuICAgICAgICAgICAgYC0gZGlzY29yZC12b2lwOiAke2RWb2ljZVZlcnNpb259YCxcbiAgICAgICAgICAgIGAtIGRpc2NvcmQuanM6ICR7ZGpzVmVyc2lvbn1gLFxuICAgICAgICAgICAgYC0gTm9kZSB2ZXJzaW9uOiAke3Byb2Nlc3MudmVyc2lvbn0gKERldGVjdGVkIFJ1bnRpbWU6ICR7cnVudGltZX0sIFBsYXRmb3JtOiAke3Byb2Nlc3MucGxhdGZvcm19IFske3Byb2Nlc3MuYXJjaH1dKWAsXG4gICAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudXNlTGVnYWN5RkZtcGVnKSByZXR1cm4gJy0gZmZtcGVnOiBOL0EgKHVzaW5nIGxlZ2FjeSBmZm1wZWcpJztcbiAgICAgICAgICAgICAgICBjb25zdCBpbmZvID0gRkZtcGVnLmxvY2F0ZVNhZmUoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWluZm8pIHJldHVybiAnRkZtcGVnL0F2Y29udiBub3QgZm91bmQnO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtgLSBmZm1wZWc6ICR7aW5mby52ZXJzaW9ufWAsIGAtIGNvbW1hbmQ6ICR7aW5mby5jb21tYW5kfWAsIGAtIHN0YXRpYzogJHtpbmZvLmlzU3RhdGljfWAsIGAtIGxpYm9wdXM6ICR7aW5mby5tZXRhZGF0YSEuaW5jbHVkZXMoJy0tZW5hYmxlLWxpYm9wdXMnKX1gXS5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgIH0pKCksXG4gICAgICAgICAgICAnXFxuJyxcbiAgICAgICAgICAgICdMb2FkZWQgRXh0cmFjdG9yczonLFxuICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgIHRoaXMuZXh0cmFjdG9ycy5zdG9yZVxuICAgICAgICAgICAgICAgIC5tYXAoKG0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0uaWRlbnRpZmllcjtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKSB8fCAnTi9BJyxcbiAgICAgICAgICAgICdcXG5cXG5kaXNjb3JkLXZvaXAnLFxuICAgICAgICAgICAgZ2VuZXJhdGVEZXBlbmRlbmN5UmVwb3J0KClcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gZGVwc1JlcG9ydC5qb2luKCdcXG4nKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICB5aWVsZCogdGhpcy5ub2Rlcy5jYWNoZS52YWx1ZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGBQbGF5bGlzdGAgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBpbml0aWFsaXplIGEgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlUGxheWxpc3QoZGF0YTogUGxheWxpc3RJbml0RGF0YSkge1xuICAgICAgICByZXR1cm4gbmV3IFBsYXlsaXN0KHRoaXMsIGRhdGEpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBDaGFubmVsVHlwZSwgVm9pY2VTdGF0ZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50IH0gZnJvbSAnLi9tYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4vUGxheWVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyKHBsYXllcjogUGxheWVyLCBxdWV1ZTogR3VpbGRRdWV1ZSwgb2xkU3RhdGU6IFZvaWNlU3RhdGUsIG5ld1N0YXRlOiBWb2ljZVN0YXRlKSB7XG4gICAgaWYgKCFxdWV1ZSB8fCAhcXVldWUuY29ubmVjdGlvbiB8fCAhcXVldWUuY2hhbm5lbCkgcmV0dXJuO1xuXG4gICAgaWYgKG9sZFN0YXRlLmNoYW5uZWxJZCAmJiAhbmV3U3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBxdWV1ZS5kZWxldGUoKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvKiBub29wICovXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZvaWQgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5kaXNjb25uZWN0LCBxdWV1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHF1ZXVlLm9wdGlvbnMucGF1c2VPbkVtcHR5KSB7XG4gICAgICAgIGNvbnN0IGlzRW1wdHkgPSBVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsKTtcblxuICAgICAgICBpZiAoaXNFbXB0eSkge1xuICAgICAgICAgICAgcXVldWUubm9kZS5zZXRQYXVzZWQodHJ1ZSk7XG4gICAgICAgICAgICBSZWZsZWN0LnNldChxdWV1ZSwgJ19fcGF1c2VkT25FbXB0eScsIHRydWUpO1xuICAgICAgICAgICAgaWYgKHF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICAgICAgICAgICAgcXVldWUuZGVidWcoJ1ZvaWNlIGNoYW5uZWwgaXMgZW1wdHkgYW5kIG9wdGlvbnMjcGF1c2VPbkVtcHR5IGlzIHRydWUsIHBhdXNpbmcuLi4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChSZWZsZWN0LmdldChxdWV1ZSwgJ19fcGF1c2VkT25FbXB0eScpKSB7XG4gICAgICAgICAgICAgICAgcXVldWUubm9kZS5zZXRQYXVzZWQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIFJlZmxlY3Quc2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JywgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZS5kZWJ1ZygnVm9pY2UgY2hhbm5lbCBpcyBub3QgZW1wdHkgYW5kIG9wdGlvbnMjcGF1c2VPbkVtcHR5IGlzIHRydWUsIHJlc3VtaW5nLi4uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFvbGRTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkKSB7XG4gICAgICAgIGlmIChuZXdTdGF0ZS5zZXJ2ZXJNdXRlICE9IG51bGwgJiYgb2xkU3RhdGUuc2VydmVyTXV0ZSAhPT0gbmV3U3RhdGUuc2VydmVyTXV0ZSkge1xuICAgICAgICAgICAgcXVldWUubm9kZS5zZXRQYXVzZWQobmV3U3RhdGUuc2VydmVyTXV0ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUuY2hhbm5lbD8udHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlICYmIG5ld1N0YXRlLnN1cHByZXNzICE9IG51bGwgJiYgb2xkU3RhdGUuc3VwcHJlc3MgIT09IG5ld1N0YXRlLnN1cHByZXNzKSB7XG4gICAgICAgICAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZChuZXdTdGF0ZS5zdXBwcmVzcyk7XG4gICAgICAgICAgICBpZiAobmV3U3RhdGUuc3VwcHJlc3MpIHtcbiAgICAgICAgICAgICAgICBuZXdTdGF0ZS5ndWlsZC5tZW1iZXJzLm1lPy52b2ljZS5zZXRSZXF1ZXN0VG9TcGVhayh0cnVlKS5jYXRjaChVdGlsLm5vb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFuZXdTdGF0ZS5jaGFubmVsSWQgJiYgb2xkU3RhdGUuY2hhbm5lbElkID09PSBxdWV1ZS5jaGFubmVsLmlkKSB7XG4gICAgICAgIGlmICghVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISkpIHJldHVybjtcbiAgICAgICAgICAgIGlmICghcGxheWVyLm5vZGVzLmhhcyhxdWV1ZS5ndWlsZC5pZCkpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eSkgcXVldWUuZGVsZXRlKCk7XG4gICAgICAgICAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVtcHR5Q2hhbm5lbCwgcXVldWUpO1xuICAgICAgICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gICAgICAgIHF1ZXVlLnRpbWVvdXRzLnNldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gLCB0aW1lb3V0KTtcbiAgICB9XG5cbiAgICBpZiAobmV3U3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLmNoYW5uZWxJZCA9PT0gcXVldWUuY2hhbm5lbC5pZCkge1xuICAgICAgICBjb25zdCBlbXB0eVRpbWVvdXQgPSBxdWV1ZS50aW1lb3V0cy5nZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgIGNvbnN0IGNoYW5uZWxFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpO1xuICAgICAgICBpZiAoIWNoYW5uZWxFbXB0eSAmJiBlbXB0eVRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChlbXB0eVRpbWVvdXQpO1xuICAgICAgICAgICAgcXVldWUudGltZW91dHMuZGVsZXRlKGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5jaGFubmVsUG9wdWxhdGUsIHF1ZXVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvbGRTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUuY2hhbm5lbElkICYmIG9sZFN0YXRlLmNoYW5uZWxJZCAhPT0gbmV3U3RhdGUuY2hhbm5lbElkKSB7XG4gICAgICAgIGlmIChuZXdTdGF0ZS5tZW1iZXI/LmlkID09PSBuZXdTdGF0ZS5ndWlsZC5tZW1iZXJzLm1lPy5pZCkge1xuICAgICAgICAgICAgaWYgKHF1ZXVlLmNvbm5lY3Rpb24gJiYgbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHF1ZXVlLmNoYW5uZWwgPSBuZXdTdGF0ZS5jaGFubmVsITtcbiAgICAgICAgICAgIGNvbnN0IGVtcHR5VGltZW91dCA9IHF1ZXVlLnRpbWVvdXRzLmdldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKTtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpO1xuICAgICAgICAgICAgaWYgKCFjaGFubmVsRW1wdHkgJiYgZW1wdHlUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVtcHR5VGltZW91dCk7XG4gICAgICAgICAgICAgICAgcXVldWUudGltZW91dHMuZGVsZXRlKGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuY2hhbm5lbFBvcHVsYXRlLCBxdWV1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmNvbm5lY3Rpb24gJiYgIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXllci5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eSkgcXVldWUuZGVsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZW1wdHlDaGFubmVsLCBxdWV1ZSk7XG4gICAgICAgICAgICAgICAgfSwgcXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93biB8fCAwKS51bnJlZigpO1xuICAgICAgICAgICAgICAgIHF1ZXVlLnRpbWVvdXRzLnNldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5jaGFubmVsSWQgIT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFubmVsRW1wdHkgPSBVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISk7XG4gICAgICAgICAgICAgICAgaWYgKCFjaGFubmVsRW1wdHkpIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAocXVldWUudGltZW91dHMuaGFzKGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApKSByZXR1cm47XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXllci5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eSkgcXVldWUuZGVsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZW1wdHlDaGFubmVsLCBxdWV1ZSk7XG4gICAgICAgICAgICAgICAgfSwgcXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93biB8fCAwKS51bnJlZigpO1xuICAgICAgICAgICAgICAgIHF1ZXVlLnRpbWVvdXRzLnNldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW1wdHlUaW1lb3V0ID0gcXVldWUudGltZW91dHMuZ2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5uZWxFbXB0eSAmJiBlbXB0eVRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVtcHR5VGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLnRpbWVvdXRzLmRlbGV0ZShgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5jaGFubmVsUG9wdWxhdGUsIHF1ZXVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IGlwIGZyb20gJ2lwJztcblxuZXhwb3J0IGNsYXNzIElQQmxvY2sge1xuICAgIHB1YmxpYyB1c2FnZSA9IDA7XG4gICAgcHVibGljIHJlYWRvbmx5IGNpZHI6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2lkclNpemU6IG51bWJlcjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYmxvY2s6IHN0cmluZykge1xuICAgICAgICBpZiAoaXAuaXNWNEZvcm1hdChibG9jay5zcGxpdCgnLycpWzBdKSAmJiAhYmxvY2suaW5jbHVkZXMoJy8nKSkge1xuICAgICAgICAgICAgYmxvY2sgKz0gJy8zMic7XG4gICAgICAgIH0gZWxzZSBpZiAoaXAuaXNWNkZvcm1hdChibG9jay5zcGxpdCgnLycpWzBdKSAmJiAhYmxvY2suaW5jbHVkZXMoJy8nKSkge1xuICAgICAgICAgICAgYmxvY2sgKz0gJy8xMjgnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaWRyID0gaXAuY2lkcih0aGlzLmJsb2NrKTtcbiAgICAgICAgdGhpcy5jaWRyU2l6ZSA9IGlwLmNpZHJTdWJuZXQodGhpcy5ibG9jaykuc3VibmV0TWFza0xlbmd0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29uc3VtZSgpIHtcbiAgICAgICAgdGhpcy51c2FnZSsrO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUFJvdGF0aW9uQ29uZmlnIHtcbiAgICAvKipcbiAgICAgKiBJUCBibG9ja3MgdG8gdXNlXG4gICAgICovXG4gICAgYmxvY2tzOiBzdHJpbmdbXTtcbiAgICAvKipcbiAgICAgKiBJUHMgdG8gZXhjbHVkZVxuICAgICAqL1xuICAgIGV4Y2x1ZGU/OiBzdHJpbmdbXTtcbiAgICAvKipcbiAgICAgKiBNYXggcmV0cmllcyB0byBmaW5kIGFuIElQIHRoYXQgaXMgbm90IGV4Y2x1ZGVkXG4gICAgICovXG4gICAgbWF4UmV0cmllcz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIElQUm90YXRvciB7XG4gICAgcHVibGljIGJsb2NrczogSVBCbG9ja1tdID0gW107XG4gICAgcHVibGljIGZhaWx1cmVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBwdWJsaWMgTUFYX05FWFRfUkVUUklFUyA9IDMwO1xuICAgICNyZXRyaWVzID0gMDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgY29uZmlnOiBJUFJvdGF0aW9uQ29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5leGNsdWRlID8/PSBbXTtcbiAgICAgICAgdGhpcy5ibG9ja3MgPSBjb25maWcuYmxvY2tzLm1hcCgoYmxvY2spID0+IG5ldyBJUEJsb2NrKGJsb2NrKSk7XG4gICAgICAgIHRoaXMuTUFYX05FWFRfUkVUUklFUyA9IGNvbmZpZy5tYXhSZXRyaWVzID8/IDEwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJUCgpOiB7IGlwOiBzdHJpbmc7IGZhbWlseTogNCB8IDYgfSB7XG4gICAgICAgIGNvbnN0IGJsb2NrID0gdGhpcy5ibG9ja3Muc29ydCgoYSwgYikgPT4gYS51c2FnZSAtIGIudXNhZ2UpWzBdO1xuICAgICAgICBpZiAoIWJsb2NrKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIElQIGJsb2NrcyBhdmFpbGFibGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJhbmRvbSA9IElQUm90YXRvci5nZXRSYW5kb21JUChibG9jay5jaWRyLCBibG9jay5jaWRyU2l6ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNGYWlsZWRPckV4Y2x1ZGVkKHJhbmRvbSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNyZXRyaWVzKysgPiB0aGlzLk1BWF9ORVhUX1JFVFJJRVMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNyZXRyaWVzID0gMDtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIGFuIElQIHRoYXQgaXMgbm90IGV4Y2x1ZGVkJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldElQKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLiNyZXRyaWVzID0gMDtcbiAgICAgICAgYmxvY2suY29uc3VtZSgpO1xuICAgICAgICByZXR1cm4geyBpcDogcmFuZG9tLCBmYW1pbHk6IGlwLmlzVjRGb3JtYXQocmFuZG9tKSA/IDQgOiA2IH07XG4gICAgfVxuXG4gICAgcHVibGljIGlzRmFpbGVkT3JFeGNsdWRlZChpcDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZhaWx1cmVzLmhhcyhpcCkgfHwgISF0aGlzLmNvbmZpZy5leGNsdWRlPy5pbmNsdWRlcyhpcCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZhaWxlZChpcDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGxhc3RGYWlsZWRDb3VudCA9IHRoaXMuZmFpbHVyZXMuZ2V0KGlwKSA/PyAwO1xuXG4gICAgICAgIHRoaXMuZmFpbHVyZXMuc2V0KGlwLCBsYXN0RmFpbGVkQ291bnQgKyAxKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFJhbmRvbUlQKGFkZHJlc3M6IHN0cmluZywgc3RhcnQ/OiBudW1iZXIsIGVuZD86IG51bWJlcikge1xuICAgICAgICAvLyBBdXRob3I6IEplc3NlIFRhbmUgPGplc3NlLnRhbmVAZ21haWwuY29tPlxuICAgICAgICAvLyBOUE1KUzogaHR0cHM6Ly9ucG1qcy5vcmcvcmFuZG9tLWlwXG5cbiAgICAgICAgY29uc3QgYnl0ZXMgPSBpcC50b0J1ZmZlcihhZGRyZXNzKTtcbiAgICAgICAgY29uc3QgaXB2NiA9IGJ5dGVzLmxlbmd0aCA9PT0gMTY7XG4gICAgICAgIGNvbnN0IGJ5dGVzaXplID0gODtcblxuICAgICAgICBzdGFydCA9IHN0YXJ0IHx8IDA7XG4gICAgICAgIGVuZCA9IHR5cGVvZiBlbmQgIT09ICd1bmRlZmluZWQnID8gZW5kIDogYnl0ZXMubGVuZ3RoICogYnl0ZXNpemU7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGJpdCA9IGkgKiBieXRlc2l6ZTtcblxuICAgICAgICAgICAgaWYgKGJpdCArIGJ5dGVzaXplIDwgc3RhcnQgfHwgYml0ID49IGVuZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgYiA9IGJ5dGVzW2ldO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGJ5dGVzaXplOyBuKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoYml0ID49IHN0YXJ0ICYmIGJpdCA8IGVuZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiaXRwb3MgPSBieXRlc2l6ZSAtIG4gLSAxO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiaXRtYXNrID0gMSA8PCBiaXRwb3M7XG4gICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLnJhbmRvbSgpIDwgMC41KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiIHw9IGJpdG1hc2s7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiICY9IH5iaXRtYXNrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJpdCsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBieXRlc1tpXSA9IGI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ZXRzID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGlwdjYpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSAlIDIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGV0c1tpID4+IDFdID0gKChieXRlc1tpXSA8PCBieXRlc2l6ZSkgfCBieXRlc1tpICsgMV0pLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRldHNbaV0gPSBieXRlc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0ZXRzLmpvaW4oaXB2NiA/ICc6JyA6ICcuJyk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEFzeW5jTG9jYWxTdG9yYWdlIH0gZnJvbSAnbm9kZTphc3luY19ob29rcyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG50eXBlIHVuc2FmZSA9IGFueTtcblxuLyoqXG4gKiBUaGUgcmVjZWl2ZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBjb250ZXh0IGlzIHByb3ZpZGVkXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHRSZWNlaXZlcjxSPiA9ICgpID0+IFI7XG5cbmV4cG9ydCBjbGFzcyBDb250ZXh0PFQ+IHtcbiAgICBwcml2YXRlIHN0b3JhZ2UgPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8VD4oKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGRlZmF1bHRWYWx1ZT86IFQpIHt9XG5cbiAgICAvKipcbiAgICAgKiBFeGl0IG91dCBvZiB0aGlzIGNvbnRleHRcbiAgICAgKi9cbiAgICBwdWJsaWMgZXhpdChzY29wZTogQ29udGV4dFJlY2VpdmVyPHZvaWQ+KSB7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5leGl0KHNjb3BlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBjb250ZXh0IGlzIGxvc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzTG9zdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXRTdG9yZSgpID09PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBsb3N0IGFuZCBubyBkZWZhdWx0IHZhbHVlIGlzIHByb3ZpZGVkLCB1bmRlZmluZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3VtZSgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc3RvcmFnZS5nZXRTdG9yZSgpO1xuXG4gICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQgJiYgdGhpcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlO1xuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1biBhIGZ1bmN0aW9uIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGlzIHByb3ZpZGVyXG4gICAgICovXG4gICAgcHVibGljIHByb3ZpZGU8UiA9IHVuc2FmZT4odmFsdWU6IFQsIHJlY2VpdmVyOiBDb250ZXh0UmVjZWl2ZXI8Uj4pOiBSIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29udGV4dCB2YWx1ZSBtYXkgbm90IGJlIHVuZGVmaW5lZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZWNlaXZlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IHJlY2VpdmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5ydW4odmFsdWUsIHJlY2VpdmVyKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGNvbnRleHQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG9wdGlvbmFsLlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29udGV4dFxuICogQGV4YW1wbGUgY29uc3QgdXNlckNvbnRleHQgPSBjcmVhdGVDb250ZXh0KCk7XG4gKlxuICogIC8vIHRoZSB2YWx1ZSB0byBwcm92aWRlXG4gKiAgY29uc3QgdXNlciA9IHtcbiAqICAgaWQ6IDEsXG4gKiAgIG5hbWU6ICdKb2huIERvZSdcbiAqICB9O1xuICpcbiAqICAvLyBwcm92aWRlIHRoZSBjb250ZXh0IHZhbHVlIHRvIHRoZSByZWNlaXZlclxuICogIGNvbnRleHQucHJvdmlkZSh1c2VyLCBoYW5kbGVyKTtcbiAqXG4gKiAgZnVuY3Rpb24gaGFuZGxlcigpIHtcbiAqICAgIC8vIGdldCB0aGUgY29udGV4dCB2YWx1ZVxuICogICAgY29uc3QgeyBpZCwgbmFtZSB9ID0gdXNlQ29udGV4dChjb250ZXh0KTtcbiAqXG4gKiAgICBjb25zb2xlLmxvZyhpZCwgbmFtZSk7IC8vIDEsIEpvaG4gRG9lXG4gKiAgfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29udGV4dDxUID0gdW5zYWZlPihkZWZhdWx0VmFsdWU/OiBUKTogQ29udGV4dDxUPiB7XG4gICAgcmV0dXJuIG5ldyBDb250ZXh0KGRlZmF1bHRWYWx1ZSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBsb3N0IGFuZCBubyBkZWZhdWx0IHZhbHVlIGlzIHByb3ZpZGVkLCB1bmRlZmluZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGdldCB0aGUgdmFsdWUgZnJvbVxuICogQGV4YW1wbGUgY29uc3QgdmFsdWUgPSB1c2VDb250ZXh0KGNvbnRleHQpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29udGV4dDxUID0gdW5zYWZlPihjb250ZXh0OiBDb250ZXh0PFQ+KTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGNvbnRleHQuY29uc3VtZSgpO1xufVxuIiwgImltcG9ydCB7IEd1aWxkIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgaW5zdGFuY2VzIH0gZnJvbSAnLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJy4vY29udGV4dC9hc3luYy1jb250ZXh0JztcblxuY29uc3QgcHJlZmVycmVkSW5zdGFuY2VLZXkgPSAnX19kaXNjb3JkX3BsYXllcl9ob29rX2luc3RhbmNlX2NhY2hlX18nO1xuXG5leHBvcnQgY29uc3QgZ2V0UGxheWVyID0gKCkgPT4ge1xuICAgIHJldHVybiBpbnN0YW5jZXMuZ2V0KHByZWZlcnJlZEluc3RhbmNlS2V5KSB8fCBpbnN0YW5jZXMuZmlyc3QoKSB8fCBudWxsO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBIb29rc0N0eCB7XG4gICAgZ3VpbGQ6IEd1aWxkO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VIb29rc0NvbnRleHQoaG9va05hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHBsYXllciA9IGdldFBsYXllcigpO1xuICAgIGlmICghcGxheWVyKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTignZGlzY29yZC1wbGF5ZXInLCAnUGxheWVyIGluc3RhbmNlIG11c3QgYmUgY3JlYXRlZCBiZWZvcmUgdXNpbmcgaG9va3MnKTtcblxuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KHBsYXllci5jb250ZXh0KTtcblxuICAgIGlmICghY29udGV4dCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSUxMRUdBTF9IT09LX0lOVk9DQVRJT04oaG9va05hbWUsIGAke2hvb2tOYW1lfSBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgYSBwbGF5ZXIgY29udGV4dCBjcmVhdGVkIGJ5IDxQbGF5ZXI+LmNvbnRleHQucHJvdmlkZSgpYCk7XG5cbiAgICByZXR1cm4gY29udGV4dDtcbn1cblxuLyoqXG4gKiBCaW5kIGEgcGxheWVyIGluc3RhbmNlIHRvIHRoZSBob29rIHN5c3RlbSwgZGVmYXVsdHMgdG8gdGhlIGZpcnN0IGluc3RhbmNlLlxuICovXG5leHBvcnQgY29uc3QgYmluZEhvb2sgPSAocGxheWVyOiBQbGF5ZXIpID0+IHtcbiAgICBpbnN0YW5jZXMuc2V0KHByZWZlcnJlZEluc3RhbmNlS2V5LCBwbGF5ZXIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFF1ZXVlID0gPFQgPSB1bmtub3duPihub2RlOiBOb2RlUmVzb2x2YWJsZSkgPT4ge1xuICAgIGNvbnN0IHBsYXllciA9IGdldFBsYXllcigpO1xuICAgIGlmICghcGxheWVyKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiAocGxheWVyLm5vZGVzLnJlc29sdmUobm9kZSkgYXMgR3VpbGRRdWV1ZTxUPikgfHwgbnVsbDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG9va0RlY2xhcmF0aW9uQ29udGV4dCB7XG4gICAgZ2V0UXVldWU6IHR5cGVvZiBnZXRRdWV1ZTtcbiAgICBnZXRQbGF5ZXI6IHR5cGVvZiBnZXRQbGF5ZXI7XG4gICAgaW5zdGFuY2VzOiB0eXBlb2YgaW5zdGFuY2VzO1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5leHBvcnQgdHlwZSBIb29rRGVjbGFyYXRpb248VCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55PiA9IChjb250ZXh0OiBIb29rRGVjbGFyYXRpb25Db250ZXh0KSA9PiBUO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSG9vazxUIGV4dGVuZHMgSG9va0RlY2xhcmF0aW9uPCguLi5hcmdzOiBhbnlbXSkgPT4gYW55Pj4oaG9vazogVCk6IFJldHVyblR5cGU8VD4ge1xuICAgIHJldHVybiBob29rKHtcbiAgICAgICAgZ2V0UXVldWUsXG4gICAgICAgIGdldFBsYXllcixcbiAgICAgICAgaW5zdGFuY2VzXG4gICAgfSkgYXMgUmV0dXJuVHlwZTxUPjtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZUhpc3RvcnksIE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRRdWV1ZSwgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIGd1aWxkIHF1ZXVlIGhpc3RvcnlcbiAqIEBwYXJhbSBub2RlIGd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSGlzdG9yeTxNZXRhID0gdW5rbm93bj4oKTogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+KG5vZGU/OiBOb2RlUmVzb2x2YWJsZSk6IEd1aWxkUXVldWVIaXN0b3J5PE1ldGE+IHwgbnVsbCB7XG4gICAgY29uc3QgX25vZGUgPSBub2RlID8/IHVzZUhvb2tzQ29udGV4dCgndXNlSGlzdG9yeScpLmd1aWxkO1xuXG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxNZXRhPihfbm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gcXVldWUuaGlzdG9yeTtcbn1cbiIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlUGxheWVyTm9kZSwgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IGdldFF1ZXVlLCB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWUgcGxheWVyIG5vZGVcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUGxheWVyPE1ldGEgPSB1bmtub3duPigpOiBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlUGxheWVyPE1ldGEgPSB1bmtub3duPihub2RlOiBOb2RlUmVzb2x2YWJsZSk6IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KG5vZGU/OiBOb2RlUmVzb2x2YWJsZSk6IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbCB7XG4gICAgY29uc3QgX25vZGUgPSBub2RlID8/IHVzZUhvb2tzQ29udGV4dCgndXNlUGxheWVyJykuZ3VpbGQ7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxNZXRhPihfbm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gcXVldWUubm9kZTtcbn1cbiIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0UXVldWUsIHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWV1ZTxNZXRhID0gdW5rbm93bj4oKTogR3VpbGRRdWV1ZTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogR3VpbGRRdWV1ZTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KG5vZGU/OiBOb2RlUmVzb2x2YWJsZSk6IEd1aWxkUXVldWU8TWV0YT4gfCBudWxsIHtcbiAgICBjb25zdCBfbm9kZSA9IG5vZGUgPz8gdXNlSG9va3NDb250ZXh0KCd1c2VRdWV1ZScpLmd1aWxkO1xuICAgIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWU8TWV0YT4oX25vZGUpO1xuICAgIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHF1ZXVlO1xufVxuIiwgImltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgZ2V0UGxheWVyIH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIG1haW4gcGxheWVyIGluc3RhbmNlXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTWFzdGVyUGxheWVyKCkge1xuICAgIFV0aWwud2FybigndXNlTWFzdGVyUGxheWVyKCkgaG9vayBpcyBkZXByZWNhdGVkLCB1c2UgdXNlTWFpblBsYXllcigpIGluc3RlYWQuJywgJ0RlcHJlY2F0aW9uV2FybmluZycpO1xuICAgIHJldHVybiB1c2VNYWluUGxheWVyKCk7XG59XG5cbi8qKlxuICogRmV0Y2ggbWFpbiBwbGF5ZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1haW5QbGF5ZXIoKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRQbGF5ZXIoKTtcbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lMTEVHQUxfSE9PS19JTlZPQ0FUSU9OKCd1c2VNYWluUGxheWVyJywgJ1RoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSBjYWxsaW5nIFwidXNlTWFpblBsYXllclwiIGhvb2sgYmVmb3JlIGNyZWF0aW5nIGEgcGxheWVyIGluc3RhbmNlLicpO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZTtcbn1cbiIsICJpbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRRdWV1ZSwgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgdHlwZSBTZXR0ZXJGTjxULCBQPiA9IChwcmV2aW91czogUCkgPT4gVDtcbmV4cG9ydCB0eXBlIE1ldGFkYXRhRGlzcGF0Y2g8VD4gPSByZWFkb25seSBbKCkgPT4gVCwgKG1ldGFkYXRhOiBUIHwgU2V0dGVyRk48VCwgVD4pID0+IHZvaWRdO1xuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgZ3VpbGQgcXVldWUgbWV0YWRhdGFcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KCk6IE1ldGFkYXRhRGlzcGF0Y2g8VD47XG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogTWV0YWRhdGFEaXNwYXRjaDxUPjtcbmV4cG9ydCBmdW5jdGlvbiB1c2VNZXRhZGF0YTxUID0gdW5rbm93bj4obm9kZT86IE5vZGVSZXNvbHZhYmxlKTogTWV0YWRhdGFEaXNwYXRjaDxUPiB7XG4gICAgY29uc3QgX25vZGUgPSBub2RlID8/IHVzZUhvb2tzQ29udGV4dCgndXNlTWV0YWRhdGEnKS5ndWlsZDtcbiAgICBjb25zdCBxdWV1ZSA9IGdldFF1ZXVlPFQ+KF9ub2RlKTtcbiAgICBjb25zdCBzZXR0ZXIgPSAobWV0YWRhdGE6IFQgfCBTZXR0ZXJGTjxULCBUPikgPT4ge1xuICAgICAgICBpZiAocXVldWUpIHtcbiAgICAgICAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG1ldGFkYXRhKSkgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKHF1ZXVlLm1ldGFkYXRhKSk7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUuc2V0TWV0YWRhdGEobWV0YWRhdGEpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGdldHRlciA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHF1ZXVlPy5tZXRhZGF0YSBhcyBUO1xuICAgIH07XG5cbiAgICByZXR1cm4gW2dldHRlciwgc2V0dGVyXSBhcyBjb25zdDtcbn1cbiIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0UXVldWUsIHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zIHtcbiAgICBpZ25vcmVGaWx0ZXJzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgY3VycmVudCB0cmFja1xuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aW1lbGluZSBkaXNwYXRjaGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lbGluZShub2RlPzogTm9kZVJlc29sdmFibGUsIG9wdGlvbnM/OiBQYXJ0aWFsPFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnM+KSB7XG4gICAgY29uc3QgX25vZGUgPSBub2RlID8/IHVzZUhvb2tzQ29udGV4dCgndXNlVGltZWxpbmUnKS5ndWlsZDtcbiAgICBjb25zdCBxdWV1ZSA9IGdldFF1ZXVlKF9ub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe1xuICAgICAgICBnZXQgdGltZXN0YW1wKCkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuZ2V0VGltZXN0YW1wKG9wdGlvbnM/Lmlnbm9yZUZpbHRlcnMpITtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnZvbHVtZTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHBhdXNlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLmlzUGF1c2VkKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCB0cmFjaygpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5jdXJyZW50VHJhY2s7XG4gICAgICAgIH0sXG4gICAgICAgIHBhdXNlKCkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUucGF1c2UoKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzdW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUucmVzdW1lKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldFZvbHVtZSh2b2w6IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2V0Vm9sdW1lKHZvbCk7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIHNldFBvc2l0aW9uKHRpbWU6IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2Vlayh0aW1lKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwgImltcG9ydCB7IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyIH0gZnJvbSAnLi4vLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbi8qKlxuICogR2xvYmFsIG9uQWZ0ZXJDcmVhdGVTdHJlYW0gaGFuZGxlclxuICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQWZ0ZXJDcmVhdGVTdHJlYW0oaGFuZGxlcjogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIpIHtcbiAgICBnZXRHbG9iYWxSZWdpc3RyeSgpLnNldCgnQFtvbkFmdGVyQ3JlYXRlU3RyZWFtXScsIGhhbmRsZXIpO1xufVxuIiwgImltcG9ydCB7IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4uLy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi8uLi91dGlscy9fX2ludGVybmFsX18nO1xuXG4vKipcbiAqIEdsb2JhbCBvbkJlZm9yZUNyZWF0ZVN0cmVhbSBoYW5kbGVyXG4gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25CZWZvcmVDcmVhdGVTdHJlYW0oaGFuZGxlcjogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyKSB7XG4gICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0Bbb25CZWZvcmVDcmVhdGVTdHJlYW1dJywgaGFuZGxlcik7XG59XG4iLCAiaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0UXVldWUsIHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxudHlwZSBTZXR0ZXJGTiA9IChwcmV2aW91czogbnVtYmVyKSA9PiBudW1iZXI7XG50eXBlIFZvbHVtZURpc3BhdGNoID0gcmVhZG9ubHkgWygpID0+IG51bWJlciwgKHZvbHVtZTogbnVtYmVyIHwgU2V0dGVyRk4pID0+IGJvb2xlYW4gfCB1bmRlZmluZWRdO1xuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgcGxheWVyIHZvbHVtZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VWb2x1bWUoKTogVm9sdW1lRGlzcGF0Y2g7XG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogVm9sdW1lRGlzcGF0Y2g7XG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKG5vZGU/OiBOb2RlUmVzb2x2YWJsZSk6IFZvbHVtZURpc3BhdGNoIHtcbiAgICBjb25zdCBfbm9kZSA9IG5vZGUgPz8gdXNlSG9va3NDb250ZXh0KCd1c2VWb2x1bWUnKS5ndWlsZDtcbiAgICBjb25zdCBxdWV1ZSA9IGdldFF1ZXVlKF9ub2RlKTtcbiAgICBjb25zdCBzZXR0ZXIgPSAodm9sdW1lOiBudW1iZXIgfCBTZXR0ZXJGTikgPT4ge1xuICAgICAgICBpZiAocXVldWUpIHtcbiAgICAgICAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKHZvbHVtZSkpIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2x1bWUocXVldWUubm9kZS52b2x1bWUpKTtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2x1bWUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGdldHRlciA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHF1ZXVlPy5ub2RlLnZvbHVtZSBhcyBudW1iZXI7XG4gICAgfTtcblxuICAgIHJldHVybiBbZ2V0dGVyLCBzZXR0ZXJdIGFzIGNvbnN0O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQUFBQTtBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsa0JBQXNDOzs7QUNFdEMsbUJBQTZCOzs7QUNBN0Isc0JBQTJCOzs7QUNGM0IscUJBQTBGOzs7QUNBbkYsSUFBTSxZQUFOLE1BQU0sVUFBUztBQUFBLEVBQ1YsY0FBYztBQUNsQixXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUEsRUFHQSxPQUFjLFdBQVcsR0FBMkI7QUFDaEQsV0FBTyxPQUFPLE1BQU07QUFBQSxFQUN4QjtBQUFBLEVBRUEsT0FBYyxTQUFTLEdBQXlCO0FBQzVDLFdBQU8sT0FBTyxNQUFNLFlB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LE9BQU8sb0NBQW9DO0FBQ3JJOyIsCiAgIm5hbWVzIjogWyJHdWlsZFF1ZXVlIiwgImltcG9ydF9kaXNjb3JkIiwgInRhcmdldCIsICJTZXJpYWxpemVkVHlwZSIsICJQbGF5ZXJFdmVudCIsICJRdWV1ZVJlcGVhdE1vZGUiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfc3RyZWFtIiwgInRhcmdldCIsICJxdWVyeSIsICJpbXBvcnRfcHJvbWlzZXMiLCAiaW1wb3J0X2Rpc2NvcmQiLCAicHJpc20iLCAid2FpdEZvciIsICJvcHVzIiwgImltcG9ydF9lcXVhbGl6ZXIiLCAicHJpc20iLCAiVHJhY2tTa2lwUmVhc29uIiwgInRhcmdldCIsICJHdWlsZFF1ZXVlIiwgImltcG9ydF91dGlscyIsICJHdWlsZFF1ZXVlIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9mZm1wZWciLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfZGlzY29yZCIsICJpcCIsICJoYW5kbGVyIiwgImhhbmRsZXIiLCAiaGFuZGxlciIsICJxdWVyeSIsICJyZXMiLCAicmVzdWx0IiwgImRWb2ljZVZlcnNpb24iLCAiZGpzVmVyc2lvbiIsICJpbXBvcnRfZXF1YWxpemVyIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiZGpzVmVyc2lvbiJdCn0K