@ditojs/server 0.274.0 → 0.275.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -659,7 +659,7 @@ class Application extends _koa.default {
659
659
 
660
660
  this.knex = (0, _knex2.default)(knex);
661
661
 
662
- if (knex.client === 'postgresql' && knex.typeParsers) {
662
+ if (knex.client === 'postgresql' && knex.typeParsers && this.knex.client.driver) {
663
663
  for (const [type, parser] of Object.entries(knex.typeParsers)) {
664
664
  this.knex.client.driver.types.setTypeParser(type, parser);
665
665
  }
@@ -958,4 +958,4 @@ _lib.EventEmitter.mixin(Application.prototype);
958
958
  function getOptions(options) {
959
959
  return (0, _utils2.isObject)(options) ? options : {};
960
960
  }
961
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHAvQXBwbGljYXRpb24uanMiXSwibmFtZXMiOlsiQXBwbGljYXRpb24iLCJLb2EiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsInZhbGlkYXRvciIsInJvdXRlciIsImV2ZW50cyIsIm1pZGRsZXdhcmUiLCJtb2RlbHMiLCJzZXJ2aWNlcyIsImNvbnRyb2xsZXJzIiwiX3NldHVwRW1pdHRlciIsImFwcCIsImtleXMiLCJsb2ciLCJyZXN0Iiwic2lsZW50IiwicHJvY2VzcyIsImVudiIsIkRJVE9fU0lMRU5UIiwicHJveHkiLCJWYWxpZGF0b3IiLCJSb3V0ZXIiLCJzdG9yYWdlcyIsIk9iamVjdCIsImNyZWF0ZSIsImhhc0NvbnRyb2xsZXJNaWRkbGV3YXJlIiwic2V0dXBMb2dnZXIiLCJzZXR1cEtuZXgiLCJzZXR1cEdsb2JhbE1pZGRsZXdhcmUiLCJ1c2UiLCJhZGRTdG9yYWdlcyIsImFkZE1vZGVscyIsImFkZFNlcnZpY2VzIiwiYWRkQ29udHJvbGxlcnMiLCJhZGRSb3V0ZSIsInZlcmIiLCJwYXRoIiwidHJhbnNhY3RlZCIsImhhbmRsZXJzIiwiY29udHJvbGxlciIsImFjdGlvbiIsImhhbmRsZXIiLCJsZW5ndGgiLCJyb3V0ZSIsIm1vZGVsQ2xhc3MiLCJ2YWx1ZXMiLCJhZGRNb2RlbCIsInNvcnRNb2RlbHMiLCJzb3J0ZWRNb2RlbHMiLCJmaWx0ZXIiLCJuYW1lIiwic2V0dXAiLCJrbmV4IiwiaW5pdGlhbGl6ZSIsImFkZFNjaGVtYSIsImdldEpzb25TY2hlbWEiLCJzY2hlbWEiLCJyZWxhdGlvbnMiLCJzaG91bGRMb2ciLCJvcHRpb24iLCJpbmNsdWRlcyIsImRhdGEiLCJyZWxhdGlvbk1hcHBpbmdzIiwidmFsdWUiLCJNb2RlbCIsImlzUHJvdG90eXBlT2YiLCJjb25zb2xlIiwiaW5mbyIsInBpY28iLCJ5ZWxsb3ciLCJib2xkIiwidXRpbCIsImluc3BlY3QiLCJjb2xvcnMiLCJkZXB0aCIsIm1heEFycmF5TGVuZ3RoIiwiRXJyb3IiLCJzb3J0QnlSZWxhdGlvbnMiLCJsaXN0IiwiY29sbGVjdGVkIiwiZXhjbHVkZWQiLCJyZWxhdGlvbiIsImdldFJlbGF0aW9ucyIsIkJlbG9uZ3NUb09uZVJlbGF0aW9uIiwicmVsYXRlZE1vZGVsQ2xhc3MiLCJqb2luVGFibGVNb2RlbENsYXNzIiwicmVsYXRlZCIsInJldmVyc2UiLCJyZWR1Y2UiLCJnZXRNb2RlbCIsImVuZHNXaXRoIiwiZmluZE1vZGVsIiwiY2FsbGJhY2siLCJmaW5kIiwic2VydmljZSIsImVudHJpZXMiLCJhZGRTZXJ2aWNlIiwiU2VydmljZSIsInVuZGVmaW5lZCIsImdldFNlcnZpY2UiLCJmaW5kU2VydmljZSIsImZvckVhY2hTZXJ2aWNlIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsIm5hbWVzcGFjZSIsImtleSIsImFkZENvbnRyb2xsZXIiLCJzZXR1cENvbnRyb2xsZXJNaWRkbGV3YXJlIiwiQ29udHJvbGxlciIsInVybCIsImNvbXBvc2UiLCJnZXRDb250cm9sbGVyIiwiZmluZENvbnRyb2xsZXIiLCJnZXRBZG1pbkNvbnRyb2xsZXIiLCJBZG1pbkNvbnRyb2xsZXIiLCJnZXRBZG1pblZ1ZUNvbmZpZyIsImdldFZ1ZUNvbmZpZyIsImdldEFzc2V0Q29uZmlnIiwibm9ybWFsaXplRGJOYW1lcyIsImFzc2V0Q29uZmlnIiwibW9kZWxOYW1lIiwiYXNzZXRzIiwiZGVmaW5pdGlvbiIsIm5vcm1hbGl6ZWRNb2RlbE5hbWUiLCJub3JtYWxpemVJZGVudGlmaWVyIiwiY29udmVydGVkQXNzZXRzIiwiYXNzZXREYXRhUGF0aCIsInByb3BlcnR5IiwibmVzdGVkRGF0YVBhdGgiLCJpbmRleCIsImdldFByb3BlcnR5T3JSZWxhdGlvbkF0RGF0YVBhdGgiLCJub3JtYWxpemVkTmFtZSIsImRhdGFQYXRoIiwiYXNzZXRDb25maWdzIiwiYWRkU3RvcmFnZSIsInN0b3JhZ2UiLCJzdG9yYWdlQ2xhc3MiLCJTdG9yYWdlIiwiZ2V0IiwidHlwZSIsImdldFN0b3JhZ2UiLCJjb21waWxlVmFsaWRhdG9yIiwianNvblNjaGVtYSIsIm9wdGlvbnMiLCJjb21waWxlIiwiY29tcGlsZVBhcmFtZXRlcnNWYWxpZGF0b3IiLCJwYXJhbWV0ZXJzIiwiZGF0YU5hbWUiLCJwcm9wZXJ0aWVzIiwiYWRkUGFyYW1ldGVyIiwicHVzaCIsIm1lbWJlciIsImFzT2JqZWN0IiwidmFsaWRhdGUiLCJjb2VyY2VUeXBlcyIsImN0eCIsImNhbGwiLCJjcmVhdGVWYWxpZGF0aW9uRXJyb3IiLCJtZXNzYWdlIiwiZXJyb3JzIiwianNvbiIsIlZhbGlkYXRpb25FcnJvciIsInBhcnNlRXJyb3JzIiwiY3JlYXRlRGF0YWJhc2VFcnJvciIsImVycm9yIiwic3FsIiwibWF0Y2giLCJEYXRhYmFzZUVycm9yIiwibG9nZ2VyIiwicmVzcG9uc2VUaW1lIiwiZ2V0T3B0aW9ucyIsInJlcXVlc3RzIiwiaGVsbWV0IiwiY29ycyIsImNvbXByZXNzIiwiYnIiLCJwYXJhbXMiLCJ6bGliIiwiY29uc3RhbnRzIiwiQlJPVExJX1BBUkFNX1FVQUxJVFkiLCJldGFnIiwiYm9keVBhcnNlciIsInNlc3Npb24iLCJDb250ZXh0U3RvcmUiLCJwYXNzcG9ydCIsImVyciIsInJlcSIsInJlcyIsInBpbm8iLCJzdGRTZXJpYWxpemVycyIsInVzZXIiLCJpZCIsInNlcmlhbGl6ZXJzIiwibGV2ZWwiLCJwcmV0dHlQcmludCIsImlnbm9yZSIsInRyYW5zbGF0ZVRpbWUiLCJyZWRhY3QiLCJiYXNlIiwiY2hpbGQiLCJjbGllbnQiLCJzbmFrZUNhc2VPcHRpb25zIiwidHlwZVBhcnNlcnMiLCJwYXJzZXIiLCJkcml2ZXIiLCJ0eXBlcyIsInNldFR5cGVQYXJzZXIiLCJzZXR1cEtuZXhMb2dnaW5nIiwic3RhcnRUaW1lcyIsImVuZCIsInF1ZXJ5IiwicmVzcG9uc2UiLCJfX2tuZXhRdWVyeVVpZCIsImRpZmYiLCJocnRpbWUiLCJkdXJhdGlvbiIsImJpbmRpbmdzIiwiZnJvbUVudHJpZXMiLCJzdGFydHNXaXRoIiwib24iLCJpZGVudGlmaWVyIiwid3JhcElkZW50aWZpZXIiLCJyZXBsYWNlIiwiZGVub3JtYWxpemVJZGVudGlmaWVyIiwib2JqIiwicG9zdFByb2Nlc3NSZXNwb25zZSIsIm5vcm1hbGl6ZVBhdGgiLCJub3JtYWxpemVQYXRocyIsImZvcm1hdEVycm9yIiwidG9KU09OIiwic3RyIiwic3RhY2siLCJzcGxpdCIsInNsaWNlIiwiam9pbiIsIm9zIiwiRU9MIiwibG9nRXJyb3IiLCJleHBvc2UiLCJ0ZXh0IiwiUmVzcG9uc2VFcnJvciIsInN0YXR1cyIsImUiLCJzdGFydCIsImVtaXQiLCJzZXJ2ZXIiLCJob3N0IiwicG9ydCIsInJlc29sdmUiLCJyZWplY3QiLCJsaXN0ZW4iLCJhZGRyZXNzIiwic3RvcCIsImNsb3NlIiwic2V0SW1tZWRpYXRlIiwib2ZmIiwic3RhcnRPckV4aXQiLCJleGl0IiwiY3JlYXRlQXNzZXRzIiwiZmlsZXMiLCJjb3VudCIsInRyeCIsIkFzc2V0TW9kZWwiLCJmaWxlIiwiaW5zZXJ0IiwiaGFuZGxlQWRkZGVkQW5kUmVtb3ZlZEFzc2V0cyIsImFkZGVkRmlsZXMiLCJyZW1vdmVkRmlsZXMiLCJjbGVhbnVwVGltZVRocmVzaG9sZCIsInRpbWVUaHJlc2hvbGQiLCJpbXBvcnRlZEZpbGVzIiwiYWRkRm9yZWlnbkFzc2V0cyIsImNoYW5nZUNvdW50IiwiaW5jcmVtZW50Iiwid2hlcmVJbiIsInNldFRpbWVvdXQiLCJyZWxlYXNlVW51c2VkQXNzZXRzIiwiYXNzZXQiLCJmaW5kT25lIiwicmVkIiwiZ3JlZW4iLCJheGlvcyIsInJlcXVlc3QiLCJtZXRob2QiLCJyZXNwb25zZVR5cGUiLCJpbXBvcnRlZEZpbGUiLCJhZGRGaWxlIiwiYXNzaWduIiwiQXNzZXRFcnJvciIsImhhbmRsZU1vZGlmaWVkQXNzZXRzIiwibW9kaWZpZWRGaWxlcyIsImNoYW5nZWRGaWxlIiwidHJhbnNhY3Rpb24iLCJkYXRlIiwiRGF0ZSIsInNldE1pbGxpc2Vjb25kcyIsImdldE1pbGxpc2Vjb25kcyIsIm9ycGhhbmVkQXNzZXRzIiwid2hlcmUiLCJhbmRXaGVyZSIsIm9ycGhhbmVkS2V5cyIsInJlbW92ZUZpbGUiLCJkZWxldGUiLCJFdmVudEVtaXR0ZXIiLCJtaXhpbiIsInByb3RvdHlwZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQU1BOztBQUNBOztBQUNBOztBQVNBOztBQUlBOzs7O0FBT08sTUFBTUEsV0FBTixTQUEwQkMsWUFBMUIsQ0FBOEI7QUFDbkNDLEVBQUFBLFdBQVcsQ0FBQztBQUNWQyxJQUFBQSxNQUFNLEdBQUcsRUFEQztBQUVWQyxJQUFBQSxTQUZVO0FBR1ZDLElBQUFBLE1BSFU7QUFJVkMsSUFBQUEsTUFKVTtBQUtWQyxJQUFBQSxVQUxVO0FBTVZDLElBQUFBLE1BTlU7QUFPVkMsSUFBQUEsUUFQVTtBQVFWQyxJQUFBQTtBQVJVLE1BU1IsRUFUTyxFQVNIO0FBQ047O0FBQ0EsU0FBS0MsYUFBTCxDQUFtQkwsTUFBbkI7O0FBQ0EsVUFBTTtBQUVKTSxNQUFBQSxHQUFHLEVBQUU7QUFBRUMsUUFBQUEsSUFBRjtBQUFRLFdBQUdEO0FBQVgsVUFBbUIsRUFGcEI7QUFHSkUsTUFBQUEsR0FBRyxHQUFHLEVBSEY7QUFJSixTQUFHQztBQUpDLFFBS0ZaLE1BTEo7QUFNQSxTQUFLQSxNQUFMLEdBQWM7QUFDWlMsTUFBQUEsR0FEWTtBQUVaRSxNQUFBQSxHQUFHLEVBQUVBLEdBQUcsQ0FBQ0UsTUFBSixJQUFjQyxPQUFPLENBQUNDLEdBQVIsQ0FBWUMsV0FBMUIsR0FBd0MsRUFBeEMsR0FBNkNMLEdBRnRDO0FBR1osU0FBR0M7QUFIUyxLQUFkO0FBS0EsU0FBS0YsSUFBTCxHQUFZQSxJQUFaO0FBQ0EsU0FBS08s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N0I7O0FBT0EsWUFBSUYsY0FBYyxDQUFDaFEsTUFBZixHQUF3QixDQUE1QixFQUErQjtBQUM3QixnQkFBTW1RLFlBQVksR0FBRyxNQUFNdk0sT0FBTyxDQUFDQyxHQUFSLENBQ3pCbU0sY0FBYyxDQUFDbE0sR0FBZixDQUFtQixNQUFNOEssS0FBTixJQUFlO0FBQ2hDLGdCQUFJO0FBQ0Ysb0JBQU0sS0FBS3pJLFVBQUwsQ0FBZ0J5SSxLQUFLLENBQUM5SSxPQUF0QixFQUErQnNLLFVBQS9CLENBQTBDeEIsS0FBSyxDQUFDZCxJQUFoRCxDQUFOO0FBQ0QsYUFGRCxDQUVFLE9BQU9uRyxLQUFQLEVBQWM7QUFDZCxtQkFBS2dGLElBQUwsQ0FBVSxPQUFWLEVBQW1CaEYsS0FBbkI7QUFDQWlILGNBQUFBLEtBQUssQ0FBQ2pILEtBQU4sR0FBY0EsS0FBZDtBQUNEOztBQUNELG1CQUFPaUgsS0FBSyxDQUFDNUssR0FBYjtBQUNELFdBUkQsQ0FEeUIsQ0FBM0I7QUFXQSxnQkFBTTZKLFVBQVUsQ0FDYnBELEtBREcsQ0FDR21ELEdBREgsRUFFSHlDLE1BRkcsR0FHSDVCLE9BSEcsQ0FHSyxLQUhMLEVBR1kwQixZQUhaLENBQU47QUFJRDs7QUFDRCxlQUFPSCxjQUFQO0FBQ0QsT0E5Qk0sQ0FBUDtBQStCRDtBQUNGOztBQS80QmtDOzs7O0FBbzVCckNNLGtCQUFhQyxLQUFiLENBQW1CbFQsV0FBVyxDQUFDbVQsU0FBL0I7O0FBRUEsU0FBU3ZJLFVBQVQsQ0FBb0IzQixPQUFwQixFQUE2QjtBQUMzQixTQUFPLHNCQUFTQSxPQUFULElBQW9CQSxPQUFwQixHQUE4QixFQUFyQztBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEtvYSBmcm9tICdrb2EnXG5pbXBvcnQgS25leCBmcm9tICdrbmV4J1xuaW1wb3J0IHV0aWwgZnJvbSAndXRpbCdcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcydcbmltcG9ydCBwaWNvIGZyb20gJ3BpY29jb2xvcnMnXG5pbXBvcnQgemxpYiBmcm9tICd6bGliJ1xuaW1wb3J0IHBpbm8gZnJvbSAncGlubydcbmltcG9ydCBvcyBmcm9tICdvcydcbmltcG9ydCBwYXJzZUR1cmF0aW9uIGZyb20gJ3BhcnNlLWR1cmF0aW9uJ1xuaW1wb3J0IGJvZHlQYXJzZXIgZnJvbSAna29hLWJvZHlwYXJzZXInXG5pbXBvcnQgY29ycyBmcm9tICdAa29hL2NvcnMnXG5pbXBvcnQgY29tcG9zZSBmcm9tICdrb2EtY29tcG9zZSdcbmltcG9ydCBjb21wcmVzcyBmcm9tICdrb2EtY29tcHJlc3MnXG5pbXBvcnQgY29uZGl0aW9uYWwgZnJvbSAna29hLWNvbmRpdGlvbmFsLWdldCdcbmltcG9ydCBwYXNzcG9ydCBmcm9tICdrb2EtcGFzc3BvcnQnXG5pbXBvcnQgc2Vzc2lvbiBmcm9tICdrb2Etc2Vzc2lvbidcbmltcG9ydCBldGFnIGZyb20gJ2tvYS1ldGFnJ1xuaW1wb3J0IGhlbG1ldCBmcm9tICdrb2EtaGVsbWV0J1xuaW1wb3J0IHJlc3BvbnNlVGltZSBmcm9tICdrb2EtcmVzcG9uc2UtdGltZSdcbmltcG9ydCBSb3V0ZXIgZnJvbSAnQGRpdG9qcy9yb3V0ZXInXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAL2xpYidcbmltcG9ydCB7IENvbnRyb2xsZXIsIEFkbWluQ29udHJvbGxlciB9IGZyb20gJ0AvY29udHJvbGxlcnMnXG5pbXBvcnQgeyBTZXJ2aWNlIH0gZnJvbSAnQC9zZXJ2aWNlcydcbmltcG9ydCB7IFN0b3JhZ2UgfSBmcm9tICdAL3N0b3JhZ2UnXG5pbXBvcnQgeyBjb252ZXJ0U2NoZW1hIH0gZnJvbSAnQC9zY2hlbWEnXG5pbXBvcnQgeyBmb3JtYXRKc29uIH0gZnJvbSAnQC91dGlscydcbmltcG9ydCB7XG4gIFJlc3BvbnNlRXJyb3IsXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgRGF0YWJhc2VFcnJvcixcbiAgQXNzZXRFcnJvclxufSBmcm9tICdAL2Vycm9ycydcbmltcG9ydCBTZXNzaW9uU3RvcmUgZnJvbSAnLi9TZXNzaW9uU3RvcmUnXG5pbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tICcuL1ZhbGlkYXRvcidcbmltcG9ydCB7XG4gIGF0dGFjaExvZ2dlcixcbiAgY3JlYXRlVHJhbnNhY3Rpb24sXG4gIGZpbmRSb3V0ZSxcbiAgaGFuZGxlRXJyb3IsXG4gIGhhbmRsZVJvdXRlLFxuICBoYW5kbGVVc2VyLFxuICBsb2dSZXF1ZXN0c1xufSBmcm9tICdAL21pZGRsZXdhcmUnXG5pbXBvcnQge1xuICBpc0FycmF5LCBpc09iamVjdCwgaXNTdHJpbmcsIGFzQXJyYXksIGlzUGxhaW5PYmplY3QsIGh5cGhlbmF0ZSwgY2xvbmUsIG1lcmdlLFxuICBwYXJzZURhdGFQYXRoLCBub3JtYWxpemVEYXRhUGF0aFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHtcbiAgTW9kZWwsXG4gIEJlbG9uZ3NUb09uZVJlbGF0aW9uLFxuICBrbmV4U25ha2VDYXNlTWFwcGVycyxcbiAgcmVmXG59IGZyb20gJ29iamVjdGlvbidcblxuZXhwb3J0IGNsYXNzIEFwcGxpY2F0aW9uIGV4dGVuZHMgS29hIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGNvbmZpZyA9IHt9LFxuICAgIHZhbGlkYXRvcixcbiAgICByb3V0ZXIsXG4gICAgZXZlbnRzLFxuICAgIG1pZGRsZXdhcmUsXG4gICAgbW9kZWxzLFxuICAgIHNlcnZpY2VzLFxuICAgIGNvbnRyb2xsZXJzXG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLl9zZXR1cEVtaXR0ZXIoZXZlbnRzKVxuICAgIGNvbnN0IHtcbiAgICAgIC8vIFBsdWNrIGtleXMgb3V0IG9mIGBjb25maWcuYXBwYCB0byBrZWVwIHRoZW0gc2VjcmV0XG4gICAgICBhcHA6IHsga2V5cywgLi4uYXBwIH0gPSB7fSxcbiAgICAgIGxvZyA9IHt9LFxuICAgICAgLi4ucmVzdFxuICAgIH0gPSBjb25maWdcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGFwcCxcbiAgICAgIGxvZzogbG9nLnNpbGVudCB8fCBwcm9jZXNzLmVudi5ESVRPX1NJTEVOVCA/IHt9IDogbG9nLFxuICAgICAgLi4ucmVzdFxuICAgIH1cbiAgICB0aGlzLmtleXMgPSBrZXlzXG4gICAgdGhpcy5wcm94eSA9ICEhYXBwLnByb3h5XG4gICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3IgfHwgbmV3IFZhbGlkYXRvcigpXG4gICAgdGhpcy5yb3V0ZXIgPSByb3V0ZXIgfHwgbmV3IFJvdXRlcigpXG4gICAgdGhpcy52YWxpZGF0b3IuYXBwID0gdGhpc1xuICAgIHRoaXMuc3RvcmFnZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5tb2RlbHMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5zZXJ2aWNlcyA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB0aGlzLmNvbnRyb2xsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIHRoaXMuaGFzQ29udHJvbGxlck1pZGRsZXdhcmUgPSBmYWxzZVxuICAgIHRoaXMuc2V0dXBMb2dnZXIoKVxuICAgIHRoaXMuc2V0dXBLbmV4KClcbiAgICB0aGlzLnNldHVwR2xvYmFsTWlkZGxld2FyZSgpXG4gICAgaWYgKG1pZGRsZXdhcmUpIHtcbiAgICAgIHRoaXMudXNlKG1pZGRsZXdhcmUpXG4gICAgfVxuICAgIGlmIChjb25maWcuc3RvcmFnZXMpIHtcbiAgICAgIHRoaXMuYWRkU3RvcmFnZXMoY29uZmlnLnN0b3JhZ2VzKVxuICAgIH1cbiAgICBpZiAobW9kZWxzKSB7XG4gICAgICB0aGlzLmFkZE1vZGVscyhtb2RlbHMpXG4gICAgfVxuICAgIGlmIChzZXJ2aWNlcykge1xuICAgICAgdGhpcy5hZGRTZXJ2aWNlcyhzZXJ2aWNlcylcbiAgICB9XG4gICAgaWYgKGNvbnRyb2xsZXJzKSB7XG4gICAgICB0aGlzLmFkZENvbnRyb2xsZXJzKGNvbnRyb2xsZXJzKVxuICAgIH1cbiAgfVxuXG4gIGFkZFJvdXRlKHZlcmIsIHBhdGgsIHRyYW5zYWN0ZWQsIGhhbmRsZXJzLCBjb250cm9sbGVyID0gbnVsbCwgYWN0aW9uID0gbnVsbCkge1xuICAgIGhhbmRsZXJzID0gYXNBcnJheShoYW5kbGVycylcbiAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnMubGVuZ3RoID4gMSA/IGNvbXBvc2UoaGFuZGxlcnMpIDogaGFuZGxlcnNbMF1cbiAgICAvLyBJbnN0ZWFkIG9mIGRpcmVjdGx5IHBhc3NpbmcgYGhhbmRsZXJgLCBwYXNzIGEgYHJvdXRlYCBvYmplY3QgdGhhdCBhbHNvXG4gICAgLy8gd2lsbCBiZSBleHBvc2VkIHRocm91Z2ggYGN0eC5yb3V0ZWAsIHNlZSBgcm91dGVySGFuZGxlcigpYDpcbiAgICBjb25zdCByb3V0ZSA9IHtcbiAgICAgIHZlcmIsXG4gICAgICBwYXRoLFxuICAgICAgdHJhbnNhY3RlZCxcbiAgICAgIGhhbmRsZXIsXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgYWN0aW9uXG4gICAgfVxuICAgIHRoaXMucm91dGVyW3ZlcmJdKHBhdGgsIHJvdXRlKVxuICB9XG5cbiAgYWRkTW9kZWxzKG1vZGVscykge1xuICAgIC8vIEZpcnN0IGFkZCBhbGwgbW9kZWxzIHRoZW4gY2FsbCBpbml0aWFsaXplKCkgZm9yIGVhY2ggaW4gYSBzZWNvbmQgbG9vcCxcbiAgICAvLyBzaW5jZSB0aGV5IG1heSBiZSByZWZlcmVuY2luZyBlYWNoIG90aGVyIGluIHJlbGF0aW9ucy5cbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgT2JqZWN0LnZhbHVlcyhtb2RlbHMpKSB7XG4gICAgICB0aGlzLmFkZE1vZGVsKG1vZGVsQ2xhc3MpXG4gICAgfVxuICAgIC8vIE5vdyAocmUtKXNvcnQgYWxsIG1vZGVscyBiYXNlZCBvbiB0aGVpciByZWxhdGlvbnMuXG4gICAgdGhpcy5tb2RlbHMgPSB0aGlzLnNvcnRNb2RlbHModGhpcy5tb2RlbHMpXG4gICAgLy8gRmlsdGVyIHRocm91Z2ggYWxsIHNvcnRlZCBtb2RlbHMsIGtlZXBpbmcgb25seSB0aGUgbmV3bHkgYWRkZWQgb25lcy5cbiAgICBjb25zdCBzb3J0ZWRNb2RlbHMgPSBPYmplY3QudmFsdWVzKHRoaXMubW9kZWxzKS5maWx0ZXIoXG4gICAgICBtb2RlbENsYXNzID0+IG1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID09PSBtb2RlbENsYXNzXG4gICAgKVxuICAgIC8vIEluaXRpYWxpemUgdGhlIGFkZGVkIG1vZGVscyBpbiBjb3JyZWN0IHNvcnRlZCBzZXF1ZW5jZSwgc28gdGhhdCBmb3IgZXZlcnlcbiAgICAvLyBtb2RlbCwgZ2V0UmVsYXRlZFJlbGF0aW9ucygpIHJldHVybnMgdGhlIGZ1bGwgbGlzdCBvZiByZWxhdGluZyByZWxhdGlvbnMuXG4gICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIHNvcnRlZE1vZGVscykge1xuICAgICAgaWYgKG1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID09PSBtb2RlbENsYXNzKSB7XG4gICAgICAgIG1vZGVsQ2xhc3Muc2V0dXAodGhpcy5rbmV4KVxuICAgICAgICAvLyBOb3cgdGhhdCB0aGUgbW9kZWxDbGFzcyBpcyBzZXQgdXAsIGNhbGwgYGluaXRpYWxpemUoKWAsIHdoaWNoIGNhbiBiZVxuICAgICAgICAvLyBvdmVycmlkZGVuIGJ5IHN1Yi1jbGFzc2VzLHdpdGhvdXQgaGF2aW5nIHRvIGNhbGwgYHN1cGVyLmluaXRpYWxpemUoKWBcbiAgICAgICAgbW9kZWxDbGFzcy5pbml0aWFsaXplKClcbiAgICAgICAgdGhpcy52YWxpZGF0b3IuYWRkU2NoZW1hKG1vZGVsQ2xhc3MuZ2V0SnNvblNjaGVtYSgpKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB7IGxvZyB9ID0gdGhpcy5jb25maWdcbiAgICBpZiAobG9nLnNjaGVtYSB8fCBsb2cucmVsYXRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2Ygc29ydGVkTW9kZWxzKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZExvZyA9IG9wdGlvbiA9PiAoXG4gICAgICAgICAgb3B0aW9uID09PSB0cnVlIHx8XG4gICAgICAgICAgYXNBcnJheShvcHRpb24pLmluY2x1ZGVzKG1vZGVsQ2xhc3MubmFtZSlcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBkYXRhID0ge31cbiAgICAgICAgaWYgKHNob3VsZExvZyhsb2cuc2NoZW1hKSkge1xuICAgICAgICAgIGRhdGEuc2NoZW1hID0gbW9kZWxDbGFzcy5nZXRKc29uU2NoZW1hKClcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvdWxkTG9nKGxvZy5yZWxhdGlvbnMpKSB7XG4gICAgICAgICAgZGF0YS5yZWxhdGlvbnMgPSBjbG9uZShtb2RlbENsYXNzLnJlbGF0aW9uTWFwcGluZ3MsIHZhbHVlID0+XG4gICAgICAgICAgICBNb2RlbC5pc1Byb3RvdHlwZU9mKHZhbHVlKSA/IGBbTW9kZWw6ICR7dmFsdWUubmFtZX1dYCA6IHZhbHVlXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgcGljby55ZWxsb3cuYm9sZChgXFxuJHttb2RlbENsYXNzLm5hbWV9OlxcbmApLFxuICAgICAgICAgICAgdXRpbC5pbnNwZWN0KGRhdGEsIHtcbiAgICAgICAgICAgICAgY29sb3JzOiB0cnVlLFxuICAgICAgICAgICAgICBkZXB0aDogbnVsbCxcbiAgICAgICAgICAgICAgbWF4QXJyYXlMZW5ndGg6IG51bGxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkTW9kZWwobW9kZWxDbGFzcykge1xuICAgIGlmIChNb2RlbC5pc1Byb3RvdHlwZU9mKG1vZGVsQ2xhc3MpKSB7XG4gICAgICBtb2RlbENsYXNzLmFwcCA9IHRoaXNcbiAgICAgIHRoaXMubW9kZWxzW21vZGVsQ2xhc3MubmFtZV0gPSBtb2RlbENsYXNzXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBtb2RlbCBjbGFzczogJHttb2RlbENsYXNzfWApXG4gICAgfVxuICB9XG5cbiAgc29ydE1vZGVscyhtb2RlbHMpIHtcbiAgICBjb25zdCBzb3J0QnlSZWxhdGlvbnMgPSAobGlzdCwgY29sbGVjdGVkID0ge30sIGV4Y2x1ZGVkID0ge30pID0+IHtcbiAgICAgIGZvciAoY29uc3QgbW9kZWxDbGFzcyBvZiBsaXN0KSB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSB9ID0gbW9kZWxDbGFzc1xuICAgICAgICBpZiAoIWNvbGxlY3RlZFtuYW1lXSAmJiAhZXhjbHVkZWRbbmFtZV0pIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uIG9mIE9iamVjdC52YWx1ZXMobW9kZWxDbGFzcy5nZXRSZWxhdGlvbnMoKSkpIHtcbiAgICAgICAgICAgIGlmICghKHJlbGF0aW9uIGluc3RhbmNlb2YgQmVsb25nc1RvT25lUmVsYXRpb24pKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgcmVsYXRlZE1vZGVsQ2xhc3MsIGpvaW5UYWJsZU1vZGVsQ2xhc3MgfSA9IHJlbGF0aW9uXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgcmVsYXRlZCBvZiBbam9pblRhYmxlTW9kZWxDbGFzcywgcmVsYXRlZE1vZGVsQ2xhc3NdKSB7XG4gICAgICAgICAgICAgICAgLy8gRXhjbHVkZSBzZWxmLXJlZmVyZW5jZXMgYW5kIGdlbmVyYXRlZCBqb2luIG1vZGVsczpcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRlZCAmJiByZWxhdGVkICE9PSBtb2RlbENsYXNzICYmIG1vZGVsc1tyZWxhdGVkLm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICBzb3J0QnlSZWxhdGlvbnMoW3JlbGF0ZWRdLCBjb2xsZWN0ZWQsIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRXhjbHVkZSBtb2RlbENsYXNzIHRvIHByZXZlbnQgZW5kbGVzcyByZWN1cnNpb25zOlxuICAgICAgICAgICAgICAgICAgICBbbmFtZV06IG1vZGVsQ2xhc3MsXG4gICAgICAgICAgICAgICAgICAgIC4uLmV4Y2x1ZGVkXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb2xsZWN0ZWRbbmFtZV0gPSBtb2RlbENsYXNzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGNvbGxlY3RlZClcbiAgICB9XG4gICAgLy8gUmV0dXJuIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBzb3J0ZWQgbW9kZWxzIGFzIGl0cyBrZXkvdmFsdWUgcGFpcnMuXG4gICAgLy8gTk9URTogV2UgbmVlZCB0byByZXZlcnNlIGZvciB0aGUgYWJvdmUgYWxnb3JpdGhtIHRvIHNvcnQgcHJvcGVybHksXG4gICAgLy8gYW5kIHRoZW4gcmV2ZXJzZSB0aGUgcmVzdWx0IGJhY2suXG4gICAgcmV0dXJuIHNvcnRCeVJlbGF0aW9ucyhPYmplY3QudmFsdWVzKG1vZGVscykucmV2ZXJzZSgpKS5yZXZlcnNlKCkucmVkdWNlKFxuICAgICAgKG1vZGVscywgbW9kZWxDbGFzcykgPT4ge1xuICAgICAgICBtb2RlbHNbbW9kZWxDbGFzcy5uYW1lXSA9IG1vZGVsQ2xhc3NcbiAgICAgICAgcmV0dXJuIG1vZGVsc1xuICAgICAgfSxcbiAgICAgIE9iamVjdC5jcmVhdGUobnVsbClcbiAgICApXG4gIH1cblxuICBnZXRNb2RlbChuYW1lKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMubW9kZWxzW25hbWVdIHx8XG4gICAgICAhbmFtZS5lbmRzV2l0aCgnTW9kZWwnKSAmJiB0aGlzLm1vZGVsc1tgJHtuYW1lfU1vZGVsYF0gfHxcbiAgICAgIG51bGxcbiAgICApXG4gIH1cblxuICBmaW5kTW9kZWwoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLm1vZGVscykuZmluZChjYWxsYmFjaylcbiAgfVxuXG4gIGFkZFNlcnZpY2VzKHNlcnZpY2VzKSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgc2VydmljZV0gb2YgT2JqZWN0LmVudHJpZXMoc2VydmljZXMpKSB7XG4gICAgICAvLyBIYW5kbGUgRVM2IG1vZHVsZSB3ZWlyZG5lc3MgdGhhdCBjYW4gaGFwcGVuLCBhcHBhcmVudGx5OlxuICAgICAgaWYgKG5hbWUgPT09ICdkZWZhdWx0JyAmJiBpc1BsYWluT2JqZWN0KHNlcnZpY2UpKSB7XG4gICAgICAgIHRoaXMuYWRkU2VydmljZXMoc2VydmljZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWRkU2VydmljZShzZXJ2aWNlLCBuYW1lKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZFNlcnZpY2Uoc2VydmljZSwgbmFtZSkge1xuICAgIC8vIEF1dG8taW5zdGFudGlhdGUgY29udHJvbGxlciBjbGFzc2VzOlxuICAgIGlmIChTZXJ2aWNlLmlzUHJvdG90eXBlT2Yoc2VydmljZSkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gICAgICBzZXJ2aWNlID0gbmV3IHNlcnZpY2UodGhpcywgbmFtZSlcbiAgICB9XG4gICAgaWYgKCEoc2VydmljZSBpbnN0YW5jZW9mIFNlcnZpY2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2VydmljZTogJHtzZXJ2aWNlfWApXG4gICAgfVxuICAgIC8vIE9ubHkgYWZ0ZXIgdGhlIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCwgYHNlcnZpY2UubmFtZWAgaXMgZ3VhcmFudGVlZCB0byBiZVxuICAgIC8vIHNldCB0byB0aGUgY29ycmVjdCB2YWx1ZSwgZS5nLiB3aXRoIGFuIGFmdGVyLWNvbnN0cnVjdG9yIGNsYXNzIHByb3BlcnR5LlxuICAgICh7IG5hbWUgfSA9IHNlcnZpY2UpXG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWcuc2VydmljZXNbbmFtZV1cbiAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29uZmlndXJhdGlvbiBtaXNzaW5nIGZvciBzZXJ2aWNlICcke25hbWV9J2ApXG4gICAgfVxuICAgIC8vIEFzIGEgY29udmVudGlvbiwgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBzZXJ2aWNlIGNhbiBiZSBzZXQgdG8gYGZhbHNlYFxuICAgIC8vIGluIG9yZGVyIHRvIGVudGlyZWx5IGRlYWN0aXZhdGUgdGhlIHNlcnZpY2UuXG4gICAgaWYgKGNvbmZpZyAhPT0gZmFsc2UpIHtcbiAgICAgIHNlcnZpY2Uuc2V0dXAoY29uZmlnKVxuICAgICAgdGhpcy5zZXJ2aWNlc1tuYW1lXSA9IHNlcnZpY2VcbiAgICAgIC8vIE5vdyB0aGF0IHRoZSBzZXJ2aWNlIGlzIHNldCB1cCwgY2FsbCBgaW5pdGlhbGl6ZSgpYCB3aGljaCBjYW4gYmVcbiAgICAgIC8vIG92ZXJyaWRkZW4gYnkgc2VydmljZXMuXG4gICAgICBzZXJ2aWNlLmluaXRpYWxpemUoKVxuICAgIH1cbiAgfVxuXG4gIGdldFNlcnZpY2UobmFtZSkge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2VzW25hbWVdIHx8IG51bGxcbiAgfVxuXG4gIGZpbmRTZXJ2aWNlKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5zZXJ2aWNlcykuZmluZChjYWxsYmFjaylcbiAgfVxuXG4gIGZvckVhY2hTZXJ2aWNlKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC52YWx1ZXModGhpcy5zZXJ2aWNlcykubWFwKGNhbGxiYWNrKSlcbiAgfVxuXG4gIGFkZENvbnRyb2xsZXJzKGNvbnRyb2xsZXJzLCBuYW1lc3BhY2UpIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb250cm9sbGVycykpIHtcbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICB0aGlzLmFkZENvbnRyb2xsZXJzKHZhbHVlLCBuYW1lc3BhY2UgPyBgJHtuYW1lc3BhY2V9LyR7a2V5fWAgOiBrZXkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkZENvbnRyb2xsZXIodmFsdWUsIG5hbWVzcGFjZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRDb250cm9sbGVyKGNvbnRyb2xsZXIsIG5hbWVzcGFjZSkge1xuICAgIC8vIENvbnRyb2xsZXJzIHJlcXVpcmUgYWRkaXRpb25hbCBtaWRkbGV3YXJlIHRvIGJlIGluc3RhbGxlZCBvbmNlLlxuICAgIHRoaXMuc2V0dXBDb250cm9sbGVyTWlkZGxld2FyZSgpXG4gICAgLy8gQXV0by1pbnN0YW50aWF0ZSBjb250cm9sbGVyIGNsYXNzZXM6XG4gICAgaWYgKENvbnRyb2xsZXIuaXNQcm90b3R5cGVPZihjb250cm9sbGVyKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXBcbiAgICAgIGNvbnRyb2xsZXIgPSBuZXcgY29udHJvbGxlcih0aGlzLCBuYW1lc3BhY2UpXG4gICAgfVxuICAgIGlmICghKGNvbnRyb2xsZXIgaW5zdGFuY2VvZiBDb250cm9sbGVyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbnRyb2xsZXI6ICR7Y29udHJvbGxlcn1gKVxuICAgIH1cbiAgICAvLyBJbmhlcml0YW5jZSBvZiBhY3Rpb24gbWV0aG9kcyBjYW5ub3QgaGFwcGVuIGluIHRoZSBjb25zdHJ1Y3RvciBpdHNlbGYsXG4gICAgLy8gc28gY2FsbCBzZXBhcmF0ZSBgc2V0dXAoKWAgbWV0aG9kIGFmdGVyIGluIG9yZGVyIHRvIHRha2UgY2FyZSBvZiBpdC5cbiAgICBjb250cm9sbGVyLnNldHVwKClcbiAgICB0aGlzLmNvbnRyb2xsZXJzW2NvbnRyb2xsZXIudXJsXSA9IGNvbnRyb2xsZXJcbiAgICAvLyBOb3cgdGhhdCB0aGUgY29udHJvbGxlciBpcyBzZXQgdXAsIGNhbGwgYGluaXRpYWxpemUoKWAgd2hpY2ggY2FuIGJlXG4gICAgLy8gb3ZlcnJpZGRlbiBieSBjb250cm9sbGVycy5cbiAgICBjb250cm9sbGVyLmluaXRpYWxpemUoKVxuICAgIC8vIEVhY2ggY29udHJvbGxlciBjYW4gYWxzbyBwcm92aWRlIGZ1cnRoZXIgbWlkZGxld2FyZSwgZS5nLlxuICAgIC8vIGBBZG1pbkNvbnRyb2xsZXJgOlxuICAgIGNvbnN0IG1pZGRsZXdhcmUgPSBjb250cm9sbGVyLmNvbXBvc2UoKVxuICAgIGlmIChtaWRkbGV3YXJlKSB7XG4gICAgICB0aGlzLnVzZShtaWRkbGV3YXJlKVxuICAgIH1cbiAgfVxuXG4gIGdldENvbnRyb2xsZXIodXJsKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJvbGxlcnNbdXJsXSB8fCBudWxsXG4gIH1cblxuICBmaW5kQ29udHJvbGxlcihjYWxsYmFjaykge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuY29udHJvbGxlcnMpLmZpbmQoY2FsbGJhY2spXG4gIH1cblxuICBnZXRBZG1pbkNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluZENvbnRyb2xsZXIoXG4gICAgICBjb250cm9sbGVyID0+IGNvbnRyb2xsZXIgaW5zdGFuY2VvZiBBZG1pbkNvbnRyb2xsZXJcbiAgICApXG4gIH1cblxuICBnZXRBZG1pblZ1ZUNvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBZG1pbkNvbnRyb2xsZXIoKT8uZ2V0VnVlQ29uZmlnKCkgfHwgbnVsbFxuICB9XG5cbiAgZ2V0QXNzZXRDb25maWcoe1xuICAgIG1vZGVscyA9IE9iamVjdC5rZXlzKHRoaXMubW9kZWxzKSxcbiAgICBub3JtYWxpemVEYk5hbWVzID0gdGhpcy5jb25maWcua25leC5ub3JtYWxpemVEYk5hbWVzXG4gIH0gPSB7fSkge1xuICAgIGNvbnN0IGFzc2V0Q29uZmlnID0ge31cbiAgICBmb3IgKGNvbnN0IG1vZGVsTmFtZSBvZiBtb2RlbHMpIHtcbiAgICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSB0aGlzLm1vZGVsc1ttb2RlbE5hbWVdXG4gICAgICBjb25zdCB7IGFzc2V0cyB9ID0gbW9kZWxDbGFzcy5kZWZpbml0aW9uXG4gICAgICBpZiAoYXNzZXRzKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRNb2RlbE5hbWUgPSBub3JtYWxpemVEYk5hbWVzXG4gICAgICAgICAgPyB0aGlzLm5vcm1hbGl6ZUlkZW50aWZpZXIobW9kZWxOYW1lKVxuICAgICAgICAgIDogbW9kZWxOYW1lXG4gICAgICAgIGNvbnN0IGNvbnZlcnRlZEFzc2V0cyA9IHt9XG4gICAgICAgIGZvciAoY29uc3QgW2Fzc2V0RGF0YVBhdGgsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoYXNzZXRzKSkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgbmVzdGVkRGF0YVBhdGgsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgaW5kZXhcbiAgICAgICAgICB9ID0gbW9kZWxDbGFzcy5nZXRQcm9wZXJ0eU9yUmVsYXRpb25BdERhdGFQYXRoKGFzc2V0RGF0YVBhdGgpXG4gICAgICAgICAgaWYgKHByb3BlcnR5ICYmIGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZURiTmFtZXNcbiAgICAgICAgICAgICAgPyB0aGlzLm5vcm1hbGl6ZUlkZW50aWZpZXIobmFtZSlcbiAgICAgICAgICAgICAgOiBuYW1lXG4gICAgICAgICAgICBjb25zdCBkYXRhUGF0aCA9IG5vcm1hbGl6ZURhdGFQYXRoKFtcbiAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUsXG4gICAgICAgICAgICAgIC4uLnBhcnNlRGF0YVBhdGgobmVzdGVkRGF0YVBhdGgpXG4gICAgICAgICAgICBdKVxuICAgICAgICAgICAgY29uc3QgYXNzZXRDb25maWdzID0gY29udmVydGVkQXNzZXRzW25vcm1hbGl6ZWROYW1lXSB8fD0ge31cbiAgICAgICAgICAgIGFzc2V0Q29uZmlnc1tkYXRhUGF0aF0gPSBjb25maWdcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZXN0ZWQgZ3JhcGggcHJvcGVydGllcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQnKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhc3NldENvbmZpZ1tub3JtYWxpemVkTW9kZWxOYW1lXSA9IGNvbnZlcnRlZEFzc2V0c1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXNzZXRDb25maWdcbiAgfVxuXG4gIGFkZFN0b3JhZ2VzKHN0b3JhZ2VzKSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhzdG9yYWdlcykpIHtcbiAgICAgIHRoaXMuYWRkU3RvcmFnZShjb25maWcsIG5hbWUpXG4gICAgfVxuICB9XG5cbiAgYWRkU3RvcmFnZShjb25maWcsIG5hbWUpIHtcbiAgICBsZXQgc3RvcmFnZSA9IG51bGxcbiAgICBpZiAoaXNQbGFpbk9iamVjdChjb25maWcpKSB7XG4gICAgICBjb25zdCBzdG9yYWdlQ2xhc3MgPSBTdG9yYWdlLmdldChjb25maWcudHlwZSlcbiAgICAgIGlmICghc3RvcmFnZUNsYXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc3RvcmFnZTogJHtjb25maWd9YClcbiAgICAgIH1cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gICAgICBzdG9yYWdlID0gbmV3IHN0b3JhZ2VDbGFzcyh0aGlzLCBjb25maWcpXG4gICAgfSBlbHNlIGlmIChjb25maWcgaW5zdGFuY2VvZiBTdG9yYWdlKSB7XG4gICAgICBzdG9yYWdlID0gY29uZmlnXG4gICAgfVxuICAgIGlmIChzdG9yYWdlKSB7XG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICBzdG9yYWdlLm5hbWUgPSBuYW1lXG4gICAgICB9XG4gICAgICB0aGlzLnN0b3JhZ2VzW3N0b3JhZ2UubmFtZV0gPSBzdG9yYWdlXG4gICAgfVxuICAgIHJldHVybiBzdG9yYWdlXG4gIH1cblxuICBnZXRTdG9yYWdlKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlc1tuYW1lXSB8fCBudWxsXG4gIH1cblxuICBjb21waWxlVmFsaWRhdG9yKGpzb25TY2hlbWEsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4ganNvblNjaGVtYVxuICAgICAgPyB0aGlzLnZhbGlkYXRvci5jb21waWxlKGpzb25TY2hlbWEsIG9wdGlvbnMpXG4gICAgICA6IG51bGxcbiAgfVxuXG4gIGNvbXBpbGVQYXJhbWV0ZXJzVmFsaWRhdG9yKHBhcmFtZXRlcnMsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGxpc3QgPSBbXVxuICAgIGNvbnN0IHsgZGF0YU5hbWUgPSAnZGF0YScgfSA9IG9wdGlvbnNcblxuICAgIGxldCBwcm9wZXJ0aWVzID0gbnVsbFxuICAgIGNvbnN0IGFkZFBhcmFtZXRlciA9IChuYW1lLCBzY2hlbWEpID0+IHtcbiAgICAgIGxpc3QucHVzaCh7XG4gICAgICAgIG5hbWU6IG5hbWUgPz8gbnVsbCxcbiAgICAgICAgLi4uc2NoZW1hXG4gICAgICB9KVxuICAgICAgaWYgKCFzY2hlbWEubWVtYmVyKSB7XG4gICAgICAgIHByb3BlcnRpZXMgfHw9IHt9XG4gICAgICAgIHByb3BlcnRpZXNbbmFtZSB8fCBkYXRhTmFtZV0gPSBzY2hlbWFcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdXBwb3J0IHR3byBmb3JtYXRzIG9mIHBhcmFtZXRlcnMgZGVmaW5pdGlvbnM6XG4gICAgLy8gLSBBbiBhcnJheSBvZiBwYXJhbWV0ZXIgc2NoZW1hcywgbmFtZWQgYnkgdGhlaXIgYG5hbWVgIGtleS5cbiAgICAvLyAtIEFuIG9iamVjdCBvZiBwYXJhbWV0ZXIgc2NoZW1hcywgbmFtZWQgYnkgdGhlIGtleSB1bmRlciB3aGljaCBlYWNoXG4gICAgLy8gICBzY2hlbWEgaXMgc3RvcmVkIGluIHRoZSByb290IG9iamVjdC5cbiAgICAvLyBJZiBhbiBhcnJheSBpcyBwYXNzZWQsIHRoZW4gdGhlIGNvbnRyb2xsZXIgYWN0aW9ucyByZWNlaXZlcyB0aGVcbiAgICAvLyBwYXJhbWV0ZXJzIGFzIHNlcGFyYXRlIGFyZ3VtZW50cy4gSWYgYW4gb2JqZWN0IGlzIHBhc3NlZCwgdGhlbiB0aGVcbiAgICAvLyBhY3Rpb25zIHJlY2VpdmVzIG9uZSBwYXJhbWV0ZXIgb2JqZWN0IHdoZXJlIHVuZGVyIHRoZSBzYW1lIGtleXMgdGhlXG4gICAgLy8gc3BlY2lmaWVkIHBhcmFtZXRlciB2YWx1ZXMgYXJlIHN0b3JlZC5cbiAgICBsZXQgYXNPYmplY3QgPSBmYWxzZVxuICAgIGlmIChpc0FycmF5KHBhcmFtZXRlcnMpKSB7XG4gICAgICBmb3IgKGNvbnN0IHsgbmFtZSwgLi4uc2NoZW1hIH0gb2YgcGFyYW1ldGVycykge1xuICAgICAgICBhZGRQYXJhbWV0ZXIobmFtZSwgc2NoZW1hKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QocGFyYW1ldGVycykpIHtcbiAgICAgIGFzT2JqZWN0ID0gdHJ1ZVxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgc2NoZW1hXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzKSkge1xuICAgICAgICBpZiAoc2NoZW1hKSB7XG4gICAgICAgICAgYWRkUGFyYW1ldGVyKG5hbWUsIHNjaGVtYSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocGFyYW1ldGVycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcmFtZXRlcnMgZGVmaW5pdGlvbjogJHtwYXJhbWV0ZXJzfWApXG4gICAgfVxuICAgIC8vIE5PVEU6IElmIHByb3BlcnRpZXMgaXMgbnVsbCwgc2NoZW1hIGFuZCB2YWxpZGF0ZSB3aWxsIGJlY29tZSBudWxsIHRvby5cbiAgICAvLyBOT1RFOiBJZiBpdCBpcyBub3QgbnVsbCwgaXQgd2lsbCBnZXQgZXhwYW5kZWQgdG8gYW4gb2JqZWN0IHNjaGVtYS5cbiAgICBjb25zdCBzY2hlbWEgPSBjb252ZXJ0U2NoZW1hKHByb3BlcnRpZXMsIG9wdGlvbnMpXG4gICAgY29uc3QgdmFsaWRhdGUgPSB0aGlzLmNvbXBpbGVWYWxpZGF0b3Ioc2NoZW1hLCB7XG4gICAgICAvLyBGb3IgcGFyYW1ldGVycywgYWx3YXlzIGNvZXJjZSB0eXBlcywgaW5jbHVkaW5nIGFycmF5cy5cbiAgICAgIGNvZXJjZVR5cGVzOiAnYXJyYXknLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0pXG4gICAgY29uc3QgY3R4ID0ge1xuICAgICAgYXBwOiB0aGlzLFxuICAgICAgdmFsaWRhdG9yOiB0aGlzLnZhbGlkYXRvcixcbiAgICAgIG9wdGlvbnNcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpc3QsXG4gICAgICBzY2hlbWEsXG4gICAgICBhc09iamVjdCxcbiAgICAgIGRhdGFOYW1lLFxuICAgICAgdmFsaWRhdGU6IHZhbGlkYXRlXG4gICAgICAgIC8vIFVzZSBgY2FsbCgpYCB0byBwYXNzIGN0eCBhcyBjb250ZXh0IHRvIEFqdiwgc2VlIHBhc3NDb250ZXh0OlxuICAgICAgICA/IGRhdGEgPT4gdmFsaWRhdGUuY2FsbChjdHgsIGRhdGEpXG4gICAgICAgIDogbnVsbFxuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZVZhbGlkYXRpb25FcnJvcih7IHR5cGUsIG1lc3NhZ2UsIGVycm9ycywgb3B0aW9ucywganNvbiB9KSB7XG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uRXJyb3Ioe1xuICAgICAgdHlwZSxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBlcnJvcnM6IHRoaXMudmFsaWRhdG9yLnBhcnNlRXJyb3JzKGVycm9ycywgb3B0aW9ucyksXG4gICAgICAvLyBPbmx5IGluY2x1ZGUgdGhlIEpTT04gZGF0YSBpbiB0aGUgZXJyb3IgaWYgYGxvZy5lcnJvcnMuanNvbmBpcyBzZXQuXG4gICAgICBqc29uOiB0aGlzLmNvbmZpZy5sb2cuZXJyb3JzPy5qc29uID8ganNvbiA6IHVuZGVmaW5lZFxuICAgIH0pXG4gIH1cblxuICBjcmVhdGVEYXRhYmFzZUVycm9yKGVycm9yKSB7XG4gICAgLy8gUmVtb3ZlIGtuZXggU1FMIHF1ZXJ5IGFuZCBtb3ZlIHRvIHNlcGFyYXRlIGBzcWxgIHByb3BlcnR5LlxuICAgIC8vIFRPRE86IEZpeCB0aGlzIHByb3Blcmx5IGluIEtuZXggLyBPYmplY3Rpb24gaW5zdGVhZCwgc2VlOlxuICAgIC8vIGh0dHBzOi8vZ2l0dGVyLmltL1ZpbmNpdC9vYmplY3Rpb24uanM/YXQ9NWE2ODcyOGY1YTllYmU0Zjc1Y2E0MGIwXG4gICAgY29uc3QgWywgc3FsLCBtZXNzYWdlXSA9IGVycm9yLm1lc3NhZ2UubWF0Y2goL14oW1xcc1xcU10qKSAtIChbXFxzXFxTXSo/KSQvKSB8fFxuICAgICAgW251bGwsIG51bGwsIGVycm9yLm1lc3NhZ2VdXG4gICAgcmV0dXJuIG5ldyBEYXRhYmFzZUVycm9yKGVycm9yLCB7XG4gICAgICBtZXNzYWdlLFxuICAgICAgLy8gT25seSBpbmNsdWRlIHRoZSBTUUwgcXVlcnkgaW4gdGhlIGVycm9yIGlmIGBsb2cuZXJyb3JzLnNxbGBpcyBzZXQuXG4gICAgICBzcWw6IHRoaXMuY29uZmlnLmxvZy5lcnJvcnM/LnNxbCA/IHNxbCA6IHVuZGVmaW5lZFxuICAgIH0pXG4gIH1cblxuICBzZXR1cEdsb2JhbE1pZGRsZXdhcmUoKSB7XG4gICAgY29uc3QgeyBhcHAsIGxvZyB9ID0gdGhpcy5jb25maWdcblxuICAgIHRoaXMudXNlKGF0dGFjaExvZ2dlcih0aGlzLmxvZ2dlcikpXG5cbiAgICBpZiAoYXBwLnJlc3BvbnNlVGltZSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudXNlKHJlc3BvbnNlVGltZShnZXRPcHRpb25zKGFwcC5yZXNwb25zZVRpbWUpKSlcbiAgICB9XG4gICAgaWYgKGxvZy5yZXF1ZXN0cykge1xuICAgICAgdGhpcy51c2UobG9nUmVxdWVzdHMoKSlcbiAgICB9XG4gICAgLy8gTmVlZHMgdG8gYmUgcG9zaXRpb25lZCBhZnRlciB0aGUgcmVxdWVzdCBsb2dnZXIgdG8gbG9nIHRoZSBjb3JyZWN0XG4gICAgLy8gcmVzcG9uc2Ugc3RhdHVzLlxuICAgIHRoaXMudXNlKGhhbmRsZUVycm9yKCkpXG4gICAgaWYgKGFwcC5oZWxtZXQgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnVzZShoZWxtZXQoZ2V0T3B0aW9ucyhhcHAuaGVsbWV0KSkpXG4gICAgfVxuICAgIGlmIChhcHAuY29ycyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudXNlKGNvcnMoZ2V0T3B0aW9ucyhhcHAuY29ycykpKVxuICAgIH1cbiAgICBpZiAoYXBwLmNvbXByZXNzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy51c2UoY29tcHJlc3MobWVyZ2UoXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBVc2UgYSByZWFzb25hYmxlIGRlZmF1bHQgZm9yIEJyb3RsaSBjb21wcmVzc2lvbi5cbiAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2tvYWpzL2NvbXByZXNzL2lzc3Vlcy8xMjZcbiAgICAgICAgICBicjoge1xuICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgIFt6bGliLmNvbnN0YW50cy5CUk9UTElfUEFSQU1fUVVBTElUWV06IDRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdldE9wdGlvbnMoYXBwLmNvbXByZXNzKVxuICAgICAgKSkpXG4gICAgfVxuICAgIGlmIChhcHAuZXRhZyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudXNlKGNvbmRpdGlvbmFsKCkpXG4gICAgICB0aGlzLnVzZShldGFnKCkpXG4gICAgfVxuICB9XG5cbiAgc2V0dXBDb250cm9sbGVyTWlkZGxld2FyZSgpIHtcbiAgICAvLyBOT1RFOiBUaGlzIGlzIG5vdCBwYXJ0IG9mIHRoZSBhdXRvbWF0aWMgYHNldHVwR2xvYmFsTWlkZGxld2FyZSgpYCBzbyB0aGF0XG4gICAgLy8gYXBwcyBjYW4gc2V0IHVwIHRoZSBzdGF0aWMgc2VydmluZyBvZiBhc3NldHMgYmVmb3JlIGluc3RhbGxpbmcgdGhlXG4gICAgLy8gc2Vzc2lvbiBhbmQgcGFzc3BvcnQgbWlkZGxld2FyZS4gSXQgaXMgY2FsbGVkIGZyb20gYGFkZENvbnRyb2xsZXIoKWAuXG4gICAgLy8gVXNlIGEgZmxhZyB0byBvbmx5IGluc3RhbGwgdGhlIG1pZGRsZXdhcmUgb25jZTpcbiAgICBpZiAoIXRoaXMuaGFzQ29udHJvbGxlck1pZGRsZXdhcmUpIHtcbiAgICAgIGNvbnN0IHsgYXBwIH0gPSB0aGlzLmNvbmZpZ1xuICAgICAgLy8gU2VxdWVuY2UgaXMgaW1wb3J0YW50OlxuICAgICAgLy8gMS4gYm9keSBwYXJzZXJcbiAgICAgIHRoaXMudXNlKGJvZHlQYXJzZXIoZ2V0T3B0aW9ucyhhcHAuYm9keVBhcnNlcikpKVxuICAgICAgLy8gMi4gZmluZCByb3V0ZSBmcm9tIHJvdXRlcyBpbnN0YWxsZWQgYnkgY29udHJvbGxlcnMuXG4gICAgICB0aGlzLnVzZShmaW5kUm91dGUodGhpcy5yb3V0ZXIpKVxuICAgICAgLy8gMy4gcmVzcGVjdCB0cmFuc2FjdGVkIHNldHRpbmdzLCBjcmVhdGUgYW5kIGhhbmRsZSB0cmFuc2FjdGlvbnMuXG4gICAgICB0aGlzLnVzZShjcmVhdGVUcmFuc2FjdGlvbigpKVxuICAgICAgLy8gNC4gc2Vzc2lvblxuICAgICAgaWYgKGFwcC5zZXNzaW9uKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBtb2RlbENsYXNzLFxuICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgfSA9IGdldE9wdGlvbnMoYXBwLnNlc3Npb24pXG4gICAgICAgIGlmIChtb2RlbENsYXNzKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGEgQ29udGV4dFN0b3JlIHRoYXQgcmVzb2x2ZWQgdGhlIHNwZWNpZmllZCBtb2RlbCBjbGFzcyxcbiAgICAgICAgICAvLyB1c2VzIGl0IHRvIHBlcnNpc3QgYW5kIHJldHJpZXZlIHRoZSBzZXNzaW9uLCBhbmQgYXV0b21hdGljYWxseVxuICAgICAgICAgIC8vIGJpbmRzIGFsbCBkYiBvcGVyYXRpb25zIHRvIGBjdHgudHJhbnNhY3Rpb25gLCBpZiBpdCBpcyBzZXQuXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXBcbiAgICAgICAgICBvcHRpb25zLkNvbnRleHRTdG9yZSA9IFNlc3Npb25TdG9yZShtb2RlbENsYXNzKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlKHNlc3Npb24ob3B0aW9ucywgdGhpcykpXG4gICAgICB9XG4gICAgICAvLyA1LiBwYXNzcG9ydFxuICAgICAgaWYgKGFwcC5wYXNzcG9ydCkge1xuICAgICAgICB0aGlzLnVzZShwYXNzcG9ydC5pbml0aWFsaXplKCkpXG4gICAgICAgIGlmIChhcHAuc2Vzc2lvbikge1xuICAgICAgICAgIHRoaXMudXNlKHBhc3Nwb3J0LnNlc3Npb24oKSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZShoYW5kbGVVc2VyKCkpXG4gICAgICB9XG5cbiAgICAgIC8vIDYuIGZpbmFsbHkgaGFuZGxlIHRoZSBmb3VuZCByb3V0ZSwgb3Igc2V0IHN0YXR1cyAvIGFsbG93IGFjY29yZGluZ2x5LlxuICAgICAgdGhpcy51c2UoaGFuZGxlUm91dGUoKSlcbiAgICAgIHRoaXMuaGFzQ29udHJvbGxlck1pZGRsZXdhcmUgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgc2V0dXBMb2dnZXIoKSB7XG4gICAgY29uc3QgeyBlcnIsIHJlcSwgcmVzIH0gPSBwaW5vLnN0ZFNlcmlhbGl6ZXJzXG4gICAgLy8gT25seSBpbmNsdWRlIGBpZGAgZnJvbSB0aGUgdXNlciwgdG8gbm90IGluYWR2ZXJ0ZW50bHkgbG9nIFBJSS5cbiAgICBjb25zdCB1c2VyID0gdXNlciA9PiAoeyBpZDogdXNlci5pZCB9KVxuICAgIGNvbnN0IHNlcmlhbGl6ZXJzID0geyBlcnIsIHJlcSwgcmVzLCB1c2VyIH1cblxuICAgIGNvbnN0IGxvZ2dlciA9IHBpbm8obWVyZ2UoXG4gICAgICB7XG4gICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgIHNlcmlhbGl6ZXJzLFxuICAgICAgICBwcmV0dHlQcmludDoge1xuICAgICAgICAgIC8vIExpc3Qgb2Yga2V5cyB0byBpZ25vcmUgaW4gcHJldHR5IG1vZGUuXG4gICAgICAgICAgaWdub3JlOiAncmVxLHJlcyxkdXJhdGlvbk1zLHVzZXIscmVxdWVzdElkJyxcbiAgICAgICAgICAvLyBTWVMgdG8gdXNlIHN5c3RlbSB0aW1lIGFuZCBub3QgVVRDLlxuICAgICAgICAgIHRyYW5zbGF0ZVRpbWU6ICdTWVM6SEg6TU06c3MubCdcbiAgICAgICAgfSxcbiAgICAgICAgLy8gUmVkYWN0IGNvbW1vbiBzZW5zaXRpdmUgaGVhZGVycy5cbiAgICAgICAgcmVkYWN0OiBbXG4gICAgICAgICAgJyouaGVhZGVyc1tcImNvb2tpZVwiXScsXG4gICAgICAgICAgJyouaGVhZGVyc1tcInNldC1jb29raWVcIl0nLFxuICAgICAgICAgICcqLmhlYWRlcnNbXCJhdXRob3JpemF0aW9uXCJdJ1xuICAgICAgICBdLFxuICAgICAgICBiYXNlOiBudWxsIC8vIG5vIHBpZCxob3N0bmFtZSxuYW1lXG4gICAgICB9LFxuICAgICAgZ2V0T3B0aW9ucyh0aGlzLmNvbmZpZy5sb2dnZXIpXG4gICAgKSlcblxuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyLmNoaWxkKHsgbmFtZTogJ2FwcCcgfSlcbiAgfVxuXG4gIHNldHVwS25leCgpIHtcbiAgICBsZXQgeyBrbmV4LCBsb2cgfSA9IHRoaXMuY29uZmlnXG4gICAgaWYgKGtuZXg/LmNsaWVudCkge1xuICAgICAgY29uc3Qgc25ha2VDYXNlT3B0aW9ucyA9IGtuZXgubm9ybWFsaXplRGJOYW1lcyA9PT0gdHJ1ZVxuICAgICAgICA/IHt9XG4gICAgICAgIDoga25leC5ub3JtYWxpemVEYk5hbWVzXG4gICAgICBpZiAoc25ha2VDYXNlT3B0aW9ucykge1xuICAgICAgICBrbmV4ID0ge1xuICAgICAgICAgIC4uLmtuZXgsXG4gICAgICAgICAgLi4ua25leFNuYWtlQ2FzZU1hcHBlcnMoc25ha2VDYXNlT3B0aW9ucylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5rbmV4ID0gS25leChrbmV4KVxuICAgICAgLy8gU3VwcG9ydCBQb3N0Z3JlU1FMIHR5cGUgcGFyc2VyIG1hcHBpbmdzIGluIHRoZSBjb25maWcuXG4gICAgICBpZiAoa25leC5jbGllbnQgPT09ICdwb3N0Z3Jlc3FsJyAmJiBrbmV4LnR5cGVQYXJzZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW3R5cGUsIHBhcnNlcl0gb2YgT2JqZWN0LmVudHJpZXMoa25leC50eXBlUGFyc2VycykpIHtcbiAgICAgICAgICB0aGlzLmtuZXguY2xpZW50LmRyaXZlci50eXBlcy5zZXRUeXBlUGFyc2VyKHR5cGUsIHBhcnNlcilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxvZy5zcWwpIHtcbiAgICAgICAgdGhpcy5zZXR1cEtuZXhMb2dnaW5nKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXR1cEtuZXhMb2dnaW5nKCkge1xuICAgIGNvbnN0IHN0YXJ0VGltZXMgPSB7fVxuICAgIGNvbnN0IGxvZ2dlciA9IHRoaXMubG9nZ2VyLmNoaWxkKHsgbmFtZTogJ3NxbCcgfSlcbiAgICBmdW5jdGlvbiBlbmQocXVlcnksIHsgcmVzcG9uc2UsIGVycm9yIH0pIHtcbiAgICAgIGNvbnN0IGlkID0gcXVlcnkuX19rbmV4UXVlcnlVaWRcbiAgICAgIGNvbnN0IGRpZmYgPSBwcm9jZXNzLmhydGltZShzdGFydFRpbWVzW2lkXSlcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gZGlmZlswXSAqIDFlMyArIGRpZmZbMV0gLyAxZTZcbiAgICAgIGRlbGV0ZSBzdGFydFRpbWVzW2lkXVxuICAgICAgY29uc3QgeyBzcWwsIGJpbmRpbmdzIH0gPSBxdWVyeVxuICAgICAgcmVzcG9uc2UgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHJlc3BvbnNlKS5maWx0ZXIoXG4gICAgICAgICAgKFtrZXldKSA9PiAha2V5LnN0YXJ0c1dpdGgoJ18nKVxuICAgICAgICApXG4gICAgICApXG4gICAgICBsb2dnZXIuaW5mbyh7IGR1cmF0aW9uLCBiaW5kaW5ncywgcmVzcG9uc2UsIGVycm9yIH0sIHNxbClcbiAgICB9XG5cbiAgICB0aGlzLmtuZXhcbiAgICAgIC5vbigncXVlcnknLCBxdWVyeSA9PiB7XG4gICAgICAgIHN0YXJ0VGltZXNbcXVlcnkuX19rbmV4UXVlcnlVaWRdID0gcHJvY2Vzcy5ocnRpbWUoKVxuICAgICAgfSlcbiAgICAgIC5vbigncXVlcnktcmVzcG9uc2UnLCAocmVzcG9uc2UsIHF1ZXJ5KSA9PiB7XG4gICAgICAgIGVuZChxdWVyeSwgeyByZXNwb25zZSB9KVxuICAgICAgfSlcbiAgICAgIC5vbigncXVlcnktZXJyb3InLCAoZXJyb3IsIHF1ZXJ5KSA9PiB7XG4gICAgICAgIGVuZChxdWVyeSwgeyBlcnJvciB9KVxuICAgICAgfSlcbiAgfVxuXG4gIG5vcm1hbGl6ZUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICAgIHJldHVybiB0aGlzLmtuZXguY2xpZW50LndyYXBJZGVudGlmaWVyKGlkZW50aWZpZXIpLnJlcGxhY2UoL1snYFwiXS9nLCAnJylcbiAgfVxuXG4gIGRlbm9ybWFsaXplSWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gICAgY29uc3Qgb2JqID0gdGhpcy5rbmV4LmNsaWVudC5wb3N0UHJvY2Vzc1Jlc3BvbnNlKHsgW2lkZW50aWZpZXJdOiAxIH0pXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iailbMF1cbiAgfVxuXG4gIG5vcm1hbGl6ZVBhdGgocGF0aCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5hcHAubm9ybWFsaXplUGF0aHMgPyBoeXBoZW5hdGUocGF0aCkgOiBwYXRoXG4gIH1cblxuICBmb3JtYXRFcnJvcihlcnIpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gZXJyLnRvSlNPTlxuICAgICAgPyBmb3JtYXRKc29uKGVyci50b0pTT04oKSlcbiAgICAgIDogZXJyLm1lc3NhZ2UgfHwgZXJyXG4gICAgY29uc3Qgc3RyID0gYCR7ZXJyLm5hbWV9OiAke21lc3NhZ2V9YFxuICAgIHJldHVybiBlcnIuc3RhY2sgJiYgdGhpcy5jb25maWcubG9nLmVycm9ycz8uc3RhY2sgIT09IGZhbHNlXG4gICAgICA/IGAke3N0cn1cXG4ke2Vyci5zdGFjay5zcGxpdCgvXFxufFxcclxcbnxcXHIvKS5zbGljZSgxKS5qb2luKG9zLkVPTCl9YFxuICAgICAgOiBzdHJcbiAgfVxuXG4gIGxvZ0Vycm9yKGVyciwgY3R4KSB7XG4gICAgaWYgKCFlcnIuZXhwb3NlICYmICF0aGlzLnNpbGVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMuZm9ybWF0RXJyb3IoZXJyKVxuICAgICAgICBjb25zdCBsZXZlbCA9XG4gICAgICAgICAgZXJyIGluc3RhbmNlb2YgUmVzcG9uc2VFcnJvciAmJiBlcnIuc3RhdHVzIDwgNTAwID8gJ2luZm8nIDogJ2Vycm9yJ1xuICAgICAgICBjb25zdCBsb2dnZXIgPSBjdHg/LmxvZ2dlciB8fCB0aGlzLmxvZ2dlclxuICAgICAgICBsb2dnZXJbbGV2ZWxdKHRleHQpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCBsb2cgZXJyb3InLCBlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5sb2cuZXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5vbignZXJyb3InLCB0aGlzLmxvZ0Vycm9yKVxuICAgIH1cbiAgICBhd2FpdCB0aGlzLmVtaXQoJ2JlZm9yZTpzdGFydCcpXG4gICAgYXdhaXQgdGhpcy5mb3JFYWNoU2VydmljZShzZXJ2aWNlID0+IHNlcnZpY2Uuc3RhcnQoKSlcbiAgICBjb25zdCB7XG4gICAgICBzZXJ2ZXI6IHsgaG9zdCwgcG9ydCB9LFxuICAgICAgZW52XG4gICAgfSA9IHRoaXMuY29uZmlnXG4gICAgdGhpcy5zZXJ2ZXIgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzZXJ2ZXIgPSB0aGlzLmxpc3Rlbihwb3J0LCBob3N0LCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcG9ydCB9ID0gc2VydmVyLmFkZHJlc3MoKVxuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgYCR7ZW52fSBzZXJ2ZXIgc3RhcnRlZCBhdCBodHRwOi8vJHtob3N0fToke3BvcnR9YFxuICAgICAgICApXG4gICAgICAgIHJlc29sdmUoc2VydmVyKVxuICAgICAgfSlcbiAgICAgIGlmICghc2VydmVyKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFVuYWJsZSB0byBzdGFydCBzZXJ2ZXIgYXQgaHR0cDovLyR7aG9zdH06JHtwb3J0fWApKVxuICAgICAgfVxuICAgIH0pXG4gICAgYXdhaXQgdGhpcy5lbWl0KCdhZnRlcjpzdGFydCcpXG4gIH1cblxuICBhc3luYyBzdG9wKCkge1xuICAgIGF3YWl0IHRoaXMuZW1pdCgnYmVmb3JlOnN0b3AnKVxuICAgIHRoaXMuc2VydmVyID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgeyBzZXJ2ZXIgfSA9IHRoaXNcbiAgICAgIGlmIChzZXJ2ZXIpIHtcbiAgICAgICAgc2VydmVyLmNsb3NlKGVyciA9PiB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZShudWxsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLy8gSGFjayB0byBtYWtlIHN1cmUgdGhhdCB3ZSBjbG9zZSB0aGUgc2VydmVyLFxuICAgICAgICAvLyAgZXZlbiBpZiBzb2NrZXRzIGFyZSBzdGlsbCBvcGVuLlxuICAgICAgICAvLyAgVGFrZW4gZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzY4MzAwNzIuXG4gICAgICAgIC8vICBBIHByb3BlciBzb2x1dGlvbiB3b3VsZCBiZSB0byB1c2UgYSBsaWJyYXJ5LCBleDogaHR0cHM6Ly9naXRodWIuY29tL2dvZGFkZHkvdGVybWludXNcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHNlcnZlci5lbWl0KCdjbG9zZScpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignU2VydmVyIGlzIG5vdCBydW5uaW5nJykpXG4gICAgICB9XG4gICAgfSlcbiAgICBhd2FpdCB0aGlzLmZvckVhY2hTZXJ2aWNlKHNlcnZpY2UgPT4gc2VydmljZS5zdG9wKCkpXG4gICAgYXdhaXQgdGhpcy5lbWl0KCdhZnRlcjpzdG9wJylcbiAgICBpZiAodGhpcy5jb25maWcubG9nLmVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMub2ZmKCdlcnJvcicsIHRoaXMubG9nRXJyb3IpXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRPckV4aXQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnQoKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2dFcnJvcihlcnIpXG4gICAgICBwcm9jZXNzLmV4aXQoLTEpXG4gICAgfVxuICB9XG5cbiAgLy8gQXNzZXRzIGhhbmRsaW5nXG5cbiAgYXN5bmMgY3JlYXRlQXNzZXRzKHN0b3JhZ2UsIGZpbGVzLCBjb3VudCA9IDAsIHRyeCA9IG51bGwpIHtcbiAgICBjb25zdCBBc3NldE1vZGVsID0gdGhpcy5nZXRNb2RlbCgnQXNzZXQnKVxuICAgIGlmIChBc3NldE1vZGVsKSB7XG4gICAgICBjb25zdCBhc3NldHMgPSBmaWxlcy5tYXAoZmlsZSA9PiAoe1xuICAgICAgICBrZXk6IGZpbGUua2V5LFxuICAgICAgICBmaWxlLFxuICAgICAgICBzdG9yYWdlOiBzdG9yYWdlLm5hbWUsXG4gICAgICAgIGNvdW50XG4gICAgICB9KSlcbiAgICAgIHJldHVybiBBc3NldE1vZGVsXG4gICAgICAgIC5xdWVyeSh0cngpXG4gICAgICAgIC5pbnNlcnQoYXNzZXRzKVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgYXN5bmMgaGFuZGxlQWRkZGVkQW5kUmVtb3ZlZEFzc2V0cyhcbiAgICBzdG9yYWdlLFxuICAgIGFkZGVkRmlsZXMsXG4gICAgcmVtb3ZlZEZpbGVzLFxuICAgIHRyeCA9IG51bGxcbiAgKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXNzZXRzOiB7XG4gICAgICAgIGNsZWFudXBUaW1lVGhyZXNob2xkID0gMFxuICAgICAgfSA9IHt9XG4gICAgfSA9IHRoaXMuY29uZmlnXG4gICAgLy8gT25seSByZW1vdmUgdW51c2VkIGFzc2V0cyB0aGF0IGhhdmVuJ3Qgc2VlbiBjaGFuZ2VzIGZvciBnaXZlbiB0aW1lZnJhbWUuXG4gICAgY29uc3QgdGltZVRocmVzaG9sZCA9IGlzU3RyaW5nKGNsZWFudXBUaW1lVGhyZXNob2xkKVxuICAgICAgPyBwYXJzZUR1cmF0aW9uKGNsZWFudXBUaW1lVGhyZXNob2xkKVxuICAgICAgOiBjbGVhbnVwVGltZVRocmVzaG9sZFxuXG4gICAgY29uc3QgaW1wb3J0ZWRGaWxlcyA9IFtdXG4gICAgY29uc3QgQXNzZXRNb2RlbCA9IHRoaXMuZ2V0TW9kZWwoJ0Fzc2V0JylcbiAgICBpZiAoQXNzZXRNb2RlbCkge1xuICAgICAgaW1wb3J0ZWRGaWxlcy5wdXNoKFxuICAgICAgICAuLi5hd2FpdCB0aGlzLmFkZEZvcmVpZ25Bc3NldHMoc3RvcmFnZSwgYWRkZWRGaWxlcywgdHJ4KVxuICAgICAgKVxuICAgICAgaWYgKFxuICAgICAgICBhZGRlZEZpbGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgcmVtb3ZlZEZpbGVzLmxlbmd0aCA+IDBcbiAgICAgICkge1xuICAgICAgICBjb25zdCBjaGFuZ2VDb3VudCA9IChmaWxlcywgaW5jcmVtZW50KSA9PiAoXG4gICAgICAgICAgZmlsZXMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIEFzc2V0TW9kZWwucXVlcnkodHJ4KVxuICAgICAgICAgICAgLndoZXJlSW4oJ2tleScsIGZpbGVzLm1hcChmaWxlID0+IGZpbGUua2V5KSlcbiAgICAgICAgICAgIC5pbmNyZW1lbnQoJ2NvdW50JywgaW5jcmVtZW50KVxuICAgICAgICApXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICBjaGFuZ2VDb3VudChhZGRlZEZpbGVzLCAxKSxcbiAgICAgICAgICBjaGFuZ2VDb3VudChyZW1vdmVkRmlsZXMsIC0xKVxuICAgICAgICBdKVxuICAgICAgICBpZiAodGltZVRocmVzaG9sZCA+IDApIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgLy8gRG9uJ3QgcGFzcyBgdHJ4YCBoZXJlLCBhcyB3ZSB3YW50IHRoaXMgZGVsYXllZCBleGVjdXRpb24gdG9cbiAgICAgICAgICAgIC8vIGNyZWF0ZSBpdHMgb3duIHRyYW5zYWN0aW9uLlxuICAgICAgICAgICAgKCkgPT4gdGhpcy5yZWxlYXNlVW51c2VkQXNzZXRzKHRpbWVUaHJlc2hvbGQpLFxuICAgICAgICAgICAgdGltZVRocmVzaG9sZFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQWxzbyBleGVjdXRlIHJlbGVhc2VVbnVzZWRBc3NldHMoKSBpbW1lZGlhdGVseSBpbiB0aGUgc2FtZVxuICAgICAgLy8gdHJhbnNhY3Rpb24sIHRvIHBvdGVudGlhbGx5IGNsZWFuIHVwIG90aGVyIHBlbmRpbmcgYXNzZXRzLlxuICAgICAgYXdhaXQgdGhpcy5yZWxlYXNlVW51c2VkQXNzZXRzKHRpbWVUaHJlc2hvbGQsIHRyeClcbiAgICAgIHJldHVybiBpbXBvcnRlZEZpbGVzXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWRkRm9yZWlnbkFzc2V0cyhzdG9yYWdlLCBmaWxlcywgdHJ4ID0gbnVsbCkge1xuICAgIGNvbnN0IGltcG9ydGVkRmlsZXMgPSBbXVxuICAgIGNvbnN0IEFzc2V0TW9kZWwgPSB0aGlzLmdldE1vZGVsKCdBc3NldCcpXG4gICAgaWYgKEFzc2V0TW9kZWwpIHtcbiAgICAgIC8vIEZpbmQgbWlzc2luZyBhc3NldHMgKGNvcGllZCBmcm9tIGFub3RoZXIgc3lzdGVtKSwgYW5kIGFkZCB0aGVtLlxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGZpbGVzLm1hcChhc3luYyBmaWxlID0+IHtcbiAgICAgICAgICBjb25zdCBhc3NldCA9IGF3YWl0IEFzc2V0TW9kZWwucXVlcnkodHJ4KS5maW5kT25lKCdrZXknLCBmaWxlLmtleSlcbiAgICAgICAgICBpZiAoIWFzc2V0KSB7XG4gICAgICAgICAgICBpZiAoZmlsZS5kYXRhIHx8IGZpbGUudXJsKSB7XG4gICAgICAgICAgICAgIGxldCB7IGRhdGEgfSA9IGZpbGVcbiAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgICAgICAgYCR7XG4gICAgICAgICAgICAgICAgICAgIHBpY28ucmVkKCdJTkZPOicpXG4gICAgICAgICAgICAgICAgICB9IEFzc2V0ICR7XG4gICAgICAgICAgICAgICAgICAgIHBpY28uZ3JlZW4oYCcke2ZpbGUubmFtZX0nYClcbiAgICAgICAgICAgICAgICAgIH0gaXMgZnJvbSBhIGZvcmVpZ24gc291cmNlLCBmZXRjaGluZyBmcm9tICR7XG4gICAgICAgICAgICAgICAgICAgIHBpY28uZ3JlZW4oYCcke2ZpbGUudXJsfSdgKVxuICAgICAgICAgICAgICAgICAgfSBhbmQgYWRkaW5nIHRvIHN0b3JhZ2UgJHtcbiAgICAgICAgICAgICAgICAgICAgcGljby5ncmVlbihgJyR7c3RvcmFnZS5uYW1lfSdgKVxuICAgICAgICAgICAgICAgICAgfS4uLmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5yZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ2dldCcsXG4gICAgICAgICAgICAgICAgICB1cmw6IGZpbGUudXJsLFxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBkYXRhID0gcmVzcG9uc2UuZGF0YVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGltcG9ydGVkRmlsZSA9IGF3YWl0IHN0b3JhZ2UuYWRkRmlsZShmaWxlLCBkYXRhKVxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZUFzc2V0cyhzdG9yYWdlLCBbaW1wb3J0ZWRGaWxlXSwgMCwgdHJ4KVxuICAgICAgICAgICAgICAvLyBNZXJnZSBiYWNrIHRoZSBjaGFuZ2VkIGZpbGUgcHJvcGVydGllcyBpbnRvIHRoZSBhY3R1YWwgZmlsZXNcbiAgICAgICAgICAgICAgLy8gb2JqZWN0LCBzbyB0aGF0IHRoZSBkYXRhIGZyb20gdGhlIHN0YXRpYyBtb2RlbCBob29rIGNhbiBiZSB1c2VkXG4gICAgICAgICAgICAgIC8vIGRpcmVjdGx5IGZvciB0aGUgYWN0dWFsIHJ1bm5pbmcgcXVlcnkuXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZmlsZSwgaW1wb3J0ZWRGaWxlKVxuICAgICAgICAgICAgICBpbXBvcnRlZEZpbGVzLnB1c2goaW1wb3J0ZWRGaWxlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2V0RXJyb3IoXG4gICAgICAgICAgICAgICAgYFVuYWJsZSB0byBpbXBvcnQgYXNzZXQgZnJvbSBmb3JlaWduIHNvdXJjZTogJyR7XG4gICAgICAgICAgICAgICAgICBmaWxlLm5hbWVcbiAgICAgICAgICAgICAgICB9JyAoJyR7XG4gICAgICAgICAgICAgICAgICBmaWxlLmtleVxuICAgICAgICAgICAgICAgIH0nKWBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBc3NldCBpcyBmcm9tIGEgZm9yZWlnbiBzb3VyY2UsIGJ1dCB3YXMgYWxyZWFkeSBpbXBvcnRlZCBhbmQgY2FuXG4gICAgICAgICAgICAvLyBiZSByZXVzZWQuIFNlZSBhYm92ZSBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhpcyBtZXJnZS5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZmlsZSwgYXNzZXQuZmlsZSlcbiAgICAgICAgICAgIC8vIE5PVEU6IE5vIG5lZWQgdG8gYWRkIGBmaWxlYCB0byBgaW1wb3J0ZWRGaWxlc2AsIHNpbmNlIGl0J3NcbiAgICAgICAgICAgIC8vIGFscmVhZHkgYmVlbiBpbXBvcnRlZCB0byB0aGUgc3RvcmFnZSBiZWZvcmUuXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gaW1wb3J0ZWRGaWxlc1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlTW9kaWZpZWRBc3NldHMoc3RvcmFnZSwgZmlsZXMsIHRyeCA9IG51bGwpIHtcbiAgICBjb25zdCBtb2RpZmllZEZpbGVzID0gW11cbiAgICBjb25zdCBBc3NldE1vZGVsID0gdGhpcy5nZXRNb2RlbCgnQXNzZXQnKVxuICAgIGlmIChBc3NldE1vZGVsKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZmlsZXMubWFwKGFzeW5jIGZpbGUgPT4ge1xuICAgICAgICAgIGlmIChmaWxlLmRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGFzc2V0ID0gYXdhaXQgQXNzZXRNb2RlbC5xdWVyeSh0cngpLmZpbmRPbmUoJ2tleScsIGZpbGUua2V5KVxuICAgICAgICAgICAgaWYgKGFzc2V0KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNoYW5nZWRGaWxlID0gYXdhaXQgc3RvcmFnZS5hZGRGaWxlKGZpbGUsIGZpbGUuZGF0YSlcbiAgICAgICAgICAgICAgLy8gTWVyZ2UgYmFjayB0aGUgY2hhbmdlZCBmaWxlIHByb3BlcnRpZXMgaW50byB0aGUgYWN0dWFsIGZpbGVzXG4gICAgICAgICAgICAgIC8vIG9iamVjdCwgc28gdGhhdCB0aGUgZGF0YSBmcm9tIHRoZSBzdGF0aWMgbW9kZWwgaG9vayBjYW4gYmUgdXNlZFxuICAgICAgICAgICAgICAvLyBkaXJlY3RseSBmb3IgdGhlIGFjdHVhbCBydW5uaW5nIHF1ZXJ5LlxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGZpbGUsIGNoYW5nZWRGaWxlKVxuICAgICAgICAgICAgICBtb2RpZmllZEZpbGVzLnB1c2goY2hhbmdlZEZpbGUpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIHVwZGF0ZSBtb2RpZmllZCBhc3NldCBmcm9tIG1lbW9yeSBzb3VyY2U6ICcke1xuICAgICAgICAgICAgICAgICAgZmlsZS5uYW1lXG4gICAgICAgICAgICAgICAgfScgKCcke1xuICAgICAgICAgICAgICAgICAgZmlsZS5rZXlcbiAgICAgICAgICAgICAgICB9JylgXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBtb2RpZmllZEZpbGVzXG4gIH1cblxuICBhc3luYyByZWxlYXNlVW51c2VkQXNzZXRzKHRpbWVUaHJlc2hvbGQgPSAwLCB0cnggPSBudWxsKSB7XG4gICAgY29uc3QgQXNzZXRNb2RlbCA9IHRoaXMuZ2V0TW9kZWwoJ0Fzc2V0JylcbiAgICBpZiAoQXNzZXRNb2RlbCkge1xuICAgICAgcmV0dXJuIEFzc2V0TW9kZWwudHJhbnNhY3Rpb24odHJ4LCBhc3luYyB0cnggPT4ge1xuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIHRpbWUgdGhyZXNob2xkIGluIEpTIGluc3RlYWQgb2YgU1FMLCBhcyB0aGVyZSBpcyBub1xuICAgICAgICAvLyBlYXN5IGNyb3NzLVNRTCB3YXkgdG8gZG8gYG5vdygpIC0gaW50ZXJ2YWwgWCBob3Vyc2A6XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpXG4gICAgICAgIGRhdGUuc2V0TWlsbGlzZWNvbmRzKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkgLSB0aW1lVGhyZXNob2xkKVxuICAgICAgICBjb25zdCBvcnBoYW5lZEFzc2V0cyA9IGF3YWl0IEFzc2V0TW9kZWxcbiAgICAgICAgICAucXVlcnkodHJ4KVxuICAgICAgICAgIC53aGVyZSgnY291bnQnLCAwKVxuICAgICAgICAgIC5hbmRXaGVyZSgndXBkYXRlZEF0JywgJzw9JywgZGF0ZSlcbiAgICAgICAgICAvLyBQcm90ZWN0IGZyZXNobHkgY3JlYXRlZCBhc3NldHMgZnJvbSBiZWluZyBkZWxldGVkIGFnYWluIHJpZ2h0IGF3YXksXG4gICAgICAgICAgLy8gLmUuZy4gd2hlbiBgY29uZmlnLmFzc2V0cy5jbGVhbnVwVGltZVRocmVzaG9sZCA9IDBgXG4gICAgICAgICAgLmFuZFdoZXJlKCd1cGRhdGVkQXQnLCAnPicsIHJlZignY3JlYXRlZEF0JykpXG4gICAgICAgIGlmIChvcnBoYW5lZEFzc2V0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3Qgb3JwaGFuZWRLZXlzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBvcnBoYW5lZEFzc2V0cy5tYXAoYXN5bmMgYXNzZXQgPT4ge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0U3RvcmFnZShhc3NldC5zdG9yYWdlKS5yZW1vdmVGaWxlKGFzc2V0LmZpbGUpXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKVxuICAgICAgICAgICAgICAgIGFzc2V0LmVycm9yID0gZXJyb3JcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gYXNzZXQua2V5XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgICBhd2FpdCBBc3NldE1vZGVsXG4gICAgICAgICAgICAucXVlcnkodHJ4KVxuICAgICAgICAgICAgLmRlbGV0ZSgpXG4gICAgICAgICAgICAud2hlcmVJbigna2V5Jywgb3JwaGFuZWRLZXlzKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcnBoYW5lZEFzc2V0c1xuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuLy8gT3ZlcnJpZGUgS29hJ3MgZXZlbnRzIHdpdGggb3VyIG93biBFdmVudEVtaXR0ZXIgdGhhdCBhZGRzIHN1cHBvcnQgZm9yXG4vLyBhc3luY2hyb25vdXMgZXZlbnRzLlxuRXZlbnRFbWl0dGVyLm1peGluKEFwcGxpY2F0aW9uLnByb3RvdHlwZSlcblxuZnVuY3Rpb24gZ2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gIHJldHVybiBpc09iamVjdChvcHRpb25zKSA/IG9wdGlvbnMgOiB7fVxufVxuIl19
961
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHAvQXBwbGljYXRpb24uanMiXSwibmFtZXMiOlsiQXBwbGljYXRpb24iLCJLb2EiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsInZhbGlkYXRvciIsInJvdXRlciIsImV2ZW50cyIsIm1pZGRsZXdhcmUiLCJtb2RlbHMiLCJzZXJ2aWNlcyIsImNvbnRyb2xsZXJzIiwiX3NldHVwRW1pdHRlciIsImFwcCIsImtleXMiLCJsb2ciLCJyZXN0Iiwic2lsZW50IiwicHJvY2VzcyIsImVudiIsIkRJVE9fU0lMRU5UIiwicHJveHkiLCJWYWxpZGF0b3IiLCJSb3V0ZXIiLCJzdG9yYWdlcyIsIk9iamVjdCIsImNyZWF0ZSIsImhhc0NvbnRyb2xsZXJNaWRkbGV3YXJlIiwic2V0dXBMb2dnZXIiLCJzZXR1cEtuZXgiLCJzZXR1cEdsb2JhbE1pZGRsZXdhcmUiLCJ1c2UiLCJhZGRTdG9yYWdlcyIsImFkZE1vZGVscyIsImFkZFNlcnZpY2VzIiwiYWRkQ29udHJvbGxlcnMiLCJhZGRSb3V0ZSIsInZlcmIiLCJwYXRoIiwidHJhbnNhY3RlZCIsImhhbmRsZXJzIiwiY29udHJvbGxlciIsImFjdGlvbiIsImhhbmRsZXIiLCJsZW5ndGgiLCJyb3V0ZSIsIm1vZGVsQ2xhc3MiLCJ2YWx1ZXMiLCJhZGRNb2RlbCIsInNvcnRNb2RlbHMiLCJzb3J0ZWRNb2RlbHMiLCJmaWx0ZXIiLCJuYW1lIiwic2V0dXAiLCJrbmV4IiwiaW5pdGlhbGl6ZSIsImFkZFNjaGVtYSIsImdldEpzb25TY2hlbWEiLCJzY2hlbWEiLCJyZWxhdGlvbnMiLCJzaG91bGRMb2ciLCJvcHRpb24iLCJpbmNsdWRlcyIsImRhdGEiLCJyZWxhdGlvbk1hcHBpbmdzIiwidmFsdWUiLCJNb2RlbCIsImlzUHJvdG90eXBlT2YiLCJjb25zb2xlIiwiaW5mbyIsInBpY28iLCJ5ZWxsb3ciLCJib2xkIiwidXRpbCIsImluc3BlY3QiLCJjb2xvcnMiLCJkZXB0aCIsIm1heEFycmF5TGVuZ3RoIiwiRXJyb3IiLCJzb3J0QnlSZWxhdGlvbnMiLCJsaXN0IiwiY29sbGVjdGVkIiwiZXhjbHVkZWQiLCJyZWxhdGlvbiIsImdldFJlbGF0aW9ucyIsIkJlbG9uZ3NUb09uZVJlbGF0aW9uIiwicmVsYXRlZE1vZGVsQ2xhc3MiLCJqb2luVGFibGVNb2RlbENsYXNzIiwicmVsYXRlZCIsInJldmVyc2UiLCJyZWR1Y2UiLCJnZXRNb2RlbCIsImVuZHNXaXRoIiwiZmluZE1vZGVsIiwiY2FsbGJhY2siLCJmaW5kIiwic2VydmljZSIsImVudHJpZXMiLCJhZGRTZXJ2aWNlIiwiU2VydmljZSIsInVuZGVmaW5lZCIsImdldFNlcnZpY2UiLCJmaW5kU2VydmljZSIsImZvckVhY2hTZXJ2aWNlIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsIm5hbWVzcGFjZSIsImtleSIsImFkZENvbnRyb2xsZXIiLCJzZXR1cENvbnRyb2xsZXJNaWRkbGV3YXJlIiwiQ29udHJvbGxlciIsInVybCIsImNvbXBvc2UiLCJnZXRDb250cm9sbGVyIiwiZmluZENvbnRyb2xsZXIiLCJnZXRBZG1pbkNvbnRyb2xsZXIiLCJBZG1pbkNvbnRyb2xsZXIiLCJnZXRBZG1pblZ1ZUNvbmZpZyIsImdldFZ1ZUNvbmZpZyIsImdldEFzc2V0Q29uZmlnIiwibm9ybWFsaXplRGJOYW1lcyIsImFzc2V0Q29uZmlnIiwibW9kZWxOYW1lIiwiYXNzZXRzIiwiZGVmaW5pdGlvbiIsIm5vcm1hbGl6ZWRNb2RlbE5hbWUiLCJub3JtYWxpemVJZGVudGlmaWVyIiwiY29udmVydGVkQXNzZXRzIiwiYXNzZXREYXRhUGF0aCIsInByb3BlcnR5IiwibmVzdGVkRGF0YVBhdGgiLCJpbmRleCIsImdldFByb3BlcnR5T3JSZWxhdGlvbkF0RGF0YVBhdGgiLCJub3JtYWxpemVkTmFtZSIsImRhdGFQYXRoIiwiYXNzZXRDb25maWdzIiwiYWRkU3RvcmFnZSIsInN0b3JhZ2UiLCJzdG9yYWdlQ2xhc3MiLCJTdG9yYWdlIiwiZ2V0IiwidHlwZSIsImdldFN0b3JhZ2UiLCJjb21waWxlVmFsaWRhdG9yIiwianNvblNjaGVtYSIsIm9wdGlvbnMiLCJjb21waWxlIiwiY29tcGlsZVBhcmFtZXRlcnNWYWxpZGF0b3IiLCJwYXJhbWV0ZXJzIiwiZGF0YU5hbWUiLCJwcm9wZXJ0aWVzIiwiYWRkUGFyYW1ldGVyIiwicHVzaCIsIm1lbWJlciIsImFzT2JqZWN0IiwidmFsaWRhdGUiLCJjb2VyY2VUeXBlcyIsImN0eCIsImNhbGwiLCJjcmVhdGVWYWxpZGF0aW9uRXJyb3IiLCJtZXNzYWdlIiwiZXJyb3JzIiwianNvbiIsIlZhbGlkYXRpb25FcnJvciIsInBhcnNlRXJyb3JzIiwiY3JlYXRlRGF0YWJhc2VFcnJvciIsImVycm9yIiwic3FsIiwibWF0Y2giLCJEYXRhYmFzZUVycm9yIiwibG9nZ2VyIiwicmVzcG9uc2VUaW1lIiwiZ2V0T3B0aW9ucyIsInJlcXVlc3RzIiwiaGVsbWV0IiwiY29ycyIsImNvbXByZXNzIiwiYnIiLCJwYXJhbXMiLCJ6bGliIiwiY29uc3RhbnRzIiwiQlJPVExJX1BBUkFNX1FVQUxJVFkiLCJldGFnIiwiYm9keVBhcnNlciIsInNlc3Npb24iLCJDb250ZXh0U3RvcmUiLCJwYXNzcG9ydCIsImVyciIsInJlcSIsInJlcyIsInBpbm8iLCJzdGRTZXJpYWxpemVycyIsInVzZXIiLCJpZCIsInNlcmlhbGl6ZXJzIiwibGV2ZWwiLCJwcmV0dHlQcmludCIsImlnbm9yZSIsInRyYW5zbGF0ZVRpbWUiLCJyZWRhY3QiLCJiYXNlIiwiY2hpbGQiLCJjbGllbnQiLCJzbmFrZUNhc2VPcHRpb25zIiwidHlwZVBhcnNlcnMiLCJkcml2ZXIiLCJwYXJzZXIiLCJ0eXBlcyIsInNldFR5cGVQYXJzZXIiLCJzZXR1cEtuZXhMb2dnaW5nIiwic3RhcnRUaW1lcyIsImVuZCIsInF1ZXJ5IiwicmVzcG9uc2UiLCJfX2tuZXhRdWVyeVVpZCIsImRpZmYiLCJocnRpbWUiLCJkdXJhdGlvbiIsImJpbmRpbmdzIiwiZnJvbUVudHJpZXMiLCJzdGFydHNXaXRoIiwib24iLCJpZGVudGlmaWVyIiwid3JhcElkZW50aWZpZXIiLCJyZXBsYWNlIiwiZGVub3JtYWxpemVJZGVudGlmaWVyIiwib2JqIiwicG9zdFByb2Nlc3NSZXNwb25zZSIsIm5vcm1hbGl6ZVBhdGgiLCJub3JtYWxpemVQYXRocyIsImZvcm1hdEVycm9yIiwidG9KU09OIiwic3RyIiwic3RhY2siLCJzcGxpdCIsInNsaWNlIiwiam9pbiIsIm9zIiwiRU9MIiwibG9nRXJyb3IiLCJleHBvc2UiLCJ0ZXh0IiwiUmVzcG9uc2VFcnJvciIsInN0YXR1cyIsImUiLCJzdGFydCIsImVtaXQiLCJzZXJ2ZXIiLCJob3N0IiwicG9ydCIsInJlc29sdmUiLCJyZWplY3QiLCJsaXN0ZW4iLCJhZGRyZXNzIiwic3RvcCIsImNsb3NlIiwic2V0SW1tZWRpYXRlIiwib2ZmIiwic3RhcnRPckV4aXQiLCJleGl0IiwiY3JlYXRlQXNzZXRzIiwiZmlsZXMiLCJjb3VudCIsInRyeCIsIkFzc2V0TW9kZWwiLCJmaWxlIiwiaW5zZXJ0IiwiaGFuZGxlQWRkZGVkQW5kUmVtb3ZlZEFzc2V0cyIsImFkZGVkRmlsZXMiLCJyZW1vdmVkRmlsZXMiLCJjbGVhbnVwVGltZVRocmVzaG9sZCIsInRpbWVUaHJlc2hvbGQiLCJpbXBvcnRlZEZpbGVzIiwiYWRkRm9yZWlnbkFzc2V0cyIsImNoYW5nZUNvdW50IiwiaW5jcmVtZW50Iiwid2hlcmVJbiIsInNldFRpbWVvdXQiLCJyZWxlYXNlVW51c2VkQXNzZXRzIiwiYXNzZXQiLCJmaW5kT25lIiwicmVkIiwiZ3JlZW4iLCJheGlvcyIsInJlcXVlc3QiLCJtZXRob2QiLCJyZXNwb25zZVR5cGUiLCJpbXBvcnRlZEZpbGUiLCJhZGRGaWxlIiwiYXNzaWduIiwiQXNzZXRFcnJvciIsImhhbmRsZU1vZGlmaWVkQXNzZXRzIiwibW9kaWZpZWRGaWxlcyIsImNoYW5nZWRGaWxlIiwidHJhbnNhY3Rpb24iLCJkYXRlIiwiRGF0ZSIsInNldE1pbGxpc2Vjb25kcyIsImdldE1pbGxpc2Vjb25kcyIsIm9ycGhhbmVkQXNzZXRzIiwid2hlcmUiLCJhbmRXaGVyZSIsIm9ycGhhbmVkS2V5cyIsInJlbW92ZUZpbGUiLCJkZWxldGUiLCJFdmVudEVtaXR0ZXIiLCJtaXhpbiIsInByb3RvdHlwZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQU1BOztBQUNBOztBQUNBOztBQVNBOztBQUlBOzs7O0FBT08sTUFBTUEsV0FBTixTQUEwQkMsWUFBMUIsQ0FBOEI7QUFDbkNDLEVBQUFBLFdBQVcsQ0FBQztBQUNWQyxJQUFBQSxNQUFNLEdBQUcsRUFEQztBQUVWQyxJQUFBQSxTQUZVO0FBR1ZDLElBQUFBLE1BSFU7QUFJVkMsSUFBQUEsTUFKVTtBQUtWQyxJQUFBQSxVQUxVO0FBTVZDLElBQUFBLE1BTlU7QUFPVkMsSUFBQUEsUUFQVTtBQVFWQyxJQUFBQTtBQVJVLE1BU1IsRUFUTyxFQVNIO0FBQ047O0FBQ0EsU0FBS0MsYUFBTCxDQUFtQkwsTUFBbkI7O0FBQ0EsVUFBTTtBQUVKTSxNQUFBQSxHQUFHLEVBQUU7QUFBRUMsUUFBQUEsSUFBRjtBQUFRLFdBQUdEO0FBQVgsVUFBbUIsRUFGcEI7QUFHSkUsTUFBQUEsR0FBRyxHQUFHLEVBSEY7QUFJSixTQUFHQztBQUpDLFFBS0ZaLE1BTEo7QUFNQSxTQUFLQSxNQUFMLEdBQWM7QUFDWlMsTUFBQUEsR0FEWTtBQUVaRSxNQUFBQSxHQUFHLEVBQUVBLEdBQUcsQ0FBQ0UsTUFBSixJQUFjQyxPQUFPLENBQUNDLEdBQVIsQ0FBWUMsV0FBMUIsR0FBd0MsRUFBeEMsR0FBNkNMLEdBRnRDO0FBR1osU0FBR0M7QUFIUyxLQUFkO0FBS0EsU0FBS0YsSUFBTCxHQUFZQSxJQUFaO0FBQ0EsU0FBS08s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TmlCLEVBTUosR0FOSSxFQU1DLG9CQUFJLFdBQUosQ0FORCxDQUE3Qjs7QUFPQSxZQUFJRixjQUFjLENBQUNoUSxNQUFmLEdBQXdCLENBQTVCLEVBQStCO0FBQzdCLGdCQUFNbVEsWUFBWSxHQUFHLE1BQU12TSxPQUFPLENBQUNDLEdBQVIsQ0FDekJtTSxjQUFjLENBQUNsTSxHQUFmLENBQW1CLE1BQU04SyxLQUFOLElBQWU7QUFDaEMsZ0JBQUk7QUFDRixvQkFBTSxLQUFLekksVUFBTCxDQUFnQnlJLEtBQUssQ0FBQzlJLE9BQXRCLEVBQStCc0ssVUFBL0IsQ0FBMEN4QixLQUFLLENBQUNkLElBQWhELENBQU47QUFDRCxhQUZELENBRUUsT0FBT25HLEtBQVAsRUFBYztBQUNkLG1CQUFLZ0YsSUFBTCxDQUFVLE9BQVYsRUFBbUJoRixLQUFuQjtBQUNBaUgsY0FBQUEsS0FBSyxDQUFDakgsS0FBTixHQUFjQSxLQUFkO0FBQ0Q7O0FBQ0QsbUJBQU9pSCxLQUFLLENBQUM1SyxHQUFiO0FBQ0QsV0FSRCxDQUR5QixDQUEzQjtBQVdBLGdCQUFNNkosVUFBVSxDQUNicEQsS0FERyxDQUNHbUQsR0FESCxFQUVIeUMsTUFGRyxHQUdINUIsT0FIRyxDQUdLLEtBSEwsRUFHWTBCLFlBSFosQ0FBTjtBQUlEOztBQUNELGVBQU9ILGNBQVA7QUFDRCxPQTlCTSxDQUFQO0FBK0JEO0FBQ0Y7O0FBbjVCa0M7Ozs7QUF3NUJyQ00sa0JBQWFDLEtBQWIsQ0FBbUJsVCxXQUFXLENBQUNtVCxTQUEvQjs7QUFFQSxTQUFTdkksVUFBVCxDQUFvQjNCLE9BQXBCLEVBQTZCO0FBQzNCLFNBQU8sc0JBQVNBLE9BQVQsSUFBb0JBLE9BQXBCLEdBQThCLEVBQXJDO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgS29hIGZyb20gJ2tvYSdcbmltcG9ydCBLbmV4IGZyb20gJ2tuZXgnXG5pbXBvcnQgdXRpbCBmcm9tICd1dGlsJ1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJ1xuaW1wb3J0IHBpY28gZnJvbSAncGljb2NvbG9ycydcbmltcG9ydCB6bGliIGZyb20gJ3psaWInXG5pbXBvcnQgcGlubyBmcm9tICdwaW5vJ1xuaW1wb3J0IG9zIGZyb20gJ29zJ1xuaW1wb3J0IHBhcnNlRHVyYXRpb24gZnJvbSAncGFyc2UtZHVyYXRpb24nXG5pbXBvcnQgYm9keVBhcnNlciBmcm9tICdrb2EtYm9keXBhcnNlcidcbmltcG9ydCBjb3JzIGZyb20gJ0Brb2EvY29ycydcbmltcG9ydCBjb21wb3NlIGZyb20gJ2tvYS1jb21wb3NlJ1xuaW1wb3J0IGNvbXByZXNzIGZyb20gJ2tvYS1jb21wcmVzcydcbmltcG9ydCBjb25kaXRpb25hbCBmcm9tICdrb2EtY29uZGl0aW9uYWwtZ2V0J1xuaW1wb3J0IHBhc3Nwb3J0IGZyb20gJ2tvYS1wYXNzcG9ydCdcbmltcG9ydCBzZXNzaW9uIGZyb20gJ2tvYS1zZXNzaW9uJ1xuaW1wb3J0IGV0YWcgZnJvbSAna29hLWV0YWcnXG5pbXBvcnQgaGVsbWV0IGZyb20gJ2tvYS1oZWxtZXQnXG5pbXBvcnQgcmVzcG9uc2VUaW1lIGZyb20gJ2tvYS1yZXNwb25zZS10aW1lJ1xuaW1wb3J0IFJvdXRlciBmcm9tICdAZGl0b2pzL3JvdXRlcidcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0AvbGliJ1xuaW1wb3J0IHsgQ29udHJvbGxlciwgQWRtaW5Db250cm9sbGVyIH0gZnJvbSAnQC9jb250cm9sbGVycydcbmltcG9ydCB7IFNlcnZpY2UgfSBmcm9tICdAL3NlcnZpY2VzJ1xuaW1wb3J0IHsgU3RvcmFnZSB9IGZyb20gJ0Avc3RvcmFnZSdcbmltcG9ydCB7IGNvbnZlcnRTY2hlbWEgfSBmcm9tICdAL3NjaGVtYSdcbmltcG9ydCB7IGZvcm1hdEpzb24gfSBmcm9tICdAL3V0aWxzJ1xuaW1wb3J0IHtcbiAgUmVzcG9uc2VFcnJvcixcbiAgVmFsaWRhdGlvbkVycm9yLFxuICBEYXRhYmFzZUVycm9yLFxuICBBc3NldEVycm9yXG59IGZyb20gJ0AvZXJyb3JzJ1xuaW1wb3J0IFNlc3Npb25TdG9yZSBmcm9tICcuL1Nlc3Npb25TdG9yZSdcbmltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gJy4vVmFsaWRhdG9yJ1xuaW1wb3J0IHtcbiAgYXR0YWNoTG9nZ2VyLFxuICBjcmVhdGVUcmFuc2FjdGlvbixcbiAgZmluZFJvdXRlLFxuICBoYW5kbGVFcnJvcixcbiAgaGFuZGxlUm91dGUsXG4gIGhhbmRsZVVzZXIsXG4gIGxvZ1JlcXVlc3RzXG59IGZyb20gJ0AvbWlkZGxld2FyZSdcbmltcG9ydCB7XG4gIGlzQXJyYXksIGlzT2JqZWN0LCBpc1N0cmluZywgYXNBcnJheSwgaXNQbGFpbk9iamVjdCwgaHlwaGVuYXRlLCBjbG9uZSwgbWVyZ2UsXG4gIHBhcnNlRGF0YVBhdGgsIG5vcm1hbGl6ZURhdGFQYXRoXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQge1xuICBNb2RlbCxcbiAgQmVsb25nc1RvT25lUmVsYXRpb24sXG4gIGtuZXhTbmFrZUNhc2VNYXBwZXJzLFxuICByZWZcbn0gZnJvbSAnb2JqZWN0aW9uJ1xuXG5leHBvcnQgY2xhc3MgQXBwbGljYXRpb24gZXh0ZW5kcyBLb2Ege1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgY29uZmlnID0ge30sXG4gICAgdmFsaWRhdG9yLFxuICAgIHJvdXRlcixcbiAgICBldmVudHMsXG4gICAgbWlkZGxld2FyZSxcbiAgICBtb2RlbHMsXG4gICAgc2VydmljZXMsXG4gICAgY29udHJvbGxlcnNcbiAgfSA9IHt9KSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuX3NldHVwRW1pdHRlcihldmVudHMpXG4gICAgY29uc3Qge1xuICAgICAgLy8gUGx1Y2sga2V5cyBvdXQgb2YgYGNvbmZpZy5hcHBgIHRvIGtlZXAgdGhlbSBzZWNyZXRcbiAgICAgIGFwcDogeyBrZXlzLCAuLi5hcHAgfSA9IHt9LFxuICAgICAgbG9nID0ge30sXG4gICAgICAuLi5yZXN0XG4gICAgfSA9IGNvbmZpZ1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgYXBwLFxuICAgICAgbG9nOiBsb2cuc2lsZW50IHx8IHByb2Nlc3MuZW52LkRJVE9fU0lMRU5UID8ge30gOiBsb2csXG4gICAgICAuLi5yZXN0XG4gICAgfVxuICAgIHRoaXMua2V5cyA9IGtleXNcbiAgICB0aGlzLnByb3h5ID0gISFhcHAucHJveHlcbiAgICB0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvciB8fCBuZXcgVmFsaWRhdG9yKClcbiAgICB0aGlzLnJvdXRlciA9IHJvdXRlciB8fCBuZXcgUm91dGVyKClcbiAgICB0aGlzLnZhbGlkYXRvci5hcHAgPSB0aGlzXG4gICAgdGhpcy5zdG9yYWdlcyA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB0aGlzLm1vZGVscyA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB0aGlzLnNlcnZpY2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIHRoaXMuY29udHJvbGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5oYXNDb250cm9sbGVyTWlkZGxld2FyZSA9IGZhbHNlXG4gICAgdGhpcy5zZXR1cExvZ2dlcigpXG4gICAgdGhpcy5zZXR1cEtuZXgoKVxuICAgIHRoaXMuc2V0dXBHbG9iYWxNaWRkbGV3YXJlKClcbiAgICBpZiAobWlkZGxld2FyZSkge1xuICAgICAgdGhpcy51c2UobWlkZGxld2FyZSlcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5zdG9yYWdlcykge1xuICAgICAgdGhpcy5hZGRTdG9yYWdlcyhjb25maWcuc3RvcmFnZXMpXG4gICAgfVxuICAgIGlmIChtb2RlbHMpIHtcbiAgICAgIHRoaXMuYWRkTW9kZWxzKG1vZGVscylcbiAgICB9XG4gICAgaWYgKHNlcnZpY2VzKSB7XG4gICAgICB0aGlzLmFkZFNlcnZpY2VzKHNlcnZpY2VzKVxuICAgIH1cbiAgICBpZiAoY29udHJvbGxlcnMpIHtcbiAgICAgIHRoaXMuYWRkQ29udHJvbGxlcnMoY29udHJvbGxlcnMpXG4gICAgfVxuICB9XG5cbiAgYWRkUm91dGUodmVyYiwgcGF0aCwgdHJhbnNhY3RlZCwgaGFuZGxlcnMsIGNvbnRyb2xsZXIgPSBudWxsLCBhY3Rpb24gPSBudWxsKSB7XG4gICAgaGFuZGxlcnMgPSBhc0FycmF5KGhhbmRsZXJzKVxuICAgIGNvbnN0IGhhbmRsZXIgPSBoYW5kbGVycy5sZW5ndGggPiAxID8gY29tcG9zZShoYW5kbGVycykgOiBoYW5kbGVyc1swXVxuICAgIC8vIEluc3RlYWQgb2YgZGlyZWN0bHkgcGFzc2luZyBgaGFuZGxlcmAsIHBhc3MgYSBgcm91dGVgIG9iamVjdCB0aGF0IGFsc29cbiAgICAvLyB3aWxsIGJlIGV4cG9zZWQgdGhyb3VnaCBgY3R4LnJvdXRlYCwgc2VlIGByb3V0ZXJIYW5kbGVyKClgOlxuICAgIGNvbnN0IHJvdXRlID0ge1xuICAgICAgdmVyYixcbiAgICAgIHBhdGgsXG4gICAgICB0cmFuc2FjdGVkLFxuICAgICAgaGFuZGxlcixcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgICBhY3Rpb25cbiAgICB9XG4gICAgdGhpcy5yb3V0ZXJbdmVyYl0ocGF0aCwgcm91dGUpXG4gIH1cblxuICBhZGRNb2RlbHMobW9kZWxzKSB7XG4gICAgLy8gRmlyc3QgYWRkIGFsbCBtb2RlbHMgdGhlbiBjYWxsIGluaXRpYWxpemUoKSBmb3IgZWFjaCBpbiBhIHNlY29uZCBsb29wLFxuICAgIC8vIHNpbmNlIHRoZXkgbWF5IGJlIHJlZmVyZW5jaW5nIGVhY2ggb3RoZXIgaW4gcmVsYXRpb25zLlxuICAgIGZvciAoY29uc3QgbW9kZWxDbGFzcyBvZiBPYmplY3QudmFsdWVzKG1vZGVscykpIHtcbiAgICAgIHRoaXMuYWRkTW9kZWwobW9kZWxDbGFzcylcbiAgICB9XG4gICAgLy8gTm93IChyZS0pc29ydCBhbGwgbW9kZWxzIGJhc2VkIG9uIHRoZWlyIHJlbGF0aW9ucy5cbiAgICB0aGlzLm1vZGVscyA9IHRoaXMuc29ydE1vZGVscyh0aGlzLm1vZGVscylcbiAgICAvLyBGaWx0ZXIgdGhyb3VnaCBhbGwgc29ydGVkIG1vZGVscywga2VlcGluZyBvbmx5IHRoZSBuZXdseSBhZGRlZCBvbmVzLlxuICAgIGNvbnN0IHNvcnRlZE1vZGVscyA9IE9iamVjdC52YWx1ZXModGhpcy5tb2RlbHMpLmZpbHRlcihcbiAgICAgIG1vZGVsQ2xhc3MgPT4gbW9kZWxzW21vZGVsQ2xhc3MubmFtZV0gPT09IG1vZGVsQ2xhc3NcbiAgICApXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgYWRkZWQgbW9kZWxzIGluIGNvcnJlY3Qgc29ydGVkIHNlcXVlbmNlLCBzbyB0aGF0IGZvciBldmVyeVxuICAgIC8vIG1vZGVsLCBnZXRSZWxhdGVkUmVsYXRpb25zKCkgcmV0dXJucyB0aGUgZnVsbCBsaXN0IG9mIHJlbGF0aW5nIHJlbGF0aW9ucy5cbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2Ygc29ydGVkTW9kZWxzKSB7XG4gICAgICBpZiAobW9kZWxzW21vZGVsQ2xhc3MubmFtZV0gPT09IG1vZGVsQ2xhc3MpIHtcbiAgICAgICAgbW9kZWxDbGFzcy5zZXR1cCh0aGlzLmtuZXgpXG4gICAgICAgIC8vIE5vdyB0aGF0IHRoZSBtb2RlbENsYXNzIGlzIHNldCB1cCwgY2FsbCBgaW5pdGlhbGl6ZSgpYCwgd2hpY2ggY2FuIGJlXG4gICAgICAgIC8vIG92ZXJyaWRkZW4gYnkgc3ViLWNsYXNzZXMsd2l0aG91dCBoYXZpbmcgdG8gY2FsbCBgc3VwZXIuaW5pdGlhbGl6ZSgpYFxuICAgICAgICBtb2RlbENsYXNzLmluaXRpYWxpemUoKVxuICAgICAgICB0aGlzLnZhbGlkYXRvci5hZGRTY2hlbWEobW9kZWxDbGFzcy5nZXRKc29uU2NoZW1hKCkpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHsgbG9nIH0gPSB0aGlzLmNvbmZpZ1xuICAgIGlmIChsb2cuc2NoZW1hIHx8IGxvZy5yZWxhdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgbW9kZWxDbGFzcyBvZiBzb3J0ZWRNb2RlbHMpIHtcbiAgICAgICAgY29uc3Qgc2hvdWxkTG9nID0gb3B0aW9uID0+IChcbiAgICAgICAgICBvcHRpb24gPT09IHRydWUgfHxcbiAgICAgICAgICBhc0FycmF5KG9wdGlvbikuaW5jbHVkZXMobW9kZWxDbGFzcy5uYW1lKVxuICAgICAgICApXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7fVxuICAgICAgICBpZiAoc2hvdWxkTG9nKGxvZy5zY2hlbWEpKSB7XG4gICAgICAgICAgZGF0YS5zY2hlbWEgPSBtb2RlbENsYXNzLmdldEpzb25TY2hlbWEoKVxuICAgICAgICB9XG4gICAgICAgIGlmIChzaG91bGRMb2cobG9nLnJlbGF0aW9ucykpIHtcbiAgICAgICAgICBkYXRhLnJlbGF0aW9ucyA9IGNsb25lKG1vZGVsQ2xhc3MucmVsYXRpb25NYXBwaW5ncywgdmFsdWUgPT5cbiAgICAgICAgICAgIE1vZGVsLmlzUHJvdG90eXBlT2YodmFsdWUpID8gYFtNb2RlbDogJHt2YWx1ZS5uYW1lfV1gIDogdmFsdWVcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgICBwaWNvLnllbGxvdy5ib2xkKGBcXG4ke21vZGVsQ2xhc3MubmFtZX06XFxuYCksXG4gICAgICAgICAgICB1dGlsLmluc3BlY3QoZGF0YSwge1xuICAgICAgICAgICAgICBjb2xvcnM6IHRydWUsXG4gICAgICAgICAgICAgIGRlcHRoOiBudWxsLFxuICAgICAgICAgICAgICBtYXhBcnJheUxlbmd0aDogbnVsbFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRNb2RlbChtb2RlbENsYXNzKSB7XG4gICAgaWYgKE1vZGVsLmlzUHJvdG90eXBlT2YobW9kZWxDbGFzcykpIHtcbiAgICAgIG1vZGVsQ2xhc3MuYXBwID0gdGhpc1xuICAgICAgdGhpcy5tb2RlbHNbbW9kZWxDbGFzcy5uYW1lXSA9IG1vZGVsQ2xhc3NcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG1vZGVsIGNsYXNzOiAke21vZGVsQ2xhc3N9YClcbiAgICB9XG4gIH1cblxuICBzb3J0TW9kZWxzKG1vZGVscykge1xuICAgIGNvbnN0IHNvcnRCeVJlbGF0aW9ucyA9IChsaXN0LCBjb2xsZWN0ZWQgPSB7fSwgZXhjbHVkZWQgPSB7fSkgPT4ge1xuICAgICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIGxpc3QpIHtcbiAgICAgICAgY29uc3QgeyBuYW1lIH0gPSBtb2RlbENsYXNzXG4gICAgICAgIGlmICghY29sbGVjdGVkW25hbWVdICYmICFleGNsdWRlZFtuYW1lXSkge1xuICAgICAgICAgIGZvciAoY29uc3QgcmVsYXRpb24gb2YgT2JqZWN0LnZhbHVlcyhtb2RlbENsYXNzLmdldFJlbGF0aW9ucygpKSkge1xuICAgICAgICAgICAgaWYgKCEocmVsYXRpb24gaW5zdGFuY2VvZiBCZWxvbmdzVG9PbmVSZWxhdGlvbikpIHtcbiAgICAgICAgICAgICAgY29uc3QgeyByZWxhdGVkTW9kZWxDbGFzcywgam9pblRhYmxlTW9kZWxDbGFzcyB9ID0gcmVsYXRpb25cbiAgICAgICAgICAgICAgZm9yIChjb25zdCByZWxhdGVkIG9mIFtqb2luVGFibGVNb2RlbENsYXNzLCByZWxhdGVkTW9kZWxDbGFzc10pIHtcbiAgICAgICAgICAgICAgICAvLyBFeGNsdWRlIHNlbGYtcmVmZXJlbmNlcyBhbmQgZ2VuZXJhdGVkIGpvaW4gbW9kZWxzOlxuICAgICAgICAgICAgICAgIGlmIChyZWxhdGVkICYmIHJlbGF0ZWQgIT09IG1vZGVsQ2xhc3MgJiYgbW9kZWxzW3JlbGF0ZWQubmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgIHNvcnRCeVJlbGF0aW9ucyhbcmVsYXRlZF0sIGNvbGxlY3RlZCwge1xuICAgICAgICAgICAgICAgICAgICAvLyBFeGNsdWRlIG1vZGVsQ2xhc3MgdG8gcHJldmVudCBlbmRsZXNzIHJlY3Vyc2lvbnM6XG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXTogbW9kZWxDbGFzcyxcbiAgICAgICAgICAgICAgICAgICAgLi4uZXhjbHVkZWRcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbGxlY3RlZFtuYW1lXSA9IG1vZGVsQ2xhc3NcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoY29sbGVjdGVkKVxuICAgIH1cbiAgICAvLyBSZXR1cm4gYSBuZXcgb2JqZWN0IHdpdGggdGhlIHNvcnRlZCBtb2RlbHMgYXMgaXRzIGtleS92YWx1ZSBwYWlycy5cbiAgICAvLyBOT1RFOiBXZSBuZWVkIHRvIHJldmVyc2UgZm9yIHRoZSBhYm92ZSBhbGdvcml0aG0gdG8gc29ydCBwcm9wZXJseSxcbiAgICAvLyBhbmQgdGhlbiByZXZlcnNlIHRoZSByZXN1bHQgYmFjay5cbiAgICByZXR1cm4gc29ydEJ5UmVsYXRpb25zKE9iamVjdC52YWx1ZXMobW9kZWxzKS5yZXZlcnNlKCkpLnJldmVyc2UoKS5yZWR1Y2UoXG4gICAgICAobW9kZWxzLCBtb2RlbENsYXNzKSA9PiB7XG4gICAgICAgIG1vZGVsc1ttb2RlbENsYXNzLm5hbWVdID0gbW9kZWxDbGFzc1xuICAgICAgICByZXR1cm4gbW9kZWxzXG4gICAgICB9LFxuICAgICAgT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIClcbiAgfVxuXG4gIGdldE1vZGVsKG5hbWUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5tb2RlbHNbbmFtZV0gfHxcbiAgICAgICFuYW1lLmVuZHNXaXRoKCdNb2RlbCcpICYmIHRoaXMubW9kZWxzW2Ake25hbWV9TW9kZWxgXSB8fFxuICAgICAgbnVsbFxuICAgIClcbiAgfVxuXG4gIGZpbmRNb2RlbChjYWxsYmFjaykge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMubW9kZWxzKS5maW5kKGNhbGxiYWNrKVxuICB9XG5cbiAgYWRkU2VydmljZXMoc2VydmljZXMpIHtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZXJ2aWNlXSBvZiBPYmplY3QuZW50cmllcyhzZXJ2aWNlcykpIHtcbiAgICAgIC8vIEhhbmRsZSBFUzYgbW9kdWxlIHdlaXJkbmVzcyB0aGF0IGNhbiBoYXBwZW4sIGFwcGFyZW50bHk6XG4gICAgICBpZiAobmFtZSA9PT0gJ2RlZmF1bHQnICYmIGlzUGxhaW5PYmplY3Qoc2VydmljZSkpIHtcbiAgICAgICAgdGhpcy5hZGRTZXJ2aWNlcyhzZXJ2aWNlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hZGRTZXJ2aWNlKHNlcnZpY2UsIG5hbWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkU2VydmljZShzZXJ2aWNlLCBuYW1lKSB7XG4gICAgLy8gQXV0by1pbnN0YW50aWF0ZSBjb250cm9sbGVyIGNsYXNzZXM6XG4gICAgaWYgKFNlcnZpY2UuaXNQcm90b3R5cGVPZihzZXJ2aWNlKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXBcbiAgICAgIHNlcnZpY2UgPSBuZXcgc2VydmljZSh0aGlzLCBuYW1lKVxuICAgIH1cbiAgICBpZiAoIShzZXJ2aWNlIGluc3RhbmNlb2YgU2VydmljZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzZXJ2aWNlOiAke3NlcnZpY2V9YClcbiAgICB9XG4gICAgLy8gT25seSBhZnRlciB0aGUgY29uc3RydWN0b3IgaXMgY2FsbGVkLCBgc2VydmljZS5uYW1lYCBpcyBndWFyYW50ZWVkIHRvIGJlXG4gICAgLy8gc2V0IHRvIHRoZSBjb3JyZWN0IHZhbHVlLCBlLmcuIHdpdGggYW4gYWZ0ZXItY29uc3RydWN0b3IgY2xhc3MgcHJvcGVydHkuXG4gICAgKHsgbmFtZSB9ID0gc2VydmljZSlcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZy5zZXJ2aWNlc1tuYW1lXVxuICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb25maWd1cmF0aW9uIG1pc3NpbmcgZm9yIHNlcnZpY2UgJyR7bmFtZX0nYClcbiAgICB9XG4gICAgLy8gQXMgYSBjb252ZW50aW9uLCB0aGUgY29uZmlndXJhdGlvbiBvZiBhIHNlcnZpY2UgY2FuIGJlIHNldCB0byBgZmFsc2VgXG4gICAgLy8gaW4gb3JkZXIgdG8gZW50aXJlbHkgZGVhY3RpdmF0ZSB0aGUgc2VydmljZS5cbiAgICBpZiAoY29uZmlnICE9PSBmYWxzZSkge1xuICAgICAgc2VydmljZS5zZXR1cChjb25maWcpXG4gICAgICB0aGlzLnNlcnZpY2VzW25hbWVdID0gc2VydmljZVxuICAgICAgLy8gTm93IHRoYXQgdGhlIHNlcnZpY2UgaXMgc2V0IHVwLCBjYWxsIGBpbml0aWFsaXplKClgIHdoaWNoIGNhbiBiZVxuICAgICAgLy8gb3ZlcnJpZGRlbiBieSBzZXJ2aWNlcy5cbiAgICAgIHNlcnZpY2UuaW5pdGlhbGl6ZSgpXG4gICAgfVxuICB9XG5cbiAgZ2V0U2VydmljZShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZXNbbmFtZV0gfHwgbnVsbFxuICB9XG5cbiAgZmluZFNlcnZpY2UoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLnNlcnZpY2VzKS5maW5kKGNhbGxiYWNrKVxuICB9XG5cbiAgZm9yRWFjaFNlcnZpY2UoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LnZhbHVlcyh0aGlzLnNlcnZpY2VzKS5tYXAoY2FsbGJhY2spKVxuICB9XG5cbiAgYWRkQ29udHJvbGxlcnMoY29udHJvbGxlcnMsIG5hbWVzcGFjZSkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbnRyb2xsZXJzKSkge1xuICAgICAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHRoaXMuYWRkQ29udHJvbGxlcnModmFsdWUsIG5hbWVzcGFjZSA/IGAke25hbWVzcGFjZX0vJHtrZXl9YCA6IGtleSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWRkQ29udHJvbGxlcih2YWx1ZSwgbmFtZXNwYWNlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZENvbnRyb2xsZXIoY29udHJvbGxlciwgbmFtZXNwYWNlKSB7XG4gICAgLy8gQ29udHJvbGxlcnMgcmVxdWlyZSBhZGRpdGlvbmFsIG1pZGRsZXdhcmUgdG8gYmUgaW5zdGFsbGVkIG9uY2UuXG4gICAgdGhpcy5zZXR1cENvbnRyb2xsZXJNaWRkbGV3YXJlKClcbiAgICAvLyBBdXRvLWluc3RhbnRpYXRlIGNvbnRyb2xsZXIgY2xhc3NlczpcbiAgICBpZiAoQ29udHJvbGxlci5pc1Byb3RvdHlwZU9mKGNvbnRyb2xsZXIpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgY29udHJvbGxlciA9IG5ldyBjb250cm9sbGVyKHRoaXMsIG5hbWVzcGFjZSlcbiAgICB9XG4gICAgaWYgKCEoY29udHJvbGxlciBpbnN0YW5jZW9mIENvbnRyb2xsZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29udHJvbGxlcjogJHtjb250cm9sbGVyfWApXG4gICAgfVxuICAgIC8vIEluaGVyaXRhbmNlIG9mIGFjdGlvbiBtZXRob2RzIGNhbm5vdCBoYXBwZW4gaW4gdGhlIGNvbnN0cnVjdG9yIGl0c2VsZixcbiAgICAvLyBzbyBjYWxsIHNlcGFyYXRlIGBzZXR1cCgpYCBtZXRob2QgYWZ0ZXIgaW4gb3JkZXIgdG8gdGFrZSBjYXJlIG9mIGl0LlxuICAgIGNvbnRyb2xsZXIuc2V0dXAoKVxuICAgIHRoaXMuY29udHJvbGxlcnNbY29udHJvbGxlci51cmxdID0gY29udHJvbGxlclxuICAgIC8vIE5vdyB0aGF0IHRoZSBjb250cm9sbGVyIGlzIHNldCB1cCwgY2FsbCBgaW5pdGlhbGl6ZSgpYCB3aGljaCBjYW4gYmVcbiAgICAvLyBvdmVycmlkZGVuIGJ5IGNvbnRyb2xsZXJzLlxuICAgIGNvbnRyb2xsZXIuaW5pdGlhbGl6ZSgpXG4gICAgLy8gRWFjaCBjb250cm9sbGVyIGNhbiBhbHNvIHByb3ZpZGUgZnVydGhlciBtaWRkbGV3YXJlLCBlLmcuXG4gICAgLy8gYEFkbWluQ29udHJvbGxlcmA6XG4gICAgY29uc3QgbWlkZGxld2FyZSA9IGNvbnRyb2xsZXIuY29tcG9zZSgpXG4gICAgaWYgKG1pZGRsZXdhcmUpIHtcbiAgICAgIHRoaXMudXNlKG1pZGRsZXdhcmUpXG4gICAgfVxuICB9XG5cbiAgZ2V0Q29udHJvbGxlcih1cmwpIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyc1t1cmxdIHx8IG51bGxcbiAgfVxuXG4gIGZpbmRDb250cm9sbGVyKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5jb250cm9sbGVycykuZmluZChjYWxsYmFjaylcbiAgfVxuXG4gIGdldEFkbWluQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kQ29udHJvbGxlcihcbiAgICAgIGNvbnRyb2xsZXIgPT4gY29udHJvbGxlciBpbnN0YW5jZW9mIEFkbWluQ29udHJvbGxlclxuICAgIClcbiAgfVxuXG4gIGdldEFkbWluVnVlQ29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLmdldEFkbWluQ29udHJvbGxlcigpPy5nZXRWdWVDb25maWcoKSB8fCBudWxsXG4gIH1cblxuICBnZXRBc3NldENvbmZpZyh7XG4gICAgbW9kZWxzID0gT2JqZWN0LmtleXModGhpcy5tb2RlbHMpLFxuICAgIG5vcm1hbGl6ZURiTmFtZXMgPSB0aGlzLmNvbmZpZy5rbmV4Lm5vcm1hbGl6ZURiTmFtZXNcbiAgfSA9IHt9KSB7XG4gICAgY29uc3QgYXNzZXRDb25maWcgPSB7fVxuICAgIGZvciAoY29uc3QgbW9kZWxOYW1lIG9mIG1vZGVscykge1xuICAgICAgY29uc3QgbW9kZWxDbGFzcyA9IHRoaXMubW9kZWxzW21vZGVsTmFtZV1cbiAgICAgIGNvbnN0IHsgYXNzZXRzIH0gPSBtb2RlbENsYXNzLmRlZmluaXRpb25cbiAgICAgIGlmIChhc3NldHMpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE1vZGVsTmFtZSA9IG5vcm1hbGl6ZURiTmFtZXNcbiAgICAgICAgICA/IHRoaXMubm9ybWFsaXplSWRlbnRpZmllcihtb2RlbE5hbWUpXG4gICAgICAgICAgOiBtb2RlbE5hbWVcbiAgICAgICAgY29uc3QgY29udmVydGVkQXNzZXRzID0ge31cbiAgICAgICAgZm9yIChjb25zdCBbYXNzZXREYXRhUGF0aCwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhhc3NldHMpKSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICBuZXN0ZWREYXRhUGF0aCxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBpbmRleFxuICAgICAgICAgIH0gPSBtb2RlbENsYXNzLmdldFByb3BlcnR5T3JSZWxhdGlvbkF0RGF0YVBhdGgoYXNzZXREYXRhUGF0aClcbiAgICAgICAgICBpZiAocHJvcGVydHkgJiYgaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplRGJOYW1lc1xuICAgICAgICAgICAgICA/IHRoaXMubm9ybWFsaXplSWRlbnRpZmllcihuYW1lKVxuICAgICAgICAgICAgICA6IG5hbWVcbiAgICAgICAgICAgIGNvbnN0IGRhdGFQYXRoID0gbm9ybWFsaXplRGF0YVBhdGgoW1xuICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSxcbiAgICAgICAgICAgICAgLi4ucGFyc2VEYXRhUGF0aChuZXN0ZWREYXRhUGF0aClcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgICBjb25zdCBhc3NldENvbmZpZ3MgPSBjb252ZXJ0ZWRBc3NldHNbbm9ybWFsaXplZE5hbWVdIHx8PSB7fVxuICAgICAgICAgICAgYXNzZXRDb25maWdzW2RhdGFQYXRoXSA9IGNvbmZpZ1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lc3RlZCBncmFwaCBwcm9wZXJ0aWVzIGFyZSBub3Qgc3VwcG9ydGVkIHlldCcpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzc2V0Q29uZmlnW25vcm1hbGl6ZWRNb2RlbE5hbWVdID0gY29udmVydGVkQXNzZXRzXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhc3NldENvbmZpZ1xuICB9XG5cbiAgYWRkU3RvcmFnZXMoc3RvcmFnZXMpIHtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JhZ2VzKSkge1xuICAgICAgdGhpcy5hZGRTdG9yYWdlKGNvbmZpZywgbmFtZSlcbiAgICB9XG4gIH1cblxuICBhZGRTdG9yYWdlKGNvbmZpZywgbmFtZSkge1xuICAgIGxldCBzdG9yYWdlID0gbnVsbFxuICAgIGlmIChpc1BsYWluT2JqZWN0KGNvbmZpZykpIHtcbiAgICAgIGNvbnN0IHN0b3JhZ2VDbGFzcyA9IFN0b3JhZ2UuZ2V0KGNvbmZpZy50eXBlKVxuICAgICAgaWYgKCFzdG9yYWdlQ2xhc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzdG9yYWdlOiAke2NvbmZpZ31gKVxuICAgICAgfVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXBcbiAgICAgIHN0b3JhZ2UgPSBuZXcgc3RvcmFnZUNsYXNzKHRoaXMsIGNvbmZpZylcbiAgICB9IGVsc2UgaWYgKGNvbmZpZyBpbnN0YW5jZW9mIFN0b3JhZ2UpIHtcbiAgICAgIHN0b3JhZ2UgPSBjb25maWdcbiAgICB9XG4gICAgaWYgKHN0b3JhZ2UpIHtcbiAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgIHN0b3JhZ2UubmFtZSA9IG5hbWVcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RvcmFnZXNbc3RvcmFnZS5uYW1lXSA9IHN0b3JhZ2VcbiAgICB9XG4gICAgcmV0dXJuIHN0b3JhZ2VcbiAgfVxuXG4gIGdldFN0b3JhZ2UobmFtZSkge1xuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VzW25hbWVdIHx8IG51bGxcbiAgfVxuXG4gIGNvbXBpbGVWYWxpZGF0b3IoanNvblNjaGVtYSwgb3B0aW9ucykge1xuICAgIHJldHVybiBqc29uU2NoZW1hXG4gICAgICA/IHRoaXMudmFsaWRhdG9yLmNvbXBpbGUoanNvblNjaGVtYSwgb3B0aW9ucylcbiAgICAgIDogbnVsbFxuICB9XG5cbiAgY29tcGlsZVBhcmFtZXRlcnNWYWxpZGF0b3IocGFyYW1ldGVycywgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgbGlzdCA9IFtdXG4gICAgY29uc3QgeyBkYXRhTmFtZSA9ICdkYXRhJyB9ID0gb3B0aW9uc1xuXG4gICAgbGV0IHByb3BlcnRpZXMgPSBudWxsXG4gICAgY29uc3QgYWRkUGFyYW1ldGVyID0gKG5hbWUsIHNjaGVtYSkgPT4ge1xuICAgICAgbGlzdC5wdXNoKHtcbiAgICAgICAgbmFtZTogbmFtZSA/PyBudWxsLFxuICAgICAgICAuLi5zY2hlbWFcbiAgICAgIH0pXG4gICAgICBpZiAoIXNjaGVtYS5tZW1iZXIpIHtcbiAgICAgICAgcHJvcGVydGllcyB8fD0ge31cbiAgICAgICAgcHJvcGVydGllc1tuYW1lIHx8IGRhdGFOYW1lXSA9IHNjaGVtYVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN1cHBvcnQgdHdvIGZvcm1hdHMgb2YgcGFyYW1ldGVycyBkZWZpbml0aW9uczpcbiAgICAvLyAtIEFuIGFycmF5IG9mIHBhcmFtZXRlciBzY2hlbWFzLCBuYW1lZCBieSB0aGVpciBgbmFtZWAga2V5LlxuICAgIC8vIC0gQW4gb2JqZWN0IG9mIHBhcmFtZXRlciBzY2hlbWFzLCBuYW1lZCBieSB0aGUga2V5IHVuZGVyIHdoaWNoIGVhY2hcbiAgICAvLyAgIHNjaGVtYSBpcyBzdG9yZWQgaW4gdGhlIHJvb3Qgb2JqZWN0LlxuICAgIC8vIElmIGFuIGFycmF5IGlzIHBhc3NlZCwgdGhlbiB0aGUgY29udHJvbGxlciBhY3Rpb25zIHJlY2VpdmVzIHRoZVxuICAgIC8vIHBhcmFtZXRlcnMgYXMgc2VwYXJhdGUgYXJndW1lbnRzLiBJZiBhbiBvYmplY3QgaXMgcGFzc2VkLCB0aGVuIHRoZVxuICAgIC8vIGFjdGlvbnMgcmVjZWl2ZXMgb25lIHBhcmFtZXRlciBvYmplY3Qgd2hlcmUgdW5kZXIgdGhlIHNhbWUga2V5cyB0aGVcbiAgICAvLyBzcGVjaWZpZWQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgc3RvcmVkLlxuICAgIGxldCBhc09iamVjdCA9IGZhbHNlXG4gICAgaWYgKGlzQXJyYXkocGFyYW1ldGVycykpIHtcbiAgICAgIGZvciAoY29uc3QgeyBuYW1lLCAuLi5zY2hlbWEgfSBvZiBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIGFkZFBhcmFtZXRlcihuYW1lLCBzY2hlbWEpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc09iamVjdChwYXJhbWV0ZXJzKSkge1xuICAgICAgYXNPYmplY3QgPSB0cnVlXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKHBhcmFtZXRlcnMpKSB7XG4gICAgICAgIGlmIChzY2hlbWEpIHtcbiAgICAgICAgICBhZGRQYXJhbWV0ZXIobmFtZSwgc2NoZW1hKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwYXJhbWV0ZXJzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1ldGVycyBkZWZpbml0aW9uOiAke3BhcmFtZXRlcnN9YClcbiAgICB9XG4gICAgLy8gTk9URTogSWYgcHJvcGVydGllcyBpcyBudWxsLCBzY2hlbWEgYW5kIHZhbGlkYXRlIHdpbGwgYmVjb21lIG51bGwgdG9vLlxuICAgIC8vIE5PVEU6IElmIGl0IGlzIG5vdCBudWxsLCBpdCB3aWxsIGdldCBleHBhbmRlZCB0byBhbiBvYmplY3Qgc2NoZW1hLlxuICAgIGNvbnN0IHNjaGVtYSA9IGNvbnZlcnRTY2hlbWEocHJvcGVydGllcywgb3B0aW9ucylcbiAgICBjb25zdCB2YWxpZGF0ZSA9IHRoaXMuY29tcGlsZVZhbGlkYXRvcihzY2hlbWEsIHtcbiAgICAgIC8vIEZvciBwYXJhbWV0ZXJzLCBhbHdheXMgY29lcmNlIHR5cGVzLCBpbmNsdWRpbmcgYXJyYXlzLlxuICAgICAgY29lcmNlVHlwZXM6ICdhcnJheScsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfSlcbiAgICBjb25zdCBjdHggPSB7XG4gICAgICBhcHA6IHRoaXMsXG4gICAgICB2YWxpZGF0b3I6IHRoaXMudmFsaWRhdG9yLFxuICAgICAgb3B0aW9uc1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbGlzdCxcbiAgICAgIHNjaGVtYSxcbiAgICAgIGFzT2JqZWN0LFxuICAgICAgZGF0YU5hbWUsXG4gICAgICB2YWxpZGF0ZTogdmFsaWRhdGVcbiAgICAgICAgLy8gVXNlIGBjYWxsKClgIHRvIHBhc3MgY3R4IGFzIGNvbnRleHQgdG8gQWp2LCBzZWUgcGFzc0NvbnRleHQ6XG4gICAgICAgID8gZGF0YSA9PiB2YWxpZGF0ZS5jYWxsKGN0eCwgZGF0YSlcbiAgICAgICAgOiBudWxsXG4gICAgfVxuICB9XG5cbiAgY3JlYXRlVmFsaWRhdGlvbkVycm9yKHsgdHlwZSwgbWVzc2FnZSwgZXJyb3JzLCBvcHRpb25zLCBqc29uIH0pIHtcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25FcnJvcih7XG4gICAgICB0eXBlLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIGVycm9yczogdGhpcy52YWxpZGF0b3IucGFyc2VFcnJvcnMoZXJyb3JzLCBvcHRpb25zKSxcbiAgICAgIC8vIE9ubHkgaW5jbHVkZSB0aGUgSlNPTiBkYXRhIGluIHRoZSBlcnJvciBpZiBgbG9nLmVycm9ycy5qc29uYGlzIHNldC5cbiAgICAgIGpzb246IHRoaXMuY29uZmlnLmxvZy5lcnJvcnM/Lmpzb24gPyBqc29uIDogdW5kZWZpbmVkXG4gICAgfSlcbiAgfVxuXG4gIGNyZWF0ZURhdGFiYXNlRXJyb3IoZXJyb3IpIHtcbiAgICAvLyBSZW1vdmUga25leCBTUUwgcXVlcnkgYW5kIG1vdmUgdG8gc2VwYXJhdGUgYHNxbGAgcHJvcGVydHkuXG4gICAgLy8gVE9ETzogRml4IHRoaXMgcHJvcGVybHkgaW4gS25leCAvIE9iamVjdGlvbiBpbnN0ZWFkLCBzZWU6XG4gICAgLy8gaHR0cHM6Ly9naXR0ZXIuaW0vVmluY2l0L29iamVjdGlvbi5qcz9hdD01YTY4NzI4ZjVhOWViZTRmNzVjYTQwYjBcbiAgICBjb25zdCBbLCBzcWwsIG1lc3NhZ2VdID0gZXJyb3IubWVzc2FnZS5tYXRjaCgvXihbXFxzXFxTXSopIC0gKFtcXHNcXFNdKj8pJC8pIHx8XG4gICAgICBbbnVsbCwgbnVsbCwgZXJyb3IubWVzc2FnZV1cbiAgICByZXR1cm4gbmV3IERhdGFiYXNlRXJyb3IoZXJyb3IsIHtcbiAgICAgIG1lc3NhZ2UsXG4gICAgICAvLyBPbmx5IGluY2x1ZGUgdGhlIFNRTCBxdWVyeSBpbiB0aGUgZXJyb3IgaWYgYGxvZy5lcnJvcnMuc3FsYGlzIHNldC5cbiAgICAgIHNxbDogdGhpcy5jb25maWcubG9nLmVycm9ycz8uc3FsID8gc3FsIDogdW5kZWZpbmVkXG4gICAgfSlcbiAgfVxuXG4gIHNldHVwR2xvYmFsTWlkZGxld2FyZSgpIHtcbiAgICBjb25zdCB7IGFwcCwgbG9nIH0gPSB0aGlzLmNvbmZpZ1xuXG4gICAgdGhpcy51c2UoYXR0YWNoTG9nZ2VyKHRoaXMubG9nZ2VyKSlcblxuICAgIGlmIChhcHAucmVzcG9uc2VUaW1lICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy51c2UocmVzcG9uc2VUaW1lKGdldE9wdGlvbnMoYXBwLnJlc3BvbnNlVGltZSkpKVxuICAgIH1cbiAgICBpZiAobG9nLnJlcXVlc3RzKSB7XG4gICAgICB0aGlzLnVzZShsb2dSZXF1ZXN0cygpKVxuICAgIH1cbiAgICAvLyBOZWVkcyB0byBiZSBwb3NpdGlvbmVkIGFmdGVyIHRoZSByZXF1ZXN0IGxvZ2dlciB0byBsb2cgdGhlIGNvcnJlY3RcbiAgICAvLyByZXNwb25zZSBzdGF0dXMuXG4gICAgdGhpcy51c2UoaGFuZGxlRXJyb3IoKSlcbiAgICBpZiAoYXBwLmhlbG1ldCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudXNlKGhlbG1ldChnZXRPcHRpb25zKGFwcC5oZWxtZXQpKSlcbiAgICB9XG4gICAgaWYgKGFwcC5jb3JzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy51c2UoY29ycyhnZXRPcHRpb25zKGFwcC5jb3JzKSkpXG4gICAgfVxuICAgIGlmIChhcHAuY29tcHJlc3MgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnVzZShjb21wcmVzcyhtZXJnZShcbiAgICAgICAge1xuICAgICAgICAgIC8vIFVzZSBhIHJlYXNvbmFibGUgZGVmYXVsdCBmb3IgQnJvdGxpIGNvbXByZXNzaW9uLlxuICAgICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20va29hanMvY29tcHJlc3MvaXNzdWVzLzEyNlxuICAgICAgICAgIGJyOiB7XG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgW3psaWIuY29uc3RhbnRzLkJST1RMSV9QQVJBTV9RVUFMSVRZXTogNFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0T3B0aW9ucyhhcHAuY29tcHJlc3MpXG4gICAgICApKSlcbiAgICB9XG4gICAgaWYgKGFwcC5ldGFnICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy51c2UoY29uZGl0aW9uYWwoKSlcbiAgICAgIHRoaXMudXNlKGV0YWcoKSlcbiAgICB9XG4gIH1cblxuICBzZXR1cENvbnRyb2xsZXJNaWRkbGV3YXJlKCkge1xuICAgIC8vIE5PVEU6IFRoaXMgaXMgbm90IHBhcnQgb2YgdGhlIGF1dG9tYXRpYyBgc2V0dXBHbG9iYWxNaWRkbGV3YXJlKClgIHNvIHRoYXRcbiAgICAvLyBhcHBzIGNhbiBzZXQgdXAgdGhlIHN0YXRpYyBzZXJ2aW5nIG9mIGFzc2V0cyBiZWZvcmUgaW5zdGFsbGluZyB0aGVcbiAgICAvLyBzZXNzaW9uIGFuZCBwYXNzcG9ydCBtaWRkbGV3YXJlLiBJdCBpcyBjYWxsZWQgZnJvbSBgYWRkQ29udHJvbGxlcigpYC5cbiAgICAvLyBVc2UgYSBmbGFnIHRvIG9ubHkgaW5zdGFsbCB0aGUgbWlkZGxld2FyZSBvbmNlOlxuICAgIGlmICghdGhpcy5oYXNDb250cm9sbGVyTWlkZGxld2FyZSkge1xuICAgICAgY29uc3QgeyBhcHAgfSA9IHRoaXMuY29uZmlnXG4gICAgICAvLyBTZXF1ZW5jZSBpcyBpbXBvcnRhbnQ6XG4gICAgICAvLyAxLiBib2R5IHBhcnNlclxuICAgICAgdGhpcy51c2UoYm9keVBhcnNlcihnZXRPcHRpb25zKGFwcC5ib2R5UGFyc2VyKSkpXG4gICAgICAvLyAyLiBmaW5kIHJvdXRlIGZyb20gcm91dGVzIGluc3RhbGxlZCBieSBjb250cm9sbGVycy5cbiAgICAgIHRoaXMudXNlKGZpbmRSb3V0ZSh0aGlzLnJvdXRlcikpXG4gICAgICAvLyAzLiByZXNwZWN0IHRyYW5zYWN0ZWQgc2V0dGluZ3MsIGNyZWF0ZSBhbmQgaGFuZGxlIHRyYW5zYWN0aW9ucy5cbiAgICAgIHRoaXMudXNlKGNyZWF0ZVRyYW5zYWN0aW9uKCkpXG4gICAgICAvLyA0LiBzZXNzaW9uXG4gICAgICBpZiAoYXBwLnNlc3Npb24pIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICB9ID0gZ2V0T3B0aW9ucyhhcHAuc2Vzc2lvbilcbiAgICAgICAgaWYgKG1vZGVsQ2xhc3MpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgYSBDb250ZXh0U3RvcmUgdGhhdCByZXNvbHZlZCB0aGUgc3BlY2lmaWVkIG1vZGVsIGNsYXNzLFxuICAgICAgICAgIC8vIHVzZXMgaXQgdG8gcGVyc2lzdCBhbmQgcmV0cmlldmUgdGhlIHNlc3Npb24sIGFuZCBhdXRvbWF0aWNhbGx5XG4gICAgICAgICAgLy8gYmluZHMgYWxsIGRiIG9wZXJhdGlvbnMgdG8gYGN0eC50cmFuc2FjdGlvbmAsIGlmIGl0IGlzIHNldC5cbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgICAgICAgIG9wdGlvbnMuQ29udGV4dFN0b3JlID0gU2Vzc2lvblN0b3JlKG1vZGVsQ2xhc3MpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2Uoc2Vzc2lvbihvcHRpb25zLCB0aGlzKSlcbiAgICAgIH1cbiAgICAgIC8vIDUuIHBhc3Nwb3J0XG4gICAgICBpZiAoYXBwLnBhc3Nwb3J0KSB7XG4gICAgICAgIHRoaXMudXNlKHBhc3Nwb3J0LmluaXRpYWxpemUoKSlcbiAgICAgICAgaWYgKGFwcC5zZXNzaW9uKSB7XG4gICAgICAgICAgdGhpcy51c2UocGFzc3BvcnQuc2Vzc2lvbigpKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlKGhhbmRsZVVzZXIoKSlcbiAgICAgIH1cblxuICAgICAgLy8gNi4gZmluYWxseSBoYW5kbGUgdGhlIGZvdW5kIHJvdXRlLCBvciBzZXQgc3RhdHVzIC8gYWxsb3cgYWNjb3JkaW5nbHkuXG4gICAgICB0aGlzLnVzZShoYW5kbGVSb3V0ZSgpKVxuICAgICAgdGhpcy5oYXNDb250cm9sbGVyTWlkZGxld2FyZSA9IHRydWVcbiAgICB9XG4gIH1cblxuICBzZXR1cExvZ2dlcigpIHtcbiAgICBjb25zdCB7IGVyciwgcmVxLCByZXMgfSA9IHBpbm8uc3RkU2VyaWFsaXplcnNcbiAgICAvLyBPbmx5IGluY2x1ZGUgYGlkYCBmcm9tIHRoZSB1c2VyLCB0byBub3QgaW5hZHZlcnRlbnRseSBsb2cgUElJLlxuICAgIGNvbnN0IHVzZXIgPSB1c2VyID0+ICh7IGlkOiB1c2VyLmlkIH0pXG4gICAgY29uc3Qgc2VyaWFsaXplcnMgPSB7IGVyciwgcmVxLCByZXMsIHVzZXIgfVxuXG4gICAgY29uc3QgbG9nZ2VyID0gcGlubyhtZXJnZShcbiAgICAgIHtcbiAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgc2VyaWFsaXplcnMsXG4gICAgICAgIHByZXR0eVByaW50OiB7XG4gICAgICAgICAgLy8gTGlzdCBvZiBrZXlzIHRvIGlnbm9yZSBpbiBwcmV0dHkgbW9kZS5cbiAgICAgICAgICBpZ25vcmU6ICdyZXEscmVzLGR1cmF0aW9uTXMsdXNlcixyZXF1ZXN0SWQnLFxuICAgICAgICAgIC8vIFNZUyB0byB1c2Ugc3lzdGVtIHRpbWUgYW5kIG5vdCBVVEMuXG4gICAgICAgICAgdHJhbnNsYXRlVGltZTogJ1NZUzpISDpNTTpzcy5sJ1xuICAgICAgICB9LFxuICAgICAgICAvLyBSZWRhY3QgY29tbW9uIHNlbnNpdGl2ZSBoZWFkZXJzLlxuICAgICAgICByZWRhY3Q6IFtcbiAgICAgICAgICAnKi5oZWFkZXJzW1wiY29va2llXCJdJyxcbiAgICAgICAgICAnKi5oZWFkZXJzW1wic2V0LWNvb2tpZVwiXScsXG4gICAgICAgICAgJyouaGVhZGVyc1tcImF1dGhvcml6YXRpb25cIl0nXG4gICAgICAgIF0sXG4gICAgICAgIGJhc2U6IG51bGwgLy8gbm8gcGlkLGhvc3RuYW1lLG5hbWVcbiAgICAgIH0sXG4gICAgICBnZXRPcHRpb25zKHRoaXMuY29uZmlnLmxvZ2dlcilcbiAgICApKVxuXG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXIuY2hpbGQoeyBuYW1lOiAnYXBwJyB9KVxuICB9XG5cbiAgc2V0dXBLbmV4KCkge1xuICAgIGxldCB7IGtuZXgsIGxvZyB9ID0gdGhpcy5jb25maWdcbiAgICBpZiAoa25leD8uY2xpZW50KSB7XG4gICAgICBjb25zdCBzbmFrZUNhc2VPcHRpb25zID0ga25leC5ub3JtYWxpemVEYk5hbWVzID09PSB0cnVlXG4gICAgICAgID8ge31cbiAgICAgICAgOiBrbmV4Lm5vcm1hbGl6ZURiTmFtZXNcbiAgICAgIGlmIChzbmFrZUNhc2VPcHRpb25zKSB7XG4gICAgICAgIGtuZXggPSB7XG4gICAgICAgICAgLi4ua25leCxcbiAgICAgICAgICAuLi5rbmV4U25ha2VDYXNlTWFwcGVycyhzbmFrZUNhc2VPcHRpb25zKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmtuZXggPSBLbmV4KGtuZXgpXG4gICAgICAvLyBTdXBwb3J0IFBvc3RncmVTUUwgdHlwZSBwYXJzZXIgbWFwcGluZ3MgaW4gdGhlIGNvbmZpZy5cbiAgICAgIGlmIChcbiAgICAgICAga25leC5jbGllbnQgPT09ICdwb3N0Z3Jlc3FsJyAmJlxuICAgICAgICBrbmV4LnR5cGVQYXJzZXJzICYmXG4gICAgICAgIHRoaXMua25leC5jbGllbnQuZHJpdmVyXG4gICAgICApIHtcbiAgICAgICAgZm9yIChjb25zdCBbdHlwZSwgcGFyc2VyXSBvZiBPYmplY3QuZW50cmllcyhrbmV4LnR5cGVQYXJzZXJzKSkge1xuICAgICAgICAgIHRoaXMua25leC5jbGllbnQuZHJpdmVyLnR5cGVzLnNldFR5cGVQYXJzZXIodHlwZSwgcGFyc2VyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobG9nLnNxbCkge1xuICAgICAgICB0aGlzLnNldHVwS25leExvZ2dpbmcoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldHVwS25leExvZ2dpbmcoKSB7XG4gICAgY29uc3Qgc3RhcnRUaW1lcyA9IHt9XG4gICAgY29uc3QgbG9nZ2VyID0gdGhpcy5sb2dnZXIuY2hpbGQoeyBuYW1lOiAnc3FsJyB9KVxuICAgIGZ1bmN0aW9uIGVuZChxdWVyeSwgeyByZXNwb25zZSwgZXJyb3IgfSkge1xuICAgICAgY29uc3QgaWQgPSBxdWVyeS5fX2tuZXhRdWVyeVVpZFxuICAgICAgY29uc3QgZGlmZiA9IHByb2Nlc3MuaHJ0aW1lKHN0YXJ0VGltZXNbaWRdKVxuICAgICAgY29uc3QgZHVyYXRpb24gPSBkaWZmWzBdICogMWUzICsgZGlmZlsxXSAvIDFlNlxuICAgICAgZGVsZXRlIHN0YXJ0VGltZXNbaWRdXG4gICAgICBjb25zdCB7IHNxbCwgYmluZGluZ3MgfSA9IHF1ZXJ5XG4gICAgICByZXNwb25zZSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzcG9uc2UpLmZpbHRlcihcbiAgICAgICAgICAoW2tleV0pID0+ICFrZXkuc3RhcnRzV2l0aCgnXycpXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIGxvZ2dlci5pbmZvKHsgZHVyYXRpb24sIGJpbmRpbmdzLCByZXNwb25zZSwgZXJyb3IgfSwgc3FsKVxuICAgIH1cblxuICAgIHRoaXMua25leFxuICAgICAgLm9uKCdxdWVyeScsIHF1ZXJ5ID0+IHtcbiAgICAgICAgc3RhcnRUaW1lc1txdWVyeS5fX2tuZXhRdWVyeVVpZF0gPSBwcm9jZXNzLmhydGltZSgpXG4gICAgICB9KVxuICAgICAgLm9uKCdxdWVyeS1yZXNwb25zZScsIChyZXNwb25zZSwgcXVlcnkpID0+IHtcbiAgICAgICAgZW5kKHF1ZXJ5LCB7IHJlc3BvbnNlIH0pXG4gICAgICB9KVxuICAgICAgLm9uKCdxdWVyeS1lcnJvcicsIChlcnJvciwgcXVlcnkpID0+IHtcbiAgICAgICAgZW5kKHF1ZXJ5LCB7IGVycm9yIH0pXG4gICAgICB9KVxuICB9XG5cbiAgbm9ybWFsaXplSWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gICAgcmV0dXJuIHRoaXMua25leC5jbGllbnQud3JhcElkZW50aWZpZXIoaWRlbnRpZmllcikucmVwbGFjZSgvWydgXCJdL2csICcnKVxuICB9XG5cbiAgZGVub3JtYWxpemVJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgICBjb25zdCBvYmogPSB0aGlzLmtuZXguY2xpZW50LnBvc3RQcm9jZXNzUmVzcG9uc2UoeyBbaWRlbnRpZmllcl06IDEgfSlcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVswXVxuICB9XG5cbiAgbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmFwcC5ub3JtYWxpemVQYXRocyA/IGh5cGhlbmF0ZShwYXRoKSA6IHBhdGhcbiAgfVxuXG4gIGZvcm1hdEVycm9yKGVycikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIudG9KU09OXG4gICAgICA/IGZvcm1hdEpzb24oZXJyLnRvSlNPTigpKVxuICAgICAgOiBlcnIubWVzc2FnZSB8fCBlcnJcbiAgICBjb25zdCBzdHIgPSBgJHtlcnIubmFtZX06ICR7bWVzc2FnZX1gXG4gICAgcmV0dXJuIGVyci5zdGFjayAmJiB0aGlzLmNvbmZpZy5sb2cuZXJyb3JzPy5zdGFjayAhPT0gZmFsc2VcbiAgICAgID8gYCR7c3RyfVxcbiR7ZXJyLnN0YWNrLnNwbGl0KC9cXG58XFxyXFxufFxcci8pLnNsaWNlKDEpLmpvaW4ob3MuRU9MKX1gXG4gICAgICA6IHN0clxuICB9XG5cbiAgbG9nRXJyb3IoZXJyLCBjdHgpIHtcbiAgICBpZiAoIWVyci5leHBvc2UgJiYgIXRoaXMuc2lsZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5mb3JtYXRFcnJvcihlcnIpXG4gICAgICAgIGNvbnN0IGxldmVsID1cbiAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBSZXNwb25zZUVycm9yICYmIGVyci5zdGF0dXMgPCA1MDAgPyAnaW5mbycgOiAnZXJyb3InXG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IGN0eD8ubG9nZ2VyIHx8IHRoaXMubG9nZ2VyXG4gICAgICAgIGxvZ2dlcltsZXZlbF0odGV4dClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IGxvZyBlcnJvcicsIGUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxvZy5lcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm9uKCdlcnJvcicsIHRoaXMubG9nRXJyb3IpXG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZW1pdCgnYmVmb3JlOnN0YXJ0JylcbiAgICBhd2FpdCB0aGlzLmZvckVhY2hTZXJ2aWNlKHNlcnZpY2UgPT4gc2VydmljZS5zdGFydCgpKVxuICAgIGNvbnN0IHtcbiAgICAgIHNlcnZlcjogeyBob3N0LCBwb3J0IH0sXG4gICAgICBlbnZcbiAgICB9ID0gdGhpcy5jb25maWdcbiAgICB0aGlzLnNlcnZlciA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMubGlzdGVuKHBvcnQsIGhvc3QsICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBwb3J0IH0gPSBzZXJ2ZXIuYWRkcmVzcygpXG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBgJHtlbnZ9IHNlcnZlciBzdGFydGVkIGF0IGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gXG4gICAgICAgIClcbiAgICAgICAgcmVzb2x2ZShzZXJ2ZXIpXG4gICAgICB9KVxuICAgICAgaWYgKCFzZXJ2ZXIpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVW5hYmxlIHRvIHN0YXJ0IHNlcnZlciBhdCBodHRwOi8vJHtob3N0fToke3BvcnR9YCkpXG4gICAgICB9XG4gICAgfSlcbiAgICBhd2FpdCB0aGlzLmVtaXQoJ2FmdGVyOnN0YXJ0JylcbiAgfVxuXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgYXdhaXQgdGhpcy5lbWl0KCdiZWZvcmU6c3RvcCcpXG4gICAgdGhpcy5zZXJ2ZXIgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB7IHNlcnZlciB9ID0gdGhpc1xuICAgICAgaWYgKHNlcnZlcikge1xuICAgICAgICBzZXJ2ZXIuY2xvc2UoZXJyID0+IHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKG51bGwpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAvLyBIYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGNsb3NlIHRoZSBzZXJ2ZXIsXG4gICAgICAgIC8vICBldmVuIGlmIHNvY2tldHMgYXJlIHN0aWxsIG9wZW4uXG4gICAgICAgIC8vICBUYWtlbiBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNjgzMDA3Mi5cbiAgICAgICAgLy8gIEEgcHJvcGVyIHNvbHV0aW9uIHdvdWxkIGJlIHRvIHVzZSBhIGxpYnJhcnksIGV4OiBodHRwczovL2dpdGh1Yi5jb20vZ29kYWRkeS90ZXJtaW51c1xuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gc2VydmVyLmVtaXQoJ2Nsb3NlJykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdTZXJ2ZXIgaXMgbm90IHJ1bm5pbmcnKSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGF3YWl0IHRoaXMuZm9yRWFjaFNlcnZpY2Uoc2VydmljZSA9PiBzZXJ2aWNlLnN0b3AoKSlcbiAgICBhd2FpdCB0aGlzLmVtaXQoJ2FmdGVyOnN0b3AnKVxuICAgIGlmICh0aGlzLmNvbmZpZy5sb2cuZXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5vZmYoJ2Vycm9yJywgdGhpcy5sb2dFcnJvcilcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydE9yRXhpdCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zdGFydCgpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZ0Vycm9yKGVycilcbiAgICAgIHByb2Nlc3MuZXhpdCgtMSlcbiAgICB9XG4gIH1cblxuICAvLyBBc3NldHMgaGFuZGxpbmdcblxuICBhc3luYyBjcmVhdGVBc3NldHMoc3RvcmFnZSwgZmlsZXMsIGNvdW50ID0gMCwgdHJ4ID0gbnVsbCkge1xuICAgIGNvbnN0IEFzc2V0TW9kZWwgPSB0aGlzLmdldE1vZGVsKCdBc3NldCcpXG4gICAgaWYgKEFzc2V0TW9kZWwpIHtcbiAgICAgIGNvbnN0IGFzc2V0cyA9IGZpbGVzLm1hcChmaWxlID0+ICh7XG4gICAgICAgIGtleTogZmlsZS5rZXksXG4gICAgICAgIGZpbGUsXG4gICAgICAgIHN0b3JhZ2U6IHN0b3JhZ2UubmFtZSxcbiAgICAgICAgY291bnRcbiAgICAgIH0pKVxuICAgICAgcmV0dXJuIEFzc2V0TW9kZWxcbiAgICAgICAgLnF1ZXJ5KHRyeClcbiAgICAgICAgLmluc2VydChhc3NldHMpXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBhc3luYyBoYW5kbGVBZGRkZWRBbmRSZW1vdmVkQXNzZXRzKFxuICAgIHN0b3JhZ2UsXG4gICAgYWRkZWRGaWxlcyxcbiAgICByZW1vdmVkRmlsZXMsXG4gICAgdHJ4ID0gbnVsbFxuICApIHtcbiAgICBjb25zdCB7XG4gICAgICBhc3NldHM6IHtcbiAgICAgICAgY2xlYW51cFRpbWVUaHJlc2hvbGQgPSAwXG4gICAgICB9ID0ge31cbiAgICB9ID0gdGhpcy5jb25maWdcbiAgICAvLyBPbmx5IHJlbW92ZSB1bnVzZWQgYXNzZXRzIHRoYXQgaGF2ZW4ndCBzZWVuIGNoYW5nZXMgZm9yIGdpdmVuIHRpbWVmcmFtZS5cbiAgICBjb25zdCB0aW1lVGhyZXNob2xkID0gaXNTdHJpbmcoY2xlYW51cFRpbWVUaHJlc2hvbGQpXG4gICAgICA/IHBhcnNlRHVyYXRpb24oY2xlYW51cFRpbWVUaHJlc2hvbGQpXG4gICAgICA6IGNsZWFudXBUaW1lVGhyZXNob2xkXG5cbiAgICBjb25zdCBpbXBvcnRlZEZpbGVzID0gW11cbiAgICBjb25zdCBBc3NldE1vZGVsID0gdGhpcy5nZXRNb2RlbCgnQXNzZXQnKVxuICAgIGlmIChBc3NldE1vZGVsKSB7XG4gICAgICBpbXBvcnRlZEZpbGVzLnB1c2goXG4gICAgICAgIC4uLmF3YWl0IHRoaXMuYWRkRm9yZWlnbkFzc2V0cyhzdG9yYWdlLCBhZGRlZEZpbGVzLCB0cngpXG4gICAgICApXG4gICAgICBpZiAoXG4gICAgICAgIGFkZGVkRmlsZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICByZW1vdmVkRmlsZXMubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGNoYW5nZUNvdW50ID0gKGZpbGVzLCBpbmNyZW1lbnQpID0+IChcbiAgICAgICAgICBmaWxlcy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgQXNzZXRNb2RlbC5xdWVyeSh0cngpXG4gICAgICAgICAgICAud2hlcmVJbigna2V5JywgZmlsZXMubWFwKGZpbGUgPT4gZmlsZS5rZXkpKVxuICAgICAgICAgICAgLmluY3JlbWVudCgnY291bnQnLCBpbmNyZW1lbnQpXG4gICAgICAgIClcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIGNoYW5nZUNvdW50KGFkZGVkRmlsZXMsIDEpLFxuICAgICAgICAgIGNoYW5nZUNvdW50KHJlbW92ZWRGaWxlcywgLTEpXG4gICAgICAgIF0pXG4gICAgICAgIGlmICh0aW1lVGhyZXNob2xkID4gMCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAvLyBEb24ndCBwYXNzIGB0cnhgIGhlcmUsIGFzIHdlIHdhbnQgdGhpcyBkZWxheWVkIGV4ZWN1dGlvbiB0b1xuICAgICAgICAgICAgLy8gY3JlYXRlIGl0cyBvd24gdHJhbnNhY3Rpb24uXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnJlbGVhc2VVbnVzZWRBc3NldHModGltZVRocmVzaG9sZCksXG4gICAgICAgICAgICB0aW1lVGhyZXNob2xkXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBBbHNvIGV4ZWN1dGUgcmVsZWFzZVVudXNlZEFzc2V0cygpIGltbWVkaWF0ZWx5IGluIHRoZSBzYW1lXG4gICAgICAvLyB0cmFuc2FjdGlvbiwgdG8gcG90ZW50aWFsbHkgY2xlYW4gdXAgb3RoZXIgcGVuZGluZyBhc3NldHMuXG4gICAgICBhd2FpdCB0aGlzLnJlbGVhc2VVbnVzZWRBc3NldHModGltZVRocmVzaG9sZCwgdHJ4KVxuICAgICAgcmV0dXJuIGltcG9ydGVkRmlsZXNcbiAgICB9XG4gIH1cblxuICBhc3luYyBhZGRGb3JlaWduQXNzZXRzKHN0b3JhZ2UsIGZpbGVzLCB0cnggPSBudWxsKSB7XG4gICAgY29uc3QgaW1wb3J0ZWRGaWxlcyA9IFtdXG4gICAgY29uc3QgQXNzZXRNb2RlbCA9IHRoaXMuZ2V0TW9kZWwoJ0Fzc2V0JylcbiAgICBpZiAoQXNzZXRNb2RlbCkge1xuICAgICAgLy8gRmluZCBtaXNzaW5nIGFzc2V0cyAoY29waWVkIGZyb20gYW5vdGhlciBzeXN0ZW0pLCBhbmQgYWRkIHRoZW0uXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZmlsZXMubWFwKGFzeW5jIGZpbGUgPT4ge1xuICAgICAgICAgIGNvbnN0IGFzc2V0ID0gYXdhaXQgQXNzZXRNb2RlbC5xdWVyeSh0cngpLmZpbmRPbmUoJ2tleScsIGZpbGUua2V5KVxuICAgICAgICAgIGlmICghYXNzZXQpIHtcbiAgICAgICAgICAgIGlmIChmaWxlLmRhdGEgfHwgZmlsZS51cmwpIHtcbiAgICAgICAgICAgICAgbGV0IHsgZGF0YSB9ID0gZmlsZVxuICAgICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgICAgICAgICBgJHtcbiAgICAgICAgICAgICAgICAgICAgcGljby5yZWQoJ0lORk86JylcbiAgICAgICAgICAgICAgICAgIH0gQXNzZXQgJHtcbiAgICAgICAgICAgICAgICAgICAgcGljby5ncmVlbihgJyR7ZmlsZS5uYW1lfSdgKVxuICAgICAgICAgICAgICAgICAgfSBpcyBmcm9tIGEgZm9yZWlnbiBzb3VyY2UsIGZldGNoaW5nIGZyb20gJHtcbiAgICAgICAgICAgICAgICAgICAgcGljby5ncmVlbihgJyR7ZmlsZS51cmx9J2ApXG4gICAgICAgICAgICAgICAgICB9IGFuZCBhZGRpbmcgdG8gc3RvcmFnZSAke1xuICAgICAgICAgICAgICAgICAgICBwaWNvLmdyZWVuKGAnJHtzdG9yYWdlLm5hbWV9J2ApXG4gICAgICAgICAgICAgICAgICB9Li4uYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnJlcXVlc3Qoe1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnZ2V0JyxcbiAgICAgICAgICAgICAgICAgIHVybDogZmlsZS51cmwsXG4gICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcidcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGRhdGEgPSByZXNwb25zZS5kYXRhXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgaW1wb3J0ZWRGaWxlID0gYXdhaXQgc3RvcmFnZS5hZGRGaWxlKGZpbGUsIGRhdGEpXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlQXNzZXRzKHN0b3JhZ2UsIFtpbXBvcnRlZEZpbGVdLCAwLCB0cngpXG4gICAgICAgICAgICAgIC8vIE1lcmdlIGJhY2sgdGhlIGNoYW5nZWQgZmlsZSBwcm9wZXJ0aWVzIGludG8gdGhlIGFjdHVhbCBmaWxlc1xuICAgICAgICAgICAgICAvLyBvYmplY3QsIHNvIHRoYXQgdGhlIGRhdGEgZnJvbSB0aGUgc3RhdGljIG1vZGVsIGhvb2sgY2FuIGJlIHVzZWRcbiAgICAgICAgICAgICAgLy8gZGlyZWN0bHkgZm9yIHRoZSBhY3R1YWwgcnVubmluZyBxdWVyeS5cbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihmaWxlLCBpbXBvcnRlZEZpbGUpXG4gICAgICAgICAgICAgIGltcG9ydGVkRmlsZXMucHVzaChpbXBvcnRlZEZpbGUpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIGltcG9ydCBhc3NldCBmcm9tIGZvcmVpZ24gc291cmNlOiAnJHtcbiAgICAgICAgICAgICAgICAgIGZpbGUubmFtZVxuICAgICAgICAgICAgICAgIH0nICgnJHtcbiAgICAgICAgICAgICAgICAgIGZpbGUua2V5XG4gICAgICAgICAgICAgICAgfScpYFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEFzc2V0IGlzIGZyb20gYSBmb3JlaWduIHNvdXJjZSwgYnV0IHdhcyBhbHJlYWR5IGltcG9ydGVkIGFuZCBjYW5cbiAgICAgICAgICAgIC8vIGJlIHJldXNlZC4gU2VlIGFib3ZlIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGlzIG1lcmdlLlxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihmaWxlLCBhc3NldC5maWxlKVxuICAgICAgICAgICAgLy8gTk9URTogTm8gbmVlZCB0byBhZGQgYGZpbGVgIHRvIGBpbXBvcnRlZEZpbGVzYCwgc2luY2UgaXQnc1xuICAgICAgICAgICAgLy8gYWxyZWFkeSBiZWVuIGltcG9ydGVkIHRvIHRoZSBzdG9yYWdlIGJlZm9yZS5cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBpbXBvcnRlZEZpbGVzXG4gIH1cblxuICBhc3luYyBoYW5kbGVNb2RpZmllZEFzc2V0cyhzdG9yYWdlLCBmaWxlcywgdHJ4ID0gbnVsbCkge1xuICAgIGNvbnN0IG1vZGlmaWVkRmlsZXMgPSBbXVxuICAgIGNvbnN0IEFzc2V0TW9kZWwgPSB0aGlzLmdldE1vZGVsKCdBc3NldCcpXG4gICAgaWYgKEFzc2V0TW9kZWwpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWxlcy5tYXAoYXN5bmMgZmlsZSA9PiB7XG4gICAgICAgICAgaWYgKGZpbGUuZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgYXNzZXQgPSBhd2FpdCBBc3NldE1vZGVsLnF1ZXJ5KHRyeCkuZmluZE9uZSgna2V5JywgZmlsZS5rZXkpXG4gICAgICAgICAgICBpZiAoYXNzZXQpIHtcbiAgICAgICAgICAgICAgY29uc3QgY2hhbmdlZEZpbGUgPSBhd2FpdCBzdG9yYWdlLmFkZEZpbGUoZmlsZSwgZmlsZS5kYXRhKVxuICAgICAgICAgICAgICAvLyBNZXJnZSBiYWNrIHRoZSBjaGFuZ2VkIGZpbGUgcHJvcGVydGllcyBpbnRvIHRoZSBhY3R1YWwgZmlsZXNcbiAgICAgICAgICAgICAgLy8gb2JqZWN0LCBzbyB0aGF0IHRoZSBkYXRhIGZyb20gdGhlIHN0YXRpYyBtb2RlbCBob29rIGNhbiBiZSB1c2VkXG4gICAgICAgICAgICAgIC8vIGRpcmVjdGx5IGZvciB0aGUgYWN0dWFsIHJ1bm5pbmcgcXVlcnkuXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZmlsZSwgY2hhbmdlZEZpbGUpXG4gICAgICAgICAgICAgIG1vZGlmaWVkRmlsZXMucHVzaChjaGFuZ2VkRmlsZSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBBc3NldEVycm9yKFxuICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gdXBkYXRlIG1vZGlmaWVkIGFzc2V0IGZyb20gbWVtb3J5IHNvdXJjZTogJyR7XG4gICAgICAgICAgICAgICAgICBmaWxlLm5hbWVcbiAgICAgICAgICAgICAgICB9JyAoJyR7XG4gICAgICAgICAgICAgICAgICBmaWxlLmtleVxuICAgICAgICAgICAgICAgIH0nKWBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIG1vZGlmaWVkRmlsZXNcbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2VVbnVzZWRBc3NldHModGltZVRocmVzaG9sZCA9IDAsIHRyeCA9IG51bGwpIHtcbiAgICBjb25zdCBBc3NldE1vZGVsID0gdGhpcy5nZXRNb2RlbCgnQXNzZXQnKVxuICAgIGlmIChBc3NldE1vZGVsKSB7XG4gICAgICByZXR1cm4gQXNzZXRNb2RlbC50cmFuc2FjdGlvbih0cngsIGFzeW5jIHRyeCA9PiB7XG4gICAgICAgIC8vIERldGVybWluZSB0aGUgdGltZSB0aHJlc2hvbGQgaW4gSlMgaW5zdGVhZCBvZiBTUUwsIGFzIHRoZXJlIGlzIG5vXG4gICAgICAgIC8vIGVhc3kgY3Jvc3MtU1FMIHdheSB0byBkbyBgbm93KCkgLSBpbnRlcnZhbCBYIGhvdXJzYDpcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKClcbiAgICAgICAgZGF0ZS5zZXRNaWxsaXNlY29uZHMoZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSAtIHRpbWVUaHJlc2hvbGQpXG4gICAgICAgIGNvbnN0IG9ycGhhbmVkQXNzZXRzID0gYXdhaXQgQXNzZXRNb2RlbFxuICAgICAgICAgIC5xdWVyeSh0cngpXG4gICAgICAgICAgLndoZXJlKCdjb3VudCcsIDApXG4gICAgICAgICAgLmFuZFdoZXJlKCd1cGRhdGVkQXQnLCAnPD0nLCBkYXRlKVxuICAgICAgICAgIC8vIFByb3RlY3QgZnJlc2hseSBjcmVhdGVkIGFzc2V0cyBmcm9tIGJlaW5nIGRlbGV0ZWQgYWdhaW4gcmlnaHQgYXdheSxcbiAgICAgICAgICAvLyAuZS5nLiB3aGVuIGBjb25maWcuYXNzZXRzLmNsZWFudXBUaW1lVGhyZXNob2xkID0gMGBcbiAgICAgICAgICAuYW5kV2hlcmUoJ3VwZGF0ZWRBdCcsICc+JywgcmVmKCdjcmVhdGVkQXQnKSlcbiAgICAgICAgaWYgKG9ycGhhbmVkQXNzZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBvcnBoYW5lZEtleXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIG9ycGhhbmVkQXNzZXRzLm1hcChhc3luYyBhc3NldCA9PiB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRTdG9yYWdlKGFzc2V0LnN0b3JhZ2UpLnJlbW92ZUZpbGUoYXNzZXQuZmlsZSlcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpXG4gICAgICAgICAgICAgICAgYXNzZXQuZXJyb3IgPSBlcnJvclxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBhc3NldC5rZXlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICAgIGF3YWl0IEFzc2V0TW9kZWxcbiAgICAgICAgICAgIC5xdWVyeSh0cngpXG4gICAgICAgICAgICAuZGVsZXRlKClcbiAgICAgICAgICAgIC53aGVyZUluKCdrZXknLCBvcnBoYW5lZEtleXMpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9ycGhhbmVkQXNzZXRzXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG4vLyBPdmVycmlkZSBLb2EncyBldmVudHMgd2l0aCBvdXIgb3duIEV2ZW50RW1pdHRlciB0aGF0IGFkZHMgc3VwcG9ydCBmb3Jcbi8vIGFzeW5jaHJvbm91cyBldmVudHMuXG5FdmVudEVtaXR0ZXIubWl4aW4oQXBwbGljYXRpb24ucHJvdG90eXBlKVxuXG5mdW5jdGlvbiBnZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KG9wdGlvbnMpID8gb3B0aW9ucyA6IHt9XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ditojs/server",
3
- "version": "0.274.0",
3
+ "version": "0.275.0",
4
4
  "description": "Dito.js Server – Dito.js is a declarative and modern web framework, based on Objection.js, Koa.js and Vue.js",
5
5
  "main": "lib/index.js",
6
6
  "repository": "https://github.com/ditojs/dito/tree/master/packages/server",
@@ -30,9 +30,9 @@
30
30
  "dependencies": {
31
31
  "@babel/core": "^7.17.5",
32
32
  "@babel/runtime": "^7.17.2",
33
- "@ditojs/admin": "^0.274.0",
34
- "@ditojs/router": "^0.274.0",
35
- "@ditojs/utils": "^0.274.0",
33
+ "@ditojs/admin": "^0.275.0",
34
+ "@ditojs/router": "^0.275.0",
35
+ "@ditojs/utils": "^0.275.0",
36
36
  "@koa/cors": "^3.1.0",
37
37
  "@koa/multer": "^3.0.0",
38
38
  "@vue/cli-service": "^4.5.15",
@@ -91,7 +91,7 @@
91
91
  "devDependencies": {
92
92
  "@babel/cli": "^7.17.6",
93
93
  "@babel/preset-env": "^7.16.11",
94
- "@ditojs/babel-preset": "^0.274.0",
94
+ "@ditojs/babel-preset": "^0.275.0",
95
95
  "babel-plugin-dynamic-import-node": "^2.3.3",
96
96
  "babel-plugin-module-resolver": "^4.1.0",
97
97
  "knex": "^0.21.21",
@@ -100,5 +100,5 @@
100
100
  "rimraf": "^3.0.2",
101
101
  "sqlite3": "^5.0.2"
102
102
  },
103
- "gitHead": "0ebfe0bb8913f9d338bb91a0a507e7a4c6e49ecb"
103
+ "gitHead": "b1ee07dad73b0e3408cd90798deb7608c8ef096d"
104
104
  }
@@ -629,7 +629,11 @@ export class Application extends Koa {
629
629
  }
630
630
  this.knex = Knex(knex)
631
631
  // Support PostgreSQL type parser mappings in the config.
632
- if (knex.client === 'postgresql' && knex.typeParsers) {
632
+ if (
633
+ knex.client === 'postgresql' &&
634
+ knex.typeParsers &&
635
+ this.knex.client.driver
636
+ ) {
633
637
  for (const [type, parser] of Object.entries(knex.typeParsers)) {
634
638
  this.knex.client.driver.types.setTypeParser(type, parser)
635
639
  }