appium-adb 8.18.0 → 9.2.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.
@@ -17,7 +17,7 @@ var _path = _interopRequireDefault(require("path"));
17
17
 
18
18
  var _lodash = _interopRequireDefault(require("lodash"));
19
19
 
20
- var _appiumSupport = require("appium-support");
20
+ var _support = require("@appium/support");
21
21
 
22
22
  var _os = require("os");
23
23
 
@@ -103,7 +103,7 @@ methods.initZipAlign = async function initZipAlign() {
103
103
 
104
104
  methods.initBundletool = async function initBundletool() {
105
105
  try {
106
- this.binaries.bundletool = await _appiumSupport.fs.which('bundletool.jar');
106
+ this.binaries.bundletool = await _support.fs.which('bundletool.jar');
107
107
  } catch (err) {
108
108
  throw new Error('bundletool.jar binary is expected to be present in PATH. ' + 'Visit https://github.com/google/bundletool for more details.');
109
109
  }
@@ -460,11 +460,11 @@ methods.setWifiAndData = async function setWifiAndData({
460
460
  wifi,
461
461
  data
462
462
  }, isEmulator = false) {
463
- if (_appiumSupport.util.hasValue(wifi)) {
463
+ if (_support.util.hasValue(wifi)) {
464
464
  await this.setWifiState(wifi, isEmulator);
465
465
  }
466
466
 
467
- if (_appiumSupport.util.hasValue(data)) {
467
+ if (_support.util.hasValue(data)) {
468
468
  await this.setDataState(data, isEmulator);
469
469
  }
470
470
  };
@@ -981,15 +981,15 @@ methods.screenrecord = function screenrecord(destination, options = {}) {
981
981
  bugReport
982
982
  } = options;
983
983
 
984
- if (_appiumSupport.util.hasValue(videoSize)) {
984
+ if (_support.util.hasValue(videoSize)) {
985
985
  cmd.push('--size', videoSize);
986
986
  }
987
987
 
988
- if (_appiumSupport.util.hasValue(timeLimit)) {
988
+ if (_support.util.hasValue(timeLimit)) {
989
989
  cmd.push('--time-limit', timeLimit);
990
990
  }
991
991
 
992
- if (_appiumSupport.util.hasValue(bitRate)) {
992
+ if (_support.util.hasValue(bitRate)) {
993
993
  cmd.push('--bit-rate', bitRate);
994
994
  }
995
995
 
@@ -1000,7 +1000,7 @@ methods.screenrecord = function screenrecord(destination, options = {}) {
1000
1000
  cmd.push(destination);
1001
1001
  const fullCmd = [...this.executable.defaultArgs, 'shell', ...cmd];
1002
1002
 
1003
- _logger.default.debug(`Building screenrecord process with the command line: adb ${_appiumSupport.util.quote(fullCmd)}`);
1003
+ _logger.default.debug(`Building screenrecord process with the command line: adb ${_support.util.quote(fullCmd)}`);
1004
1004
 
1005
1005
  return new _teen_process.SubProcess(this.executable.path, fullCmd);
1006
1006
  };
@@ -1064,7 +1064,7 @@ methods.isIncrementalInstallSupported = async function isIncrementalInstallSuppo
1064
1064
  return false;
1065
1065
  }
1066
1066
 
1067
- return _appiumSupport.util.compareVersions(binary.version, '>=', '30.0.1') && (await this.listFeatures()).includes('abb_exec');
1067
+ return _support.util.compareVersions(binary.version, '>=', '30.0.1') && (await this.listFeatures()).includes('abb_exec');
1068
1068
  };
1069
1069
 
1070
1070
  methods.getDeviceIdleWhitelist = async function getDeviceIdleWhitelist() {
@@ -1083,7 +1083,7 @@ methods.addToDeviceIdleWhitelist = async function addToDeviceIdleWhitelist(...pa
1083
1083
  return false;
1084
1084
  }
1085
1085
 
1086
- _logger.default.info(`Adding ${_appiumSupport.util.pluralize('package', packages.length)} ${JSON.stringify(packages)} to Doze whitelist`);
1086
+ _logger.default.info(`Adding ${_support.util.pluralize('package', packages.length)} ${JSON.stringify(packages)} to Doze whitelist`);
1087
1087
 
1088
1088
  await this.shellChunks(pkg => ['dumpsys', 'deviceidle', 'whitelist', `+${pkg}`], packages);
1089
1089
  return true;
@@ -1093,4 +1093,4 @@ var _default = methods;
1093
1093
  exports.default = _default;require('source-map-support').install();
1094
1094
 
1095
1095
 
1096
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9hZGItY29tbWFuZHMuanMiXSwibmFtZXMiOlsiTUFYX1NIRUxMX0JVRkZFUl9MRU5HVEgiLCJOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SIiwiSUdOT1JFRF9QRVJNX0VSUk9SUyIsIk1BWF9QR1JFUF9QQVRURVJOX0xFTiIsIkhJRERFTl9BUElfUE9MSUNZX0tFWVMiLCJQSURfQ09MVU1OX1RJVExFIiwiUFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRSIsIlBTX1RJVExFX1BBVFRFUk4iLCJSZWdFeHAiLCJBREJfSU5QVVRfRVNDQVBFX1BBVFRFUk4iLCJtZXRob2RzIiwic2hlbGxDaHVua3MiLCJhcmdUcmFuc2Zvcm1lciIsImFyZ3MiLCJjb21tYW5kcyIsImNtZENodW5rIiwiYXJnIiwibmV4dENtZCIsIl8iLCJpc0FycmF5IiwiRXJyb3IiLCJsYXN0IiwicHVzaCIsImpvaW4iLCJsZW5ndGgiLCJpc0VtcHR5IiwibG9nIiwiZGVidWciLCJKU09OIiwic3RyaW5naWZ5IiwibGFzdEVycm9yIiwiY21kIiwic2hlbGwiLCJlIiwiZ2V0QWRiV2l0aENvcnJlY3RBZGJQYXRoIiwiZXhlY3V0YWJsZSIsInBhdGgiLCJnZXRTZGtCaW5hcnlQYXRoIiwiYWRiIiwiaW5pdEFhcHQiLCJpbml0QWFwdDIiLCJpbml0WmlwQWxpZ24iLCJpbml0QnVuZGxldG9vbCIsImJpbmFyaWVzIiwiYnVuZGxldG9vbCIsImZzIiwid2hpY2giLCJlcnIiLCJnZXRBcGlMZXZlbCIsImlzSW50ZWdlciIsIl9hcGlMZXZlbCIsInN0ck91dHB1dCIsImdldERldmljZVByb3BlcnR5IiwiYXBpTGV2ZWwiLCJwYXJzZUludCIsInRyaW0iLCJjaGFyQ29kZVEiLCJjaGFyQ29kZUF0IiwiYXBpTGV2ZWxEaWZmIiwiY29kZW5hbWUiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJnZXRQbGF0Zm9ybVZlcnNpb24iLCJ0b0xvd2VyQ2FzZSIsInRvVXBwZXJDYXNlIiwiaXNOYU4iLCJtZXNzYWdlIiwiaW5mbyIsImlzRGV2aWNlQ29ubmVjdGVkIiwiZGV2aWNlcyIsImdldENvbm5lY3RlZERldmljZXMiLCJta2RpciIsInJlbW90ZVBhdGgiLCJpc1ZhbGlkQ2xhc3MiLCJjbGFzc1N0cmluZyIsImV4ZWMiLCJmb3JjZVN0b3AiLCJwa2ciLCJraWxsUGFja2FnZSIsImNsZWFyIiwiZ3JhbnRBbGxQZXJtaXNzaW9ucyIsImFwayIsInRhcmdldFNkayIsImR1bXBzeXNPdXRwdXQiLCJ0YXJnZXRTZGtWZXJzaW9uVXNpbmdQS0ciLCJ0YXJnZXRTZGtWZXJzaW9uRnJvbU1hbmlmZXN0Iiwid2FybiIsInJlcXVlc3RlZFBlcm1pc3Npb25zIiwiZ2V0UmVxUGVybWlzc2lvbnMiLCJncmFudGVkUGVybWlzc2lvbnMiLCJnZXRHcmFudGVkUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9uc1RvR3JhbnQiLCJkaWZmZXJlbmNlIiwiZ3JhbnRQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwicGVybSIsInNvbWUiLCJwYXR0ZXJuIiwidGVzdCIsInN0ZGVyciIsImdyYW50UGVybWlzc2lvbiIsInBlcm1pc3Npb24iLCJyZXZva2VQZXJtaXNzaW9uIiwiY21kT3V0cHV0Iiwic3Rkb3V0IiwiZ2V0RGVuaWVkUGVybWlzc2lvbnMiLCJnZXRMb2NhdGlvblByb3ZpZGVycyIsImdldFNldHRpbmciLCJzcGxpdCIsIm1hcCIsInAiLCJmaWx0ZXIiLCJCb29sZWFuIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsImVuYWJsZWQiLCJzZXRTZXR0aW5nIiwic2V0SGlkZGVuQXBpUG9saWN5IiwidmFsdWUiLCJpZ25vcmVFcnJvciIsImsiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5Iiwic3RvcEFuZENsZWFyIiwiYXZhaWxhYmxlSU1FcyIsImVuYWJsZWRJTUVzIiwiZW5hYmxlSU1FIiwiaW1lSWQiLCJkaXNhYmxlSU1FIiwic2V0SU1FIiwiZGVmYXVsdElNRSIsImVuZ2luZSIsImtleWV2ZW50Iiwia2V5Y29kZSIsImNvZGUiLCJpbnB1dFRleHQiLCJ0ZXh0Iiwib3JpZ2luYWxTdHIiLCJlc2NhcGVkVGV4dCIsInJlcGxhY2UiLCJldmVyeSIsImMiLCJpbmNsdWRlcyIsInEiLCJjbGVhclRleHRGaWVsZCIsImkiLCJsb2NrIiwiaXNTY3JlZW5Mb2NrZWQiLCJ0aW1lb3V0TXMiLCJ3YWl0TXMiLCJpbnRlcnZhbE1zIiwiYmFjayIsImdvVG9Ib21lIiwiZ2V0QWRiUGF0aCIsImdldFNjcmVlbk9yaWVudGF0aW9uIiwic2VuZFRlbG5ldENvbW1hbmQiLCJjb21tYW5kIiwiZXhlY0VtdUNvbnNvbGVDb21tYW5kIiwicG9ydCIsImdldEVtdWxhdG9yUG9ydCIsImlzQWlycGxhbmVNb2RlT24iLCJzZXRBaXJwbGFuZU1vZGUiLCJvbiIsImJyb2FkY2FzdEFpcnBsYW5lTW9kZSIsImlzV2lmaU9uIiwiaXNEYXRhT24iLCJzZXRXaWZpQW5kRGF0YSIsIndpZmkiLCJkYXRhIiwiaXNFbXVsYXRvciIsInV0aWwiLCJoYXNWYWx1ZSIsInNldFdpZmlTdGF0ZSIsInNldERhdGFTdGF0ZSIsImlzQW5pbWF0aW9uT24iLCJhbmltYXRvcl9kdXJhdGlvbl9zY2FsZSIsInRyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlIiwid2luZG93X2FuaW1hdGlvbl9zY2FsZSIsInNldHRpbmciLCJyaW1yYWYiLCJsb2NhbFBhdGgiLCJvcHRzIiwicG9zaXgiLCJkaXJuYW1lIiwiYWRiRXhlYyIsInB1bGwiLCJ0aW1lb3V0IiwicHJvY2Vzc0V4aXN0cyIsInByb2Nlc3NOYW1lIiwiZ2V0UElEc0J5TmFtZSIsImdldEZvcndhcmRMaXN0IiwiY29ubmVjdGlvbnMiLCJFT0wiLCJsaW5lIiwiZm9yd2FyZFBvcnQiLCJzeXN0ZW1Qb3J0IiwiZGV2aWNlUG9ydCIsInJlbW92ZVBvcnRGb3J3YXJkIiwiZ2V0UmV2ZXJzZUxpc3QiLCJyZXZlcnNlUG9ydCIsInJlbW92ZVBvcnRSZXZlcnNlIiwiZm9yd2FyZEFic3RyYWN0UG9ydCIsInBpbmciLCJpbmRleE9mIiwicmVzdGFydCIsInN0b3BMb2djYXQiLCJyZXN0YXJ0QWRiIiwid2FpdEZvckRldmljZSIsInN0YXJ0TG9nY2F0IiwiX2xvZ2NhdFN0YXJ0dXBQYXJhbXMiLCJsb2djYXQiLCJMb2djYXQiLCJkZWJ1Z1RyYWNlIiwiY2xlYXJEZXZpY2VMb2dzT25TdGFydCIsInN0YXJ0Q2FwdHVyZSIsInN0b3BDYXB0dXJlIiwiZ2V0TG9nY2F0TG9ncyIsImdldExvZ3MiLCJzZXRMb2djYXRMaXN0ZW5lciIsImxpc3RlbmVyIiwicmVtb3ZlTG9nY2F0TGlzdGVuZXIiLCJyZW1vdmVMaXN0ZW5lciIsImxpc3RQcm9jZXNzU3RhdHVzIiwiaXNCb29sZWFuIiwiX2RvZXNQc1N1cHBvcnRBT3B0aW9uIiwic3RhY2siLCJnZXROYW1lQnlQaWQiLCJwaWQiLCJ0aXRsZU1hdGNoIiwiYWxsVGl0bGVzIiwicGlkSW5kZXgiLCJuYW1lT2Zmc2V0IiwicGlkUmVnZXgiLCJtYXRjaGVkTGluZSIsIml0ZW1zIiwibmFtZSIsIl9pc1BncmVwQXZhaWxhYmxlIiwicGdyZXBPdXRwdXQiLCJfY2FuUGdyZXBVc2VGdWxsQ21kTGluZVNlYXJjaCIsIl9pc1BpZG9mQXZhaWxhYmxlIiwic2hlbGxDb21tYW5kIiwiZXNjYXBlUmVnRXhwIiwic2xpY2UiLCJ4IiwicGlkcyIsInByb2Nlc3NOYW1lUmVnZXgiLCJraWxsUHJvY2Vzc2VzQnlOYW1lIiwiQiIsImFsbCIsImtpbGxQcm9jZXNzQnlQSUQiLCJub1Byb2Nlc3NGbGFnIiwicHJpdmlsZWdlZCIsImUxIiwiYnJvYWRjYXN0UHJvY2Vzc0VuZCIsImludGVudCIsImJyb2FkY2FzdCIsInN0YXJ0IiwiRGF0ZSIsIm5vdyIsImVuZEFuZHJvaWRDb3ZlcmFnZSIsImluc3RydW1lbnRQcm9jIiwiaXNSdW5uaW5nIiwic3RvcCIsImluc3RydW1lbnQiLCJhY3Rpdml0eSIsImluc3RydW1lbnRXaXRoIiwicGtnQWN0aXZpdHkiLCJhbmRyb2lkQ292ZXJhZ2UiLCJpbnN0cnVtZW50Q2xhc3MiLCJ3YWl0UGtnIiwid2FpdEFjdGl2aXR5IiwicmVzb2x2ZSIsInJlamVjdCIsImRlZmF1bHRBcmdzIiwiY29uY2F0IiwiU3ViUHJvY2VzcyIsIndhaXRGb3JBY3Rpdml0eSIsInByb3BlcnR5IiwidmFsIiwic2V0RGV2aWNlUHJvcGVydHkiLCJwcm9wIiwiZ2V0RGV2aWNlU3lzTGFuZ3VhZ2UiLCJnZXREZXZpY2VTeXNDb3VudHJ5IiwiZ2V0RGV2aWNlU3lzTG9jYWxlIiwiZ2V0RGV2aWNlUHJvZHVjdExhbmd1YWdlIiwiZ2V0RGV2aWNlUHJvZHVjdENvdW50cnkiLCJnZXREZXZpY2VQcm9kdWN0TG9jYWxlIiwiZ2V0TW9kZWwiLCJnZXRNYW51ZmFjdHVyZXIiLCJnZXRTY3JlZW5TaXplIiwic2l6ZSIsImdldFNjcmVlbkRlbnNpdHkiLCJkZW5zaXR5IiwiZGVuc2l0eU51bWJlciIsInNldEh0dHBQcm94eSIsInByb3h5SG9zdCIsInByb3h5UG9ydCIsInByb3h5IiwiaXNVbmRlZmluZWQiLCJodHRwUHJveHlTZXR0aW5zIiwic2V0dGluZ0tleSIsInNldHRpbmdWYWx1ZSIsImRlbGV0ZUh0dHBQcm94eSIsIm5hbWVzcGFjZSIsImJ1Z3JlcG9ydCIsInNjcmVlbnJlY29yZCIsImRlc3RpbmF0aW9uIiwib3B0aW9ucyIsInZpZGVvU2l6ZSIsImJpdFJhdGUiLCJ0aW1lTGltaXQiLCJidWdSZXBvcnQiLCJmdWxsQ21kIiwicXVvdGUiLCJydW5JbkltZUNvbnRleHQiLCJpbWUiLCJmbiIsIm9yaWdpbmFsSW1lIiwiZGVsYXkiLCJnZXRUaW1lWm9uZSIsImxpc3RGZWF0dXJlcyIsIl9tZW1vaXplZEZlYXR1cmVzIiwibWVtb2l6ZSIsImN1ckRldmljZUlkIiwiaXNTdHJlYW1lZEluc3RhbGxTdXBwb3J0ZWQiLCJwcm90byIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwiX2hlbHBPdXRwdXQiLCJpc0luY3JlbWVudGFsSW5zdGFsbFN1cHBvcnRlZCIsImJpbmFyeSIsImdldFZlcnNpb24iLCJjb21wYXJlVmVyc2lvbnMiLCJ2ZXJzaW9uIiwiZ2V0RGV2aWNlSWRsZVdoaXRlbGlzdCIsIm91dHB1dCIsImFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCIsInBhY2thZ2VzIiwicGx1cmFsaXplIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLHVCQUF1QixHQUFHLElBQWhDO0FBQ0EsTUFBTUMseUJBQXlCLEdBQUcsbUNBQWxDO0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUcsQ0FDMUJELHlCQUQwQixFQUUxQixxQkFGMEIsQ0FBNUI7QUFJQSxNQUFNRSxxQkFBcUIsR0FBRyxFQUE5QjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLENBQzdCLDhCQUQ2QixFQUU3QiwwQkFGNkIsRUFHN0IsbUJBSDZCLENBQS9CO0FBS0EsTUFBTUMsZ0JBQWdCLEdBQUcsS0FBekI7QUFDQSxNQUFNQyx5QkFBeUIsR0FBRyxNQUFsQztBQUNBLE1BQU1DLGdCQUFnQixHQUFHLElBQUlDLE1BQUosQ0FBWSxVQUFTSCxnQkFBaUIsV0FBVUMseUJBQTBCLFNBQTFFLEVBQW9GLEdBQXBGLENBQXpCO0FBRUEsTUFBTUcsd0JBQXdCLEdBQUcsbUJBQWpDO0FBRUEsTUFBTUMsT0FBTyxHQUFHLEVBQWhCOztBQWdCQUEsT0FBTyxDQUFDQyxXQUFSLEdBQXNCLGVBQWVBLFdBQWYsQ0FBNEJDLGNBQTVCLEVBQTRDQyxJQUE1QyxFQUFrRDtBQUN0RSxRQUFNQyxRQUFRLEdBQUcsRUFBakI7QUFDQSxNQUFJQyxRQUFRLEdBQUcsRUFBZjs7QUFDQSxPQUFLLE1BQU1DLEdBQVgsSUFBa0JILElBQWxCLEVBQXdCO0FBQ3RCLFVBQU1JLE9BQU8sR0FBR0wsY0FBYyxDQUFDSSxHQUFELENBQTlCOztBQUNBLFFBQUksQ0FBQ0UsZ0JBQUVDLE9BQUYsQ0FBVUYsT0FBVixDQUFMLEVBQXlCO0FBQ3ZCLFlBQU0sSUFBSUcsS0FBSixDQUFVLDhDQUFWLENBQU47QUFDRDs7QUFDRCxRQUFJRixnQkFBRUcsSUFBRixDQUFPSixPQUFQLE1BQW9CLEdBQXhCLEVBQTZCO0FBQzNCQSxNQUFBQSxPQUFPLENBQUNLLElBQVIsQ0FBYSxHQUFiO0FBQ0Q7O0FBQ0QsUUFBSUwsT0FBTyxDQUFDTSxJQUFSLENBQWEsR0FBYixFQUFrQkMsTUFBbEIsR0FBMkJULFFBQVEsQ0FBQ1EsSUFBVCxDQUFjLEdBQWQsRUFBbUJDLE1BQTlDLElBQXdEeEIsdUJBQTVELEVBQXFGO0FBQ25GYyxNQUFBQSxRQUFRLENBQUNRLElBQVQsQ0FBY1AsUUFBZDtBQUNBQSxNQUFBQSxRQUFRLEdBQUcsRUFBWDtBQUNEOztBQUNEQSxJQUFBQSxRQUFRLEdBQUcsQ0FBQyxHQUFHQSxRQUFKLEVBQWMsR0FBR0UsT0FBakIsQ0FBWDtBQUNEOztBQUNELE1BQUksQ0FBQ0MsZ0JBQUVPLE9BQUYsQ0FBVVYsUUFBVixDQUFMLEVBQTBCO0FBQ3hCRCxJQUFBQSxRQUFRLENBQUNRLElBQVQsQ0FBY1AsUUFBZDtBQUNEOztBQUNEVyxrQkFBSUMsS0FBSixDQUFXLGdEQUErQ0MsSUFBSSxDQUFDQyxTQUFMLENBQWVmLFFBQWYsQ0FBeUIsRUFBbkY7O0FBQ0EsTUFBSWdCLFNBQVMsR0FBRyxJQUFoQjs7QUFDQSxPQUFLLE1BQU1DLEdBQVgsSUFBa0JqQixRQUFsQixFQUE0QjtBQUMxQixRQUFJO0FBQ0YsWUFBTSxLQUFLa0IsS0FBTCxDQUFXRCxHQUFYLENBQU47QUFDRCxLQUZELENBRUUsT0FBT0UsQ0FBUCxFQUFVO0FBQ1ZILE1BQUFBLFNBQVMsR0FBR0csQ0FBWjtBQUNEO0FBQ0Y7O0FBQ0QsTUFBSUgsU0FBSixFQUFlO0FBQ2IsVUFBTUEsU0FBTjtBQUNEO0FBQ0YsQ0FoQ0Q7O0FBd0NBcEIsT0FBTyxDQUFDd0Isd0JBQVIsR0FBbUMsZUFBZUEsd0JBQWYsR0FBMkM7QUFDNUUsT0FBS0MsVUFBTCxDQUFnQkMsSUFBaEIsR0FBdUIsTUFBTSxLQUFLQyxnQkFBTCxDQUFzQixLQUF0QixDQUE3QjtBQUNBLFNBQU8sS0FBS0MsR0FBWjtBQUNELENBSEQ7O0FBU0E1QixPQUFPLENBQUM2QixRQUFSLEdBQW1CLGVBQWVBLFFBQWYsR0FBMkI7QUFDNUMsUUFBTSxLQUFLRixnQkFBTCxDQUFzQixNQUF0QixDQUFOO0FBQ0QsQ0FGRDs7QUFRQTNCLE9BQU8sQ0FBQzhCLFNBQVIsR0FBb0IsZUFBZUEsU0FBZixHQUE0QjtBQUM5QyxRQUFNLEtBQUtILGdCQUFMLENBQXNCLE9BQXRCLENBQU47QUFDRCxDQUZEOztBQVFBM0IsT0FBTyxDQUFDK0IsWUFBUixHQUF1QixlQUFlQSxZQUFmLEdBQStCO0FBQ3BELFFBQU0sS0FBS0osZ0JBQUwsQ0FBc0IsVUFBdEIsQ0FBTjtBQUNELENBRkQ7O0FBUUEzQixPQUFPLENBQUNnQyxjQUFSLEdBQXlCLGVBQWVBLGNBQWYsR0FBaUM7QUFDeEQsTUFBSTtBQUNGLFNBQUtDLFFBQUwsQ0FBY0MsVUFBZCxHQUEyQixNQUFNQyxrQkFBR0MsS0FBSCxDQUFTLGdCQUFULENBQWpDO0FBQ0QsR0FGRCxDQUVFLE9BQU9DLEdBQVAsRUFBWTtBQUNaLFVBQU0sSUFBSTNCLEtBQUosQ0FBVSw4REFDZCw4REFESSxDQUFOO0FBRUQ7QUFDRixDQVBEOztBQWdCQVYsT0FBTyxDQUFDc0MsV0FBUixHQUFzQixlQUFlQSxXQUFmLEdBQThCO0FBQ2xELE1BQUksQ0FBQzlCLGdCQUFFK0IsU0FBRixDQUFZLEtBQUtDLFNBQWpCLENBQUwsRUFBa0M7QUFDaEMsUUFBSTtBQUNGLFlBQU1DLFNBQVMsR0FBRyxNQUFNLEtBQUtDLGlCQUFMLENBQXVCLHNCQUF2QixDQUF4QjtBQUNBLFVBQUlDLFFBQVEsR0FBR0MsUUFBUSxDQUFDSCxTQUFTLENBQUNJLElBQVYsRUFBRCxFQUFtQixFQUFuQixDQUF2QjtBQUdBLFlBQU1DLFNBQVMsR0FBRyxJQUFJQyxVQUFKLENBQWUsQ0FBZixDQUFsQjtBQUVBLFlBQU1DLFlBQVksR0FBR0wsUUFBUSxHQUFHLEVBQWhDO0FBQ0EsWUFBTU0sUUFBUSxHQUFHQyxNQUFNLENBQUNDLFlBQVAsQ0FBb0JMLFNBQVMsR0FBR0UsWUFBaEMsQ0FBakI7O0FBQ0EsVUFBSUEsWUFBWSxJQUFJLENBQWhCLElBQXFCLENBQUMsTUFBTSxLQUFLSSxrQkFBTCxFQUFQLEVBQWtDQyxXQUFsQyxPQUFvREosUUFBN0UsRUFBdUY7QUFDckZqQyx3QkFBSUMsS0FBSixDQUFXLHNCQUFxQmdDLFFBQVEsQ0FBQ0ssV0FBVCxFQUF1Qix3QkFBdUJYLFFBQVMsMEJBQXlCQSxRQUFRLEdBQUcsQ0FBRSxFQUE3SDs7QUFDQUEsUUFBQUEsUUFBUTtBQUNUOztBQUVELFdBQUtILFNBQUwsR0FBaUJHLFFBQWpCOztBQUNBM0Isc0JBQUlDLEtBQUosQ0FBVyxxQkFBb0IsS0FBS3VCLFNBQVUsRUFBOUM7O0FBQ0EsVUFBSWUsS0FBSyxDQUFDLEtBQUtmLFNBQU4sQ0FBVCxFQUEyQjtBQUN6QixjQUFNLElBQUk5QixLQUFKLENBQVcsc0JBQXFCK0IsU0FBVSxxQ0FBMUMsQ0FBTjtBQUNEO0FBQ0YsS0FuQkQsQ0FtQkUsT0FBT2xCLENBQVAsRUFBVTtBQUNWLFlBQU0sSUFBSWIsS0FBSixDQUFXLG1EQUFrRGEsQ0FBQyxDQUFDaUMsT0FBUSxFQUF2RSxDQUFOO0FBQ0Q7QUFDRjs7QUFDRCxTQUFPLEtBQUtoQixTQUFaO0FBQ0QsQ0ExQkQ7O0FBa0NBeEMsT0FBTyxDQUFDb0Qsa0JBQVIsR0FBNkIsZUFBZUEsa0JBQWYsR0FBcUM7QUFDaEVwQyxrQkFBSXlDLElBQUosQ0FBUyxpQ0FBVDs7QUFDQSxNQUFJO0FBQ0YsV0FBTyxNQUFNLEtBQUtmLGlCQUFMLENBQXVCLDBCQUF2QixDQUFiO0FBQ0QsR0FGRCxDQUVFLE9BQU9uQixDQUFQLEVBQVU7QUFDVixVQUFNLElBQUliLEtBQUosQ0FBVywwREFBeURhLENBQUMsQ0FBQ2lDLE9BQVEsRUFBOUUsQ0FBTjtBQUNEO0FBQ0YsQ0FQRDs7QUFjQXhELE9BQU8sQ0FBQzBELGlCQUFSLEdBQTRCLGVBQWVBLGlCQUFmLEdBQW9DO0FBQzlELE1BQUlDLE9BQU8sR0FBRyxNQUFNLEtBQUtDLG1CQUFMLEVBQXBCO0FBQ0EsU0FBT0QsT0FBTyxDQUFDN0MsTUFBUixHQUFpQixDQUF4QjtBQUNELENBSEQ7O0FBV0FkLE9BQU8sQ0FBQzZELEtBQVIsR0FBZ0IsZUFBZUEsS0FBZixDQUFzQkMsVUFBdEIsRUFBa0M7QUFDaEQsU0FBTyxNQUFNLEtBQUt4QyxLQUFMLENBQVcsQ0FBQyxPQUFELEVBQVUsSUFBVixFQUFnQndDLFVBQWhCLENBQVgsQ0FBYjtBQUNELENBRkQ7O0FBWUE5RCxPQUFPLENBQUMrRCxZQUFSLEdBQXVCLFNBQVNBLFlBQVQsQ0FBdUJDLFdBQXZCLEVBQW9DO0FBRXpELFNBQU8sSUFBSWxFLE1BQUosQ0FBVyxtQkFBWCxFQUFnQ21FLElBQWhDLENBQXFDRCxXQUFyQyxDQUFQO0FBQ0QsQ0FIRDs7QUFXQWhFLE9BQU8sQ0FBQ2tFLFNBQVIsR0FBb0IsZUFBZUEsU0FBZixDQUEwQkMsR0FBMUIsRUFBK0I7QUFDakQsU0FBTyxNQUFNLEtBQUs3QyxLQUFMLENBQVcsQ0FBQyxJQUFELEVBQU8sWUFBUCxFQUFxQjZDLEdBQXJCLENBQVgsQ0FBYjtBQUNELENBRkQ7O0FBVUFuRSxPQUFPLENBQUNvRSxXQUFSLEdBQXNCLGVBQWVBLFdBQWYsQ0FBNEJELEdBQTVCLEVBQWlDO0FBQ3JELFNBQU8sTUFBTSxLQUFLN0MsS0FBTCxDQUFXLENBQUMsSUFBRCxFQUFPLE1BQVAsRUFBZTZDLEdBQWYsQ0FBWCxDQUFiO0FBQ0QsQ0FGRDs7QUFXQW5FLE9BQU8sQ0FBQ3FFLEtBQVIsR0FBZ0IsZUFBZUEsS0FBZixDQUFzQkYsR0FBdEIsRUFBMkI7QUFDekMsU0FBTyxNQUFNLEtBQUs3QyxLQUFMLENBQVcsQ0FBQyxJQUFELEVBQU8sT0FBUCxFQUFnQjZDLEdBQWhCLENBQVgsQ0FBYjtBQUNELENBRkQ7O0FBYUFuRSxPQUFPLENBQUNzRSxtQkFBUixHQUE4QixlQUFlQSxtQkFBZixDQUFvQ0gsR0FBcEMsRUFBeUNJLEdBQXpDLEVBQThDO0FBQzFFLFFBQU01QixRQUFRLEdBQUcsTUFBTSxLQUFLTCxXQUFMLEVBQXZCO0FBQ0EsTUFBSWtDLFNBQVMsR0FBRyxDQUFoQjtBQUNBLE1BQUlDLGFBQWEsR0FBRyxJQUFwQjs7QUFDQSxNQUFJO0FBQ0YsUUFBSSxDQUFDRixHQUFMLEVBQVU7QUFLUkUsTUFBQUEsYUFBYSxHQUFHLE1BQU0sS0FBS25ELEtBQUwsQ0FBVyxDQUFDLFNBQUQsRUFBWSxTQUFaLEVBQXVCNkMsR0FBdkIsQ0FBWCxDQUF0QjtBQUNBSyxNQUFBQSxTQUFTLEdBQUcsTUFBTSxLQUFLRSx3QkFBTCxDQUE4QlAsR0FBOUIsRUFBbUNNLGFBQW5DLENBQWxCO0FBQ0QsS0FQRCxNQU9PO0FBQ0xELE1BQUFBLFNBQVMsR0FBRyxNQUFNLEtBQUtHLDRCQUFMLENBQWtDSixHQUFsQyxDQUFsQjtBQUNEO0FBQ0YsR0FYRCxDQVdFLE9BQU9oRCxDQUFQLEVBQVU7QUFFVlAsb0JBQUk0RCxJQUFKLENBQVUsMERBQVY7QUFDRDs7QUFDRCxNQUFJakMsUUFBUSxJQUFJLEVBQVosSUFBa0I2QixTQUFTLElBQUksRUFBbkMsRUFBdUM7QUFNckNDLElBQUFBLGFBQWEsR0FBR0EsYUFBYSxLQUFJLE1BQU0sS0FBS25ELEtBQUwsQ0FBVyxDQUFDLFNBQUQsRUFBWSxTQUFaLEVBQXVCNkMsR0FBdkIsQ0FBWCxDQUFWLENBQTdCO0FBQ0EsVUFBTVUsb0JBQW9CLEdBQUcsTUFBTSxLQUFLQyxpQkFBTCxDQUF1QlgsR0FBdkIsRUFBNEJNLGFBQTVCLENBQW5DO0FBQ0EsVUFBTU0sa0JBQWtCLEdBQUcsTUFBTSxLQUFLQyxxQkFBTCxDQUEyQmIsR0FBM0IsRUFBZ0NNLGFBQWhDLENBQWpDOztBQUNBLFVBQU1RLGtCQUFrQixHQUFHekUsZ0JBQUUwRSxVQUFGLENBQWFMLG9CQUFiLEVBQW1DRSxrQkFBbkMsQ0FBM0I7O0FBQ0EsUUFBSXZFLGdCQUFFTyxPQUFGLENBQVVrRSxrQkFBVixDQUFKLEVBQW1DO0FBQ2pDakUsc0JBQUl5QyxJQUFKLENBQVUsR0FBRVUsR0FBSSxpREFBaEI7QUFDRCxLQUZELE1BRU87QUFDTCxZQUFNLEtBQUtnQixnQkFBTCxDQUFzQmhCLEdBQXRCLEVBQTJCYyxrQkFBM0IsQ0FBTjtBQUNEO0FBQ0Y7QUFDRixDQW5DRDs7QUE4Q0FqRixPQUFPLENBQUNtRixnQkFBUixHQUEyQixlQUFlQSxnQkFBZixDQUFpQ2hCLEdBQWpDLEVBQXNDaUIsV0FBdEMsRUFBbUQ7QUFLNUVwRSxrQkFBSUMsS0FBSixDQUFXLHdCQUF1QkMsSUFBSSxDQUFDQyxTQUFMLENBQWVpRSxXQUFmLENBQTRCLFFBQU9qQixHQUFJLEdBQXpFOztBQUNBLE1BQUk7QUFDRixVQUFNLEtBQUtsRSxXQUFMLENBQWtCb0YsSUFBRCxJQUFVLENBQUMsSUFBRCxFQUFPLE9BQVAsRUFBZ0JsQixHQUFoQixFQUFxQmtCLElBQXJCLENBQTNCLEVBQXVERCxXQUF2RCxDQUFOO0FBQ0QsR0FGRCxDQUVFLE9BQU83RCxDQUFQLEVBQVU7QUFDVixRQUFJLENBQUMvQixtQkFBbUIsQ0FBQzhGLElBQXBCLENBQTBCQyxPQUFELElBQWFBLE9BQU8sQ0FBQ0MsSUFBUixDQUFhakUsQ0FBQyxDQUFDa0UsTUFBRixJQUFZbEUsQ0FBQyxDQUFDaUMsT0FBM0IsQ0FBdEMsQ0FBTCxFQUFpRjtBQUMvRSxZQUFNakMsQ0FBTjtBQUNEO0FBQ0Y7QUFDRixDQWJEOztBQXNCQXZCLE9BQU8sQ0FBQzBGLGVBQVIsR0FBMEIsZUFBZUEsZUFBZixDQUFnQ3ZCLEdBQWhDLEVBQXFDd0IsVUFBckMsRUFBaUQ7QUFDekUsTUFBSTtBQUNGLFVBQU0sS0FBS3JFLEtBQUwsQ0FBVyxDQUFDLElBQUQsRUFBTyxPQUFQLEVBQWdCNkMsR0FBaEIsRUFBcUJ3QixVQUFyQixDQUFYLENBQU47QUFDRCxHQUZELENBRUUsT0FBT3BFLENBQVAsRUFBVTtBQUNWLFFBQUksQ0FBQ2hDLHlCQUF5QixDQUFDaUcsSUFBMUIsQ0FBK0JqRSxDQUFDLENBQUNrRSxNQUFGLElBQVlsRSxDQUFDLENBQUNpQyxPQUE3QyxDQUFMLEVBQTREO0FBQzFELFlBQU1qQyxDQUFOO0FBQ0Q7QUFDRjtBQUNGLENBUkQ7O0FBaUJBdkIsT0FBTyxDQUFDNEYsZ0JBQVIsR0FBMkIsZUFBZUEsZ0JBQWYsQ0FBaUN6QixHQUFqQyxFQUFzQ3dCLFVBQXRDLEVBQWtEO0FBQzNFLE1BQUk7QUFDRixVQUFNLEtBQUtyRSxLQUFMLENBQVcsQ0FBQyxJQUFELEVBQU8sUUFBUCxFQUFpQjZDLEdBQWpCLEVBQXNCd0IsVUFBdEIsQ0FBWCxDQUFOO0FBQ0QsR0FGRCxDQUVFLE9BQU9wRSxDQUFQLEVBQVU7QUFDVixRQUFJLENBQUNoQyx5QkFBeUIsQ0FBQ2lHLElBQTFCLENBQStCakUsQ0FBQyxDQUFDa0UsTUFBRixJQUFZbEUsQ0FBQyxDQUFDaUMsT0FBN0MsQ0FBTCxFQUE0RDtBQUMxRCxZQUFNakMsQ0FBTjtBQUNEO0FBQ0Y7QUFDRixDQVJEOztBQW1CQXZCLE9BQU8sQ0FBQ2dGLHFCQUFSLEdBQWdDLGVBQWVBLHFCQUFmLENBQXNDYixHQUF0QyxFQUEyQzBCLFNBQVMsR0FBRyxJQUF2RCxFQUE2RDtBQUMzRjdFLGtCQUFJQyxLQUFKLENBQVUsZ0NBQVY7O0FBQ0EsUUFBTTZFLE1BQU0sR0FBR0QsU0FBUyxLQUFJLE1BQU0sS0FBS3ZFLEtBQUwsQ0FBVyxDQUFDLFNBQUQsRUFBWSxTQUFaLEVBQXVCNkMsR0FBdkIsQ0FBWCxDQUFWLENBQXhCO0FBQ0EsU0FBTyx5Q0FBMkIyQixNQUEzQixFQUFtQyxDQUFDLFNBQUQsRUFBWSxTQUFaLENBQW5DLEVBQTJELElBQTNELENBQVA7QUFDRCxDQUpEOztBQWNBOUYsT0FBTyxDQUFDK0Ysb0JBQVIsR0FBK0IsZUFBZUEsb0JBQWYsQ0FBcUM1QixHQUFyQyxFQUEwQzBCLFNBQVMsR0FBRyxJQUF0RCxFQUE0RDtBQUN6RjdFLGtCQUFJQyxLQUFKLENBQVUsK0JBQVY7O0FBQ0EsUUFBTTZFLE1BQU0sR0FBR0QsU0FBUyxLQUFJLE1BQU0sS0FBS3ZFLEtBQUwsQ0FBVyxDQUFDLFNBQUQsRUFBWSxTQUFaLEVBQXVCNkMsR0FBdkIsQ0FBWCxDQUFWLENBQXhCO0FBQ0EsU0FBTyx5Q0FBMkIyQixNQUEzQixFQUFtQyxDQUFDLFNBQUQsRUFBWSxTQUFaLENBQW5DLEVBQTJELEtBQTNELENBQVA7QUFDRCxDQUpEOztBQWNBOUYsT0FBTyxDQUFDOEUsaUJBQVIsR0FBNEIsZUFBZUEsaUJBQWYsQ0FBa0NYLEdBQWxDLEVBQXVDMEIsU0FBUyxHQUFHLElBQW5ELEVBQXlEO0FBQ25GN0Usa0JBQUlDLEtBQUosQ0FBVSxrQ0FBVjs7QUFDQSxRQUFNNkUsTUFBTSxHQUFHRCxTQUFTLEtBQUksTUFBTSxLQUFLdkUsS0FBTCxDQUFXLENBQUMsU0FBRCxFQUFZLFNBQVosRUFBdUI2QyxHQUF2QixDQUFYLENBQVYsQ0FBeEI7QUFDQSxTQUFPLHlDQUEyQjJCLE1BQTNCLEVBQW1DLENBQUMsV0FBRCxDQUFuQyxDQUFQO0FBQ0QsQ0FKRDs7QUFXQTlGLE9BQU8sQ0FBQ2dHLG9CQUFSLEdBQStCLGVBQWVBLG9CQUFmLEdBQXVDO0FBQ3BFLE1BQUlGLE1BQU0sR0FBRyxNQUFNLEtBQUtHLFVBQUwsQ0FBZ0IsUUFBaEIsRUFBMEIsNEJBQTFCLENBQW5CO0FBQ0EsU0FBT0gsTUFBTSxDQUFDakQsSUFBUCxHQUFjcUQsS0FBZCxDQUFvQixHQUFwQixFQUNKQyxHQURJLENBQ0NDLENBQUQsSUFBT0EsQ0FBQyxDQUFDdkQsSUFBRixFQURQLEVBRUp3RCxNQUZJLENBRUdDLE9BRkgsQ0FBUDtBQUdELENBTEQ7O0FBWUF0RyxPQUFPLENBQUN1Ryx5QkFBUixHQUFvQyxlQUFlQSx5QkFBZixDQUEwQ0MsT0FBMUMsRUFBbUQ7QUFDckYsUUFBTSxLQUFLQyxVQUFMLENBQWdCLFFBQWhCLEVBQTBCLDRCQUExQixFQUF5RCxHQUFFRCxPQUFPLEdBQUcsR0FBSCxHQUFTLEdBQUksS0FBL0UsQ0FBTjtBQUNELENBRkQ7O0FBOEJBeEcsT0FBTyxDQUFDMEcsa0JBQVIsR0FBNkIsZUFBZUEsa0JBQWYsQ0FBbUNDLEtBQW5DLEVBQTBDQyxXQUFXLEdBQUcsS0FBeEQsRUFBK0Q7QUFDMUYsTUFBSTtBQUNGLFVBQU0sS0FBS3RGLEtBQUwsQ0FBVzVCLHNCQUFzQixDQUFDeUcsR0FBdkIsQ0FBNEJVLENBQUQsSUFBUSx1QkFBc0JBLENBQUUsSUFBR0YsS0FBTSxFQUFwRSxFQUF1RTlGLElBQXZFLENBQTRFLEdBQTVFLENBQVgsQ0FBTjtBQUNELEdBRkQsQ0FFRSxPQUFPVSxDQUFQLEVBQVU7QUFDVixRQUFJLENBQUNxRixXQUFMLEVBQWtCO0FBQ2hCLFlBQU1yRixDQUFOO0FBQ0Q7O0FBQ0RQLG9CQUFJeUMsSUFBSixDQUFVLCtCQUE4Qi9ELHNCQUF1QixTQUFRaUgsS0FBTSxzQkFBcUJwRixDQUFDLENBQUNpQyxPQUFRLEVBQTVHO0FBQ0Q7QUFDRixDQVREOztBQW1CQXhELE9BQU8sQ0FBQzhHLHlCQUFSLEdBQW9DLGVBQWVBLHlCQUFmLENBQTBDRixXQUFXLEdBQUcsS0FBeEQsRUFBK0Q7QUFDakcsTUFBSTtBQUNGLFVBQU0sS0FBS3RGLEtBQUwsQ0FBVzVCLHNCQUFzQixDQUFDeUcsR0FBdkIsQ0FBNEJVLENBQUQsSUFBUSwwQkFBeUJBLENBQUUsRUFBOUQsRUFBaUVoRyxJQUFqRSxDQUFzRSxHQUF0RSxDQUFYLENBQU47QUFDRCxHQUZELENBRUUsT0FBT1UsQ0FBUCxFQUFVO0FBQ1YsUUFBSSxDQUFDcUYsV0FBTCxFQUFrQjtBQUNoQixZQUFNckYsQ0FBTjtBQUNEOztBQUNEUCxvQkFBSXlDLElBQUosQ0FBVSwwQkFBeUIvRCxzQkFBdUIsc0JBQXFCNkIsQ0FBQyxDQUFDaUMsT0FBUSxFQUF6RjtBQUNEO0FBQ0YsQ0FURDs7QUFnQkF4RCxPQUFPLENBQUMrRyxZQUFSLEdBQXVCLGVBQWVBLFlBQWYsQ0FBNkI1QyxHQUE3QixFQUFrQztBQUN2RCxNQUFJO0FBQ0YsVUFBTSxLQUFLRCxTQUFMLENBQWVDLEdBQWYsQ0FBTjtBQUNBLFVBQU0sS0FBS0UsS0FBTCxDQUFXRixHQUFYLENBQU47QUFDRCxHQUhELENBR0UsT0FBTzVDLENBQVAsRUFBVTtBQUNWLFVBQU0sSUFBSWIsS0FBSixDQUFXLHlCQUF3QnlELEdBQUkscUJBQW9CNUMsQ0FBQyxDQUFDaUMsT0FBUSxFQUFyRSxDQUFOO0FBQ0Q7QUFDRixDQVBEOztBQWNBeEQsT0FBTyxDQUFDZ0gsYUFBUixHQUF3QixlQUFlQSxhQUFmLEdBQWdDO0FBQ3RELE1BQUk7QUFDRixXQUFPLG1DQUFxQixNQUFNLEtBQUsxRixLQUFMLENBQVcsQ0FBQyxLQUFELEVBQVEsTUFBUixFQUFnQixJQUFoQixDQUFYLENBQTNCLENBQVA7QUFDRCxHQUZELENBRUUsT0FBT0MsQ0FBUCxFQUFVO0FBQ1YsVUFBTSxJQUFJYixLQUFKLENBQVcsa0RBQWlEYSxDQUFDLENBQUNpQyxPQUFRLEVBQXRFLENBQU47QUFDRDtBQUNGLENBTkQ7O0FBYUF4RCxPQUFPLENBQUNpSCxXQUFSLEdBQXNCLGVBQWVBLFdBQWYsR0FBOEI7QUFDbEQsTUFBSTtBQUNGLFdBQU8sbUNBQXFCLE1BQU0sS0FBSzNGLEtBQUwsQ0FBVyxDQUFDLEtBQUQsRUFBUSxNQUFSLENBQVgsQ0FBM0IsQ0FBUDtBQUNELEdBRkQsQ0FFRSxPQUFPQyxDQUFQLEVBQVU7QUFDVixVQUFNLElBQUliLEtBQUosQ0FBVyxnREFBK0NhLENBQUMsQ0FBQ2lDLE9BQVEsRUFBcEUsQ0FBTjtBQUNEO0FBQ0YsQ0FORDs7QUFhQXhELE9BQU8sQ0FBQ2tILFNBQVIsR0FBb0IsZUFBZUEsU0FBZixDQUEwQkMsS0FBMUIsRUFBaUM7QUFDbkQsUUFBTSxLQUFLN0YsS0FBTCxDQUFXLENBQUMsS0FBRCxFQUFRLFFBQVIsRUFBa0I2RixLQUFsQixDQUFYLENBQU47QUFDRCxDQUZEOztBQVNBbkgsT0FBTyxDQUFDb0gsVUFBUixHQUFxQixlQUFlQSxVQUFmLENBQTJCRCxLQUEzQixFQUFrQztBQUNyRCxRQUFNLEtBQUs3RixLQUFMLENBQVcsQ0FBQyxLQUFELEVBQVEsU0FBUixFQUFtQjZGLEtBQW5CLENBQVgsQ0FBTjtBQUNELENBRkQ7O0FBU0FuSCxPQUFPLENBQUNxSCxNQUFSLEdBQWlCLGVBQWVBLE1BQWYsQ0FBdUJGLEtBQXZCLEVBQThCO0FBQzdDLFFBQU0sS0FBSzdGLEtBQUwsQ0FBVyxDQUFDLEtBQUQsRUFBUSxLQUFSLEVBQWU2RixLQUFmLENBQVgsQ0FBTjtBQUNELENBRkQ7O0FBU0FuSCxPQUFPLENBQUNzSCxVQUFSLEdBQXFCLGVBQWVBLFVBQWYsR0FBNkI7QUFDaEQsTUFBSTtBQUNGLFFBQUlDLE1BQU0sR0FBRyxNQUFNLEtBQUt0QixVQUFMLENBQWdCLFFBQWhCLEVBQTBCLHNCQUExQixDQUFuQjs7QUFDQSxRQUFJc0IsTUFBTSxLQUFLLE1BQWYsRUFBdUI7QUFDckIsYUFBTyxJQUFQO0FBQ0Q7O0FBQ0QsV0FBT0EsTUFBTSxDQUFDMUUsSUFBUCxFQUFQO0FBQ0QsR0FORCxDQU1FLE9BQU90QixDQUFQLEVBQVU7QUFDVixVQUFNLElBQUliLEtBQUosQ0FBVyw4Q0FBNkNhLENBQUMsQ0FBQ2lDLE9BQVEsRUFBbEUsQ0FBTjtBQUNEO0FBQ0YsQ0FWRDs7QUFpQkF4RCxPQUFPLENBQUN3SCxRQUFSLEdBQW1CLGVBQWVBLFFBQWYsQ0FBeUJDLE9BQXpCLEVBQWtDO0FBRW5ELE1BQUlDLElBQUksR0FBRzlFLFFBQVEsQ0FBQzZFLE9BQUQsRUFBVSxFQUFWLENBQW5CO0FBQ0EsUUFBTSxLQUFLbkcsS0FBTCxDQUFXLENBQUMsT0FBRCxFQUFVLFVBQVYsRUFBc0JvRyxJQUF0QixDQUFYLENBQU47QUFDRCxDQUpEOztBQWNBMUgsT0FBTyxDQUFDMkgsU0FBUixHQUFvQixlQUFlQSxTQUFmLENBQTBCQyxJQUExQixFQUFnQztBQUNsRCxNQUFJQSxJQUFJLEtBQUssRUFBYixFQUFpQjtBQUNmO0FBQ0Q7O0FBRUQsUUFBTUMsV0FBVyxHQUFJLEdBQUVELElBQUssRUFBNUI7QUFDQSxRQUFNRSxXQUFXLEdBQUdELFdBQVcsQ0FBQ0UsT0FBWixDQUFvQixLQUFwQixFQUEyQixLQUEzQixFQUFrQ0EsT0FBbEMsQ0FBMEMsSUFBMUMsRUFBZ0QsSUFBaEQsQ0FBcEI7QUFDQSxNQUFJNUgsSUFBSSxHQUFHLENBQUMsT0FBRCxFQUFVLE1BQVYsRUFBa0IwSCxXQUFsQixDQUFYOztBQUNBLE1BQUlDLFdBQVcsS0FBS0QsV0FBaEIsSUFBK0I5SCx3QkFBd0IsQ0FBQ3lGLElBQXpCLENBQThCcUMsV0FBOUIsQ0FBbkMsRUFBK0U7QUFDN0UsUUFBSXJILGdCQUFFd0gsS0FBRixDQUFRLENBQUMsR0FBRCxFQUFPLEdBQVAsQ0FBUixFQUFxQkMsQ0FBRCxJQUFPSixXQUFXLENBQUNLLFFBQVosQ0FBcUJELENBQXJCLENBQTNCLENBQUosRUFBeUQ7QUFDdkQsWUFBTSxJQUFJdkgsS0FBSixDQUNILGtGQURHLENBQU47QUFHRDs7QUFDRCxVQUFNeUgsQ0FBQyxHQUFHTixXQUFXLENBQUNLLFFBQVosQ0FBcUIsR0FBckIsSUFBNkIsR0FBN0IsR0FBa0MsR0FBNUM7QUFDQS9ILElBQUFBLElBQUksR0FBRyxDQUFFLGNBQWFnSSxDQUFFLEdBQUVMLFdBQVksR0FBRUssQ0FBRSxFQUFuQyxDQUFQO0FBQ0Q7O0FBQ0QsUUFBTSxLQUFLN0csS0FBTCxDQUFXbkIsSUFBWCxDQUFOO0FBQ0QsQ0FsQkQ7O0FBMEJBSCxPQUFPLENBQUNvSSxjQUFSLEdBQXlCLGVBQWVBLGNBQWYsQ0FBK0J0SCxNQUFNLEdBQUcsR0FBeEMsRUFBNkM7QUFFcEVFLGtCQUFJQyxLQUFKLENBQVcsa0JBQWlCSCxNQUFPLGFBQW5DOztBQUNBLE1BQUlBLE1BQU0sS0FBSyxDQUFmLEVBQWtCO0FBQ2hCO0FBQ0Q7O0FBQ0QsTUFBSVgsSUFBSSxHQUFHLENBQUMsT0FBRCxFQUFVLFVBQVYsQ0FBWDs7QUFDQSxPQUFLLElBQUlrSSxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHdkgsTUFBcEIsRUFBNEJ1SCxDQUFDLEVBQTdCLEVBQWlDO0FBSy9CbEksSUFBQUEsSUFBSSxDQUFDUyxJQUFMLENBQVUsSUFBVixFQUFnQixLQUFoQjtBQUNEOztBQUNELFFBQU0sS0FBS1UsS0FBTCxDQUFXbkIsSUFBWCxDQUFOO0FBQ0QsQ0FmRDs7QUFvQkFILE9BQU8sQ0FBQ3NJLElBQVIsR0FBZSxlQUFlQSxJQUFmLEdBQXVCO0FBQ3BDLE1BQUksTUFBTSxLQUFLQyxjQUFMLEVBQVYsRUFBaUM7QUFDL0J2SCxvQkFBSUMsS0FBSixDQUFVLDBDQUFWOztBQUNBO0FBQ0Q7O0FBQ0RELGtCQUFJQyxLQUFKLENBQVUsa0RBQVY7O0FBQ0EsUUFBTSxLQUFLdUcsUUFBTCxDQUFjLEVBQWQsQ0FBTjtBQUVBLFFBQU1nQixTQUFTLEdBQUcsSUFBbEI7O0FBQ0EsTUFBSTtBQUNGLFVBQU0sZ0NBQWlCLFlBQVksTUFBTSxLQUFLRCxjQUFMLEVBQW5DLEVBQTBEO0FBQzlERSxNQUFBQSxNQUFNLEVBQUVELFNBRHNEO0FBRTlERSxNQUFBQSxVQUFVLEVBQUU7QUFGa0QsS0FBMUQsQ0FBTjtBQUlELEdBTEQsQ0FLRSxPQUFPbkgsQ0FBUCxFQUFVO0FBQ1YsVUFBTSxJQUFJYixLQUFKLENBQVcsMkNBQTBDOEgsU0FBVSxZQUEvRCxDQUFOO0FBQ0Q7QUFDRixDQWpCRDs7QUF1QkF4SSxPQUFPLENBQUMySSxJQUFSLEdBQWUsZUFBZUEsSUFBZixHQUF1QjtBQUNwQzNILGtCQUFJQyxLQUFKLENBQVUsMEJBQVY7O0FBQ0EsUUFBTSxLQUFLdUcsUUFBTCxDQUFjLENBQWQsQ0FBTjtBQUNELENBSEQ7O0FBU0F4SCxPQUFPLENBQUM0SSxRQUFSLEdBQW1CLGVBQWVBLFFBQWYsR0FBMkI7QUFDNUM1SCxrQkFBSUMsS0FBSixDQUFVLDBCQUFWOztBQUNBLFFBQU0sS0FBS3VHLFFBQUwsQ0FBYyxDQUFkLENBQU47QUFDRCxDQUhEOztBQVFBeEgsT0FBTyxDQUFDNkksVUFBUixHQUFxQixTQUFTQSxVQUFULEdBQXVCO0FBQzFDLFNBQU8sS0FBS3BILFVBQUwsQ0FBZ0JDLElBQXZCO0FBQ0QsQ0FGRDs7QUFTQTFCLE9BQU8sQ0FBQzhJLG9CQUFSLEdBQStCLGVBQWVBLG9CQUFmLEdBQXVDO0FBQ3BFLE1BQUloRCxNQUFNLEdBQUcsTUFBTSxLQUFLeEUsS0FBTCxDQUFXLENBQUMsU0FBRCxFQUFZLE9BQVosQ0FBWCxDQUFuQjtBQUNBLFNBQU8sb0NBQXNCd0UsTUFBdEIsQ0FBUDtBQUNELENBSEQ7O0FBWUE5RixPQUFPLENBQUMrSSxpQkFBUixHQUE0QixlQUFlQSxpQkFBZixDQUFrQ0MsT0FBbEMsRUFBMkM7QUFDckUsU0FBTyxNQUFNLEtBQUtDLHFCQUFMLENBQTJCRCxPQUEzQixFQUFvQztBQUFDRSxJQUFBQSxJQUFJLEVBQUUsTUFBTSxLQUFLQyxlQUFMO0FBQWIsR0FBcEMsQ0FBYjtBQUNELENBRkQ7O0FBU0FuSixPQUFPLENBQUNvSixnQkFBUixHQUEyQixlQUFlQSxnQkFBZixHQUFtQztBQUM1RCxNQUFJdEQsTUFBTSxHQUFHLE1BQU0sS0FBS0csVUFBTCxDQUFnQixRQUFoQixFQUEwQixrQkFBMUIsQ0FBbkI7QUFDQSxTQUFPckQsUUFBUSxDQUFDa0QsTUFBRCxFQUFTLEVBQVQsQ0FBUixLQUF5QixDQUFoQztBQUNELENBSEQ7O0FBVUE5RixPQUFPLENBQUNxSixlQUFSLEdBQTBCLGVBQWVBLGVBQWYsQ0FBZ0NDLEVBQWhDLEVBQW9DO0FBQzVELFFBQU0sS0FBSzdDLFVBQUwsQ0FBZ0IsUUFBaEIsRUFBMEIsa0JBQTFCLEVBQThDNkMsRUFBRSxHQUFHLENBQUgsR0FBTyxDQUF2RCxDQUFOO0FBQ0QsQ0FGRDs7QUFXQXRKLE9BQU8sQ0FBQ3VKLHFCQUFSLEdBQWdDLGVBQWVBLHFCQUFmLENBQXNDRCxFQUF0QyxFQUEwQztBQUN4RSxRQUFNLEtBQUtoSSxLQUFMLENBQVcsQ0FDZixJQURlLEVBQ1QsV0FEUyxFQUVmLElBRmUsRUFFVCxxQ0FGUyxFQUdmLE1BSGUsRUFHUCxPQUhPLEVBR0VnSSxFQUFFLEdBQUcsTUFBSCxHQUFZLE9BSGhCLENBQVgsQ0FBTjtBQUtELENBTkQ7O0FBYUF0SixPQUFPLENBQUN3SixRQUFSLEdBQW1CLGVBQWVBLFFBQWYsR0FBMkI7QUFDNUMsTUFBSTFELE1BQU0sR0FBRyxNQUFNLEtBQUtHLFVBQUwsQ0FBZ0IsUUFBaEIsRUFBMEIsU0FBMUIsQ0FBbkI7QUFDQSxTQUFRckQsUUFBUSxDQUFDa0QsTUFBRCxFQUFTLEVBQVQsQ0FBUixLQUF5QixDQUFqQztBQUNELENBSEQ7O0FBVUE5RixPQUFPLENBQUN5SixRQUFSLEdBQW1CLGVBQWVBLFFBQWYsR0FBMkI7QUFDNUMsTUFBSTNELE1BQU0sR0FBRyxNQUFNLEtBQUtHLFVBQUwsQ0FBZ0IsUUFBaEIsRUFBMEIsYUFBMUIsQ0FBbkI7QUFDQSxTQUFRckQsUUFBUSxDQUFDa0QsTUFBRCxFQUFTLEVBQVQsQ0FBUixLQUF5QixDQUFqQztBQUNELENBSEQ7O0FBYUE5RixPQUFPLENBQUMwSixjQUFSLEdBQXlCLGVBQWVBLGNBQWYsQ0FBK0I7QUFBQ0MsRUFBQUEsSUFBRDtBQUFPQyxFQUFBQTtBQUFQLENBQS9CLEVBQTZDQyxVQUFVLEdBQUcsS0FBMUQsRUFBaUU7QUFDeEYsTUFBSUMsb0JBQUtDLFFBQUwsQ0FBY0osSUFBZCxDQUFKLEVBQXlCO0FBQ3ZCLFVBQU0sS0FBS0ssWUFBTCxDQUFrQkwsSUFBbEIsRUFBd0JFLFVBQXhCLENBQU47QUFDRDs7QUFDRCxNQUFJQyxvQkFBS0MsUUFBTCxDQUFjSCxJQUFkLENBQUosRUFBeUI7QUFDdkIsVUFBTSxLQUFLSyxZQUFMLENBQWtCTCxJQUFsQixFQUF3QkMsVUFBeEIsQ0FBTjtBQUNEO0FBQ0YsQ0FQRDs7QUFlQTdKLE9BQU8sQ0FBQ2tLLGFBQVIsR0FBd0IsZUFBZUEsYUFBZixHQUFnQztBQUN0RCxNQUFJQyx1QkFBdUIsR0FBRyxNQUFNLEtBQUtsRSxVQUFMLENBQWdCLFFBQWhCLEVBQTBCLHlCQUExQixDQUFwQztBQUNBLE1BQUltRSwwQkFBMEIsR0FBRyxNQUFNLEtBQUtuRSxVQUFMLENBQWdCLFFBQWhCLEVBQTBCLDRCQUExQixDQUF2QztBQUNBLE1BQUlvRSxzQkFBc0IsR0FBRyxNQUFNLEtBQUtwRSxVQUFMLENBQWdCLFFBQWhCLEVBQTBCLHdCQUExQixDQUFuQztBQUNBLFNBQU96RixnQkFBRThFLElBQUYsQ0FBTyxDQUFDNkUsdUJBQUQsRUFBMEJDLDBCQUExQixFQUFzREMsc0JBQXRELENBQVAsRUFDUUMsT0FBRCxJQUFhQSxPQUFPLEtBQUssS0FEaEMsQ0FBUDtBQUVELENBTkQ7O0FBY0F0SyxPQUFPLENBQUN1SyxNQUFSLEdBQWlCLGVBQWVBLE1BQWYsQ0FBdUI3SSxJQUF2QixFQUE2QjtBQUM1QyxRQUFNLEtBQUtKLEtBQUwsQ0FBVyxDQUFDLElBQUQsRUFBTyxLQUFQLEVBQWNJLElBQWQsQ0FBWCxDQUFOO0FBQ0QsQ0FGRDs7QUFjQTFCLE9BQU8sQ0FBQ1ksSUFBUixHQUFlLGVBQWVBLElBQWYsQ0FBcUI0SixTQUFyQixFQUFnQzFHLFVBQWhDLEVBQTRDMkcsSUFBNUMsRUFBa0Q7QUFDL0QsUUFBTSxLQUFLNUcsS0FBTCxDQUFXbkMsY0FBS2dKLEtBQUwsQ0FBV0MsT0FBWCxDQUFtQjdHLFVBQW5CLENBQVgsQ0FBTjtBQUNBLFFBQU0sS0FBSzhHLE9BQUwsQ0FBYSxDQUFDLE1BQUQsRUFBU0osU0FBVCxFQUFvQjFHLFVBQXBCLENBQWIsRUFBOEMyRyxJQUE5QyxDQUFOO0FBQ0QsQ0FIRDs7QUFlQXpLLE9BQU8sQ0FBQzZLLElBQVIsR0FBZSxlQUFlQSxJQUFmLENBQXFCL0csVUFBckIsRUFBaUMwRyxTQUFqQyxFQUE0Q0MsSUFBSSxHQUFHLEVBQW5ELEVBQXVEO0FBQUE7O0FBRXBFLFFBQU0sS0FBS0csT0FBTCxDQUFhLENBQUMsTUFBRCxFQUFTOUcsVUFBVCxFQUFxQjBHLFNBQXJCLENBQWIsRUFBOEMsRUFBQyxHQUFHQyxJQUFKO0FBQVVLLElBQUFBLE9BQU8sbUJBQUVMLElBQUksQ0FBQ0ssT0FBUCx5REFBa0I7QUFBbkMsR0FBOUMsQ0FBTjtBQUNELENBSEQ7O0FBYUE5SyxPQUFPLENBQUMrSyxhQUFSLEdBQXdCLGVBQWVBLGFBQWYsQ0FBOEJDLFdBQTlCLEVBQTJDO0FBQ2pFLFNBQU8sQ0FBQ3hLLGdCQUFFTyxPQUFGLENBQVUsTUFBTSxLQUFLa0ssYUFBTCxDQUFtQkQsV0FBbkIsQ0FBaEIsQ0FBUjtBQUNELENBRkQ7O0FBUUFoTCxPQUFPLENBQUNrTCxjQUFSLEdBQXlCLGVBQWVBLGNBQWYsR0FBaUM7QUFDeERsSyxrQkFBSUMsS0FBSixDQUFXLHVCQUFYOztBQUNBLFFBQU1rSyxXQUFXLEdBQUcsTUFBTSxLQUFLUCxPQUFMLENBQWEsQ0FBQyxTQUFELEVBQVksUUFBWixDQUFiLENBQTFCO0FBQ0EsU0FBT08sV0FBVyxDQUFDakYsS0FBWixDQUFrQmtGLE9BQWxCLEVBQXVCL0UsTUFBdkIsQ0FBK0JnRixJQUFELElBQVUvRSxPQUFPLENBQUMrRSxJQUFJLENBQUN4SSxJQUFMLEVBQUQsQ0FBL0MsQ0FBUDtBQUNELENBSkQ7O0FBWUE3QyxPQUFPLENBQUNzTCxXQUFSLEdBQXNCLGVBQWVBLFdBQWYsQ0FBNEJDLFVBQTVCLEVBQXdDQyxVQUF4QyxFQUFvRDtBQUN4RXhLLGtCQUFJQyxLQUFKLENBQVcsc0JBQXFCc0ssVUFBVyxlQUFjQyxVQUFXLEVBQXBFOztBQUNBLFFBQU0sS0FBS1osT0FBTCxDQUFhLENBQUMsU0FBRCxFQUFhLE9BQU1XLFVBQVcsRUFBOUIsRUFBa0MsT0FBTUMsVUFBVyxFQUFuRCxDQUFiLENBQU47QUFDRCxDQUhEOztBQVlBeEwsT0FBTyxDQUFDeUwsaUJBQVIsR0FBNEIsZUFBZUEsaUJBQWYsQ0FBa0NGLFVBQWxDLEVBQThDO0FBQ3hFdkssa0JBQUlDLEtBQUosQ0FBVyw4Q0FBNkNzSyxVQUFXLEdBQW5FOztBQUNBLFFBQU0sS0FBS1gsT0FBTCxDQUFhLENBQUMsU0FBRCxFQUFhLFVBQWIsRUFBeUIsT0FBTVcsVUFBVyxFQUExQyxDQUFiLENBQU47QUFDRCxDQUhEOztBQVNBdkwsT0FBTyxDQUFDMEwsY0FBUixHQUF5QixlQUFlQSxjQUFmLEdBQWlDO0FBQ3hEMUssa0JBQUlDLEtBQUosQ0FBVywrQkFBWDs7QUFDQSxRQUFNa0ssV0FBVyxHQUFHLE1BQU0sS0FBS1AsT0FBTCxDQUFhLENBQUMsU0FBRCxFQUFZLFFBQVosQ0FBYixDQUExQjtBQUNBLFNBQU9PLFdBQVcsQ0FBQ2pGLEtBQVosQ0FBa0JrRixPQUFsQixFQUF1Qi9FLE1BQXZCLENBQStCZ0YsSUFBRCxJQUFVL0UsT0FBTyxDQUFDK0UsSUFBSSxDQUFDeEksSUFBTCxFQUFELENBQS9DLENBQVA7QUFDRCxDQUpEOztBQWFBN0MsT0FBTyxDQUFDMkwsV0FBUixHQUFzQixlQUFlQSxXQUFmLENBQTRCSCxVQUE1QixFQUF3Q0QsVUFBeEMsRUFBb0Q7QUFDeEV2SyxrQkFBSUMsS0FBSixDQUFXLHNCQUFxQnVLLFVBQVcsZUFBY0QsVUFBVyxFQUFwRTs7QUFDQSxRQUFNLEtBQUtYLE9BQUwsQ0FBYSxDQUFDLFNBQUQsRUFBYSxPQUFNWSxVQUFXLEVBQTlCLEVBQWtDLE9BQU1ELFVBQVcsRUFBbkQsQ0FBYixDQUFOO0FBQ0QsQ0FIRDs7QUFZQXZMLE9BQU8sQ0FBQzRMLGlCQUFSLEdBQTRCLGVBQWVBLGlCQUFmLENBQWtDSixVQUFsQyxFQUE4QztBQUN4RXhLLGtCQUFJQyxLQUFKLENBQVcsc0RBQXFEdUssVUFBVyxHQUEzRTs7QUFDQSxRQUFNLEtBQUtaLE9BQUwsQ0FBYSxDQUFDLFNBQUQsRUFBYSxVQUFiLEVBQXlCLE9BQU1ZLFVBQVcsRUFBMUMsQ0FBYixDQUFOO0FBQ0QsQ0FIRDs7QUFhQXhMLE9BQU8sQ0FBQzZMLG1CQUFSLEdBQThCLGVBQWVBLG1CQUFmLENBQW9DTixVQUFwQyxFQUFnREMsVUFBaEQsRUFBNEQ7QUFDeEZ4SyxrQkFBSUMsS0FBSixDQUFXLHNCQUFxQnNLLFVBQVcsd0JBQXVCQyxVQUFXLEVBQTdFOztBQUNBLFFBQU0sS0FBS1osT0FBTCxDQUFhLENBQUMsU0FBRCxFQUFhLE9BQU1XLFVBQVcsRUFBOUIsRUFBa0MsaUJBQWdCQyxVQUFXLEVBQTdELENBQWIsQ0FBTjtBQUNELENBSEQ7O0FBWUF4TCxPQUFPLENBQUM4TCxJQUFSLEdBQWUsZUFBZUEsSUFBZixHQUF1QjtBQUNwQyxNQUFJaEcsTUFBTSxHQUFHLE1BQU0sS0FBS3hFLEtBQUwsQ0FBVyxDQUFDLE1BQUQsRUFBUyxNQUFULENBQVgsQ0FBbkI7O0FBQ0EsTUFBSXdFLE1BQU0sQ0FBQ2lHLE9BQVAsQ0FBZSxNQUFmLE1BQTJCLENBQS9CLEVBQWtDO0FBQ2hDLFdBQU8sSUFBUDtBQUNEOztBQUNELFFBQU0sSUFBSXJMLEtBQUosQ0FBVyw2QkFBNEJvRixNQUFPLEVBQTlDLENBQU47QUFDRCxDQU5EOztBQWFBOUYsT0FBTyxDQUFDZ00sT0FBUixHQUFrQixlQUFlQSxPQUFmLEdBQTBCO0FBQzFDLE1BQUk7QUFDRixVQUFNLEtBQUtDLFVBQUwsRUFBTjtBQUNBLFVBQU0sS0FBS0MsVUFBTCxFQUFOO0FBQ0EsVUFBTSxLQUFLQyxhQUFMLENBQW1CLEVBQW5CLENBQU47QUFDQSxVQUFNLEtBQUtDLFdBQUwsQ0FBaUIsS0FBS0Msb0JBQXRCLENBQU47QUFDRCxHQUxELENBS0UsT0FBTzlLLENBQVAsRUFBVTtBQUNWLFVBQU0sSUFBSWIsS0FBSixDQUFXLG1DQUFrQ2EsQ0FBQyxDQUFDaUMsT0FBUSxFQUF2RCxDQUFOO0FBQ0Q7QUFDRixDQVREOztBQXNDQXhELE9BQU8sQ0FBQ29NLFdBQVIsR0FBc0IsZUFBZUEsV0FBZixDQUE0QjNCLElBQUksR0FBRyxFQUFuQyxFQUF1QztBQUMzRCxNQUFJLENBQUNqSyxnQkFBRU8sT0FBRixDQUFVLEtBQUt1TCxNQUFmLENBQUwsRUFBNkI7QUFDM0IsVUFBTSxJQUFJNUwsS0FBSixDQUFVLDBEQUFWLENBQU47QUFDRDs7QUFFRCxPQUFLNEwsTUFBTCxHQUFjLElBQUlDLGVBQUosQ0FBVztBQUN2QjNLLElBQUFBLEdBQUcsRUFBRSxLQUFLSCxVQURhO0FBRXZCUixJQUFBQSxLQUFLLEVBQUUsS0FGZ0I7QUFHdkJ1TCxJQUFBQSxVQUFVLEVBQUUsS0FIVztBQUl2QkMsSUFBQUEsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDLEtBQUtBO0FBSlIsR0FBWCxDQUFkO0FBTUEsUUFBTSxLQUFLSCxNQUFMLENBQVlJLFlBQVosQ0FBeUJqQyxJQUF6QixDQUFOO0FBQ0EsT0FBSzRCLG9CQUFMLEdBQTRCNUIsSUFBNUI7QUFDRCxDQWJEOztBQW1CQXpLLE9BQU8sQ0FBQ2lNLFVBQVIsR0FBcUIsZUFBZUEsVUFBZixHQUE2QjtBQUNoRCxNQUFJekwsZ0JBQUVPLE9BQUYsQ0FBVSxLQUFLdUwsTUFBZixDQUFKLEVBQTRCO0FBQzFCO0FBQ0Q7O0FBQ0QsTUFBSTtBQUNGLFVBQU0sS0FBS0EsTUFBTCxDQUFZSyxXQUFaLEVBQU47QUFDRCxHQUZELFNBRVU7QUFDUixTQUFLTCxNQUFMLEdBQWMsSUFBZDtBQUNEO0FBQ0YsQ0FURDs7QUFrQkF0TSxPQUFPLENBQUM0TSxhQUFSLEdBQXdCLFNBQVNBLGFBQVQsR0FBMEI7QUFDaEQsTUFBSXBNLGdCQUFFTyxPQUFGLENBQVUsS0FBS3VMLE1BQWYsQ0FBSixFQUE0QjtBQUMxQixVQUFNLElBQUk1TCxLQUFKLENBQVUsbURBQVYsQ0FBTjtBQUNEOztBQUNELFNBQU8sS0FBSzRMLE1BQUwsQ0FBWU8sT0FBWixFQUFQO0FBQ0QsQ0FMRDs7QUFjQTdNLE9BQU8sQ0FBQzhNLGlCQUFSLEdBQTRCLFNBQVNBLGlCQUFULENBQTRCQyxRQUE1QixFQUFzQztBQUNoRSxNQUFJdk0sZ0JBQUVPLE9BQUYsQ0FBVSxLQUFLdUwsTUFBZixDQUFKLEVBQTRCO0FBQzFCLFVBQU0sSUFBSTVMLEtBQUosQ0FBVSxvQ0FBVixDQUFOO0FBQ0Q7O0FBQ0QsT0FBSzRMLE1BQUwsQ0FBWWhELEVBQVosQ0FBZSxRQUFmLEVBQXlCeUQsUUFBekI7QUFDRCxDQUxEOztBQWNBL00sT0FBTyxDQUFDZ04sb0JBQVIsR0FBK0IsU0FBU0Esb0JBQVQsQ0FBK0JELFFBQS9CLEVBQXlDO0FBQ3RFLE1BQUl2TSxnQkFBRU8sT0FBRixDQUFVLEtBQUt1TCxNQUFmLENBQUosRUFBNEI7QUFDMUIsVUFBTSxJQUFJNUwsS0FBSixDQUFVLG9DQUFWLENBQU47QUFDRDs7QUFDRCxPQUFLNEwsTUFBTCxDQUFZVyxjQUFaLENBQTJCLFFBQTNCLEVBQXFDRixRQUFyQztBQUNELENBTEQ7O0FBZUEvTSxPQUFPLENBQUNrTixpQkFBUixHQUE0QixlQUFlQSxpQkFBZixHQUFvQztBQUM5RCxNQUFJLENBQUMxTSxnQkFBRTJNLFNBQUYsQ0FBWSxLQUFLQyxxQkFBakIsQ0FBTCxFQUE4QztBQUM1QyxRQUFJO0FBQ0YsV0FBS0EscUJBQUwsR0FBNkIsU0FBUzVILElBQVQsQ0FBYyxNQUFNLEtBQUtsRSxLQUFMLENBQVcsQ0FBQyxJQUFELEVBQU8sUUFBUCxDQUFYLENBQXBCLENBQTdCO0FBQ0QsS0FGRCxDQUVFLE9BQU9DLENBQVAsRUFBVTtBQUNWUCxzQkFBSUMsS0FBSixDQUFVTSxDQUFDLENBQUM4TCxLQUFaOztBQUNBLFdBQUtELHFCQUFMLEdBQTZCLEtBQTdCO0FBQ0Q7QUFDRjs7QUFDRCxTQUFPLE1BQU0sS0FBSzlMLEtBQUwsQ0FBVyxLQUFLOEwscUJBQUwsR0FBNkIsQ0FBQyxJQUFELEVBQU8sSUFBUCxDQUE3QixHQUE0QyxDQUFDLElBQUQsQ0FBdkQsQ0FBYjtBQUNELENBVkQ7O0FBb0JBcE4sT0FBTyxDQUFDc04sWUFBUixHQUF1QixlQUFlQSxZQUFmLENBQTZCQyxHQUE3QixFQUFrQztBQUN2RCxNQUFJaEssS0FBSyxDQUFDZ0ssR0FBRCxDQUFULEVBQWdCO0FBQ2QsVUFBTSxJQUFJN00sS0FBSixDQUFXLDBDQUF5QzZNLEdBQUksb0JBQXhELENBQU47QUFDRDs7QUFDREEsRUFBQUEsR0FBRyxHQUFHM0ssUUFBUSxDQUFDMkssR0FBRCxFQUFNLEVBQU4sQ0FBZDtBQUVBLFFBQU16SCxNQUFNLEdBQUcsTUFBTSxLQUFLb0gsaUJBQUwsRUFBckI7QUFDQSxRQUFNTSxVQUFVLEdBQUczTixnQkFBZ0IsQ0FBQ29FLElBQWpCLENBQXNCNkIsTUFBdEIsQ0FBbkI7O0FBQ0EsTUFBSSxDQUFDMEgsVUFBTCxFQUFpQjtBQUNmeE0sb0JBQUlDLEtBQUosQ0FBVTZFLE1BQVY7O0FBQ0EsVUFBTSxJQUFJcEYsS0FBSixDQUFXLDJDQUEwQzZNLEdBQUksR0FBekQsQ0FBTjtBQUNEOztBQUNELFFBQU1FLFNBQVMsR0FBR0QsVUFBVSxDQUFDLENBQUQsQ0FBVixDQUFjM0ssSUFBZCxHQUFxQnFELEtBQXJCLENBQTJCLEtBQTNCLENBQWxCO0FBQ0EsUUFBTXdILFFBQVEsR0FBR0QsU0FBUyxDQUFDMUIsT0FBVixDQUFrQnBNLGdCQUFsQixDQUFqQjtBQUtBLFFBQU1nTyxVQUFVLEdBQUdGLFNBQVMsQ0FBQzFCLE9BQVYsQ0FBa0JuTSx5QkFBbEIsSUFBK0M2TixTQUFTLENBQUMzTSxNQUE1RTtBQUNBLFFBQU04TSxRQUFRLEdBQUcsSUFBSTlOLE1BQUosQ0FBWSxVQUFTeU4sR0FBSSxTQUF6QixFQUFtQyxJQUFuQyxDQUFqQjtBQUNBLE1BQUlNLFdBQUo7O0FBQ0EsU0FBUUEsV0FBVyxHQUFHRCxRQUFRLENBQUMzSixJQUFULENBQWM2QixNQUFkLENBQXRCLEVBQThDO0FBQzVDLFVBQU1nSSxLQUFLLEdBQUdELFdBQVcsQ0FBQyxDQUFELENBQVgsQ0FBZWhMLElBQWYsR0FBc0JxRCxLQUF0QixDQUE0QixLQUE1QixDQUFkOztBQUNBLFFBQUl0RCxRQUFRLENBQUNrTCxLQUFLLENBQUNKLFFBQUQsQ0FBTixFQUFrQixFQUFsQixDQUFSLEtBQWtDSCxHQUFsQyxJQUF5Q08sS0FBSyxDQUFDQSxLQUFLLENBQUNoTixNQUFOLEdBQWU2TSxVQUFoQixDQUFsRCxFQUErRTtBQUM3RSxhQUFPRyxLQUFLLENBQUNBLEtBQUssQ0FBQ2hOLE1BQU4sR0FBZTZNLFVBQWhCLENBQVo7QUFDRDtBQUNGOztBQUNEM00sa0JBQUlDLEtBQUosQ0FBVTZFLE1BQVY7O0FBQ0EsUUFBTSxJQUFJcEYsS0FBSixDQUFXLDJDQUEwQzZNLEdBQUksR0FBekQsQ0FBTjtBQUNELENBN0JEOztBQXNDQXZOLE9BQU8sQ0FBQ2lMLGFBQVIsR0FBd0IsZUFBZUEsYUFBZixDQUE4QjhDLElBQTlCLEVBQW9DO0FBQzFEL00sa0JBQUlDLEtBQUosQ0FBVyx1QkFBc0I4TSxJQUFLLGFBQXRDOztBQUNBLE1BQUksQ0FBQyxLQUFLaEssWUFBTCxDQUFrQmdLLElBQWxCLENBQUwsRUFBOEI7QUFDNUIsVUFBTSxJQUFJck4sS0FBSixDQUFXLDBCQUF5QnFOLElBQUssR0FBekMsQ0FBTjtBQUNEOztBQUVELE1BQUksT0FBTSxLQUFLekwsV0FBTCxFQUFOLEtBQTRCLEVBQWhDLEVBQW9DO0FBQ2xDLFFBQUksQ0FBQzlCLGdCQUFFMk0sU0FBRixDQUFZLEtBQUthLGlCQUFqQixDQUFMLEVBQTBDO0FBRXhDLFlBQU1DLFdBQVcsR0FBR3pOLGdCQUFFcUMsSUFBRixDQUFPLE1BQU0sS0FBS3ZCLEtBQUwsQ0FBVyxDQUFDLHVCQUFELENBQVgsQ0FBYixDQUFwQjs7QUFDQSxXQUFLME0saUJBQUwsR0FBeUJwTCxRQUFRLENBQUNwQyxnQkFBRUcsSUFBRixDQUFPc04sV0FBVyxDQUFDL0gsS0FBWixDQUFrQixLQUFsQixDQUFQLENBQUQsRUFBbUMsRUFBbkMsQ0FBUixLQUFtRCxDQUE1RTs7QUFDQSxVQUFJLEtBQUs4SCxpQkFBVCxFQUE0QjtBQUMxQixhQUFLRSw2QkFBTCxHQUFxQyxTQUFTMUksSUFBVCxDQUFjeUksV0FBZCxDQUFyQztBQUNELE9BRkQsTUFFTztBQUNMLGFBQUtFLGlCQUFMLEdBQXlCdkwsUUFBUSxDQUFDLE1BQU0sS0FBS3RCLEtBQUwsQ0FBVyxDQUFDLG1DQUFELENBQVgsQ0FBUCxFQUEwRCxFQUExRCxDQUFSLEtBQTBFLENBQW5HO0FBQ0Q7QUFDRjs7QUFDRCxRQUFJLEtBQUswTSxpQkFBTCxJQUEwQixLQUFLRyxpQkFBbkMsRUFBc0Q7QUFDcEQsWUFBTUMsWUFBWSxHQUFHLEtBQUtKLGlCQUFMLEdBQ2hCLEtBQUtFLDZCQUFMLEdBQ0MsQ0FBQyxPQUFELEVBQVUsSUFBVixFQUFnQjFOLGdCQUFFNk4sWUFBRixDQUFnQixrQkFBaUJOLElBQUssaUJBQXRDLENBQWhCLENBREQsR0FHQyxDQUFFLFVBQVN2TixnQkFBRTZOLFlBQUYsQ0FBZU4sSUFBSSxDQUFDTyxLQUFMLENBQVcsQ0FBQzdPLHFCQUFaLENBQWYsQ0FBbUQsSUFBN0QsR0FDRSxhQUFZZSxnQkFBRTZOLFlBQUYsQ0FBZU4sSUFBSSxDQUFDTyxLQUFMLENBQVcsQ0FBWCxFQUFjN08scUJBQWQsQ0FBZixDQUFxRCxHQURwRSxDQUplLEdBTWpCLENBQUMsT0FBRCxFQUFVc08sSUFBVixDQU5KOztBQU9BLFVBQUk7QUFDRixlQUFPLENBQUMsTUFBTSxLQUFLek0sS0FBTCxDQUFXOE0sWUFBWCxDQUFQLEVBQ0psSSxLQURJLENBQ0UsS0FERixFQUVKQyxHQUZJLENBRUNvSSxDQUFELElBQU8zTCxRQUFRLENBQUMyTCxDQUFELEVBQUksRUFBSixDQUZmLEVBR0psSSxNQUhJLENBR0lrSSxDQUFELElBQU8vTixnQkFBRStCLFNBQUYsQ0FBWWdNLENBQVosQ0FIVixDQUFQO0FBSUQsT0FMRCxDQUtFLE9BQU9oTixDQUFQLEVBQVU7QUFHVixZQUFJQSxDQUFDLENBQUNtRyxJQUFGLEtBQVcsQ0FBZixFQUFrQjtBQUNoQixnQkFBTSxJQUFJaEgsS0FBSixDQUFXLG9DQUFtQ3FOLElBQUssTUFBS3hNLENBQUMsQ0FBQ2lDLE9BQVEsRUFBbEUsQ0FBTjtBQUNEOztBQUNELFlBQUloRCxnQkFBRTBILFFBQUYsQ0FBVzNHLENBQUMsQ0FBQ2tFLE1BQUYsSUFBWWxFLENBQUMsQ0FBQ3VFLE1BQXpCLEVBQWlDLGNBQWpDLENBQUosRUFBc0Q7QUFDcEQ5RSwwQkFBSTRELElBQUosQ0FBVSwwREFBeURyRCxDQUFDLENBQUNrRSxNQUFGLElBQVlsRSxDQUFDLENBQUN1RSxNQUFPLEVBQXhGO0FBQ0QsU0FGRCxNQUVPO0FBQ0wsaUJBQU8sRUFBUDtBQUNEO0FBQ0Y7QUFDRjtBQUNGOztBQUVEOUUsa0JBQUlDLEtBQUosQ0FBVSw4QkFBVjs7QUFDQSxRQUFNNkUsTUFBTSxHQUFHLE1BQU0sS0FBS29ILGlCQUFMLEVBQXJCO0FBQ0EsUUFBTU0sVUFBVSxHQUFHM04sZ0JBQWdCLENBQUNvRSxJQUFqQixDQUFzQjZCLE1BQXRCLENBQW5COztBQUNBLE1BQUksQ0FBQzBILFVBQUwsRUFBaUI7QUFDZnhNLG9CQUFJQyxLQUFKLENBQVU2RSxNQUFWOztBQUNBLFVBQU0sSUFBSXBGLEtBQUosQ0FBVyw2QkFBNEJxTixJQUFLLGtCQUE1QyxDQUFOO0FBQ0Q7O0FBQ0QsUUFBTU4sU0FBUyxHQUFHRCxVQUFVLENBQUMsQ0FBRCxDQUFWLENBQWMzSyxJQUFkLEdBQXFCcUQsS0FBckIsQ0FBMkIsS0FBM0IsQ0FBbEI7QUFDQSxRQUFNd0gsUUFBUSxHQUFHRCxTQUFTLENBQUMxQixPQUFWLENBQWtCcE0sZ0JBQWxCLENBQWpCO0FBQ0EsUUFBTTZPLElBQUksR0FBRyxFQUFiO0FBQ0EsUUFBTUMsZ0JBQWdCLEdBQUcsSUFBSTNPLE1BQUosQ0FBWSxzQkFBcUJVLGdCQUFFNk4sWUFBRixDQUFlTixJQUFmLENBQXFCLFNBQXRELEVBQWdFLElBQWhFLENBQXpCO0FBQ0EsTUFBSUYsV0FBSjs7QUFDQSxTQUFRQSxXQUFXLEdBQUdZLGdCQUFnQixDQUFDeEssSUFBakIsQ0FBc0I2QixNQUF0QixDQUF0QixFQUFzRDtBQUNwRCxVQUFNZ0ksS0FBSyxHQUFHRCxXQUFXLENBQUMsQ0FBRCxDQUFYLENBQWVoTCxJQUFmLEdBQXNCcUQsS0FBdEIsQ0FBNEIsS0FBNUIsQ0FBZDs7QUFDQSxRQUFJd0gsUUFBUSxJQUFJRCxTQUFTLENBQUMzTSxNQUF0QixJQUFnQ3lDLEtBQUssQ0FBQ3VLLEtBQUssQ0FBQ0osUUFBRCxDQUFOLENBQXpDLEVBQTREO0FBQzFEMU0sc0JBQUlDLEtBQUosQ0FBVTZFLE1BQVY7O0FBQ0EsWUFBTSxJQUFJcEYsS0FBSixDQUFXLDZCQUE0QnFOLElBQUssV0FBVUYsV0FBVyxDQUFDLENBQUQsQ0FBWCxDQUFlaEwsSUFBZixFQUFzQixHQUE1RSxDQUFOO0FBQ0Q7O0FBQ0QyTCxJQUFBQSxJQUFJLENBQUM1TixJQUFMLENBQVVnQyxRQUFRLENBQUNrTCxLQUFLLENBQUNKLFFBQUQsQ0FBTixFQUFrQixFQUFsQixDQUFsQjtBQUNEOztBQUNELFNBQU9jLElBQVA7QUFDRCxDQWxFRDs7QUEwRUF4TyxPQUFPLENBQUMwTyxtQkFBUixHQUE4QixlQUFlQSxtQkFBZixDQUFvQ1gsSUFBcEMsRUFBMEM7QUFDdEUsTUFBSTtBQUNGL00sb0JBQUlDLEtBQUosQ0FBVywwQkFBeUI4TSxJQUFLLFlBQXpDOztBQUNBLFVBQU1TLElBQUksR0FBRyxNQUFNLEtBQUt2RCxhQUFMLENBQW1COEMsSUFBbkIsQ0FBbkI7O0FBQ0EsUUFBSXZOLGdCQUFFTyxPQUFGLENBQVV5TixJQUFWLENBQUosRUFBcUI7QUFDbkJ4TixzQkFBSXlDLElBQUosQ0FBVSxPQUFNc0ssSUFBSywwQkFBckI7QUFDRCxLQUZELE1BRU87QUFDTCxZQUFNWSxrQkFBRUMsR0FBRixDQUFNSixJQUFJLENBQUNySSxHQUFMLENBQVVDLENBQUQsSUFBTyxLQUFLeUksZ0JBQUwsQ0FBc0J6SSxDQUF0QixDQUFoQixDQUFOLENBQU47QUFDRDtBQUNGLEdBUkQsQ0FRRSxPQUFPN0UsQ0FBUCxFQUFVO0FBQ1YsVUFBTSxJQUFJYixLQUFKLENBQVcsa0JBQWlCcU4sSUFBSywrQkFBOEJ4TSxDQUFDLENBQUNpQyxPQUFRLEVBQXpFLENBQU47QUFDRDtBQUNGLENBWkQ7O0FBc0JBeEQsT0FBTyxDQUFDNk8sZ0JBQVIsR0FBMkIsZUFBZUEsZ0JBQWYsQ0FBaUN0QixHQUFqQyxFQUFzQztBQUMvRHZNLGtCQUFJQyxLQUFKLENBQVcsOEJBQTZCc00sR0FBSSxFQUE1Qzs7QUFDQSxRQUFNdUIsYUFBYSxHQUFHLGlCQUF0Qjs7QUFDQSxNQUFJO0FBRUYsVUFBTSxLQUFLeE4sS0FBTCxDQUFXLENBQUMsTUFBRCxFQUFTaU0sR0FBVCxDQUFYLENBQU47QUFDRCxHQUhELENBR0UsT0FBT2hNLENBQVAsRUFBVTtBQUNWLFFBQUlmLGdCQUFFMEgsUUFBRixDQUFXM0csQ0FBQyxDQUFDa0UsTUFBYixFQUFxQnFKLGFBQXJCLENBQUosRUFBeUM7QUFDdkM7QUFDRDs7QUFDRCxRQUFJLENBQUN0TyxnQkFBRTBILFFBQUYsQ0FBVzNHLENBQUMsQ0FBQ2tFLE1BQWIsRUFBcUIseUJBQXJCLENBQUwsRUFBc0Q7QUFDcEQsWUFBTWxFLENBQU47QUFDRDs7QUFDRFAsb0JBQUl5QyxJQUFKLENBQVUsbUJBQWtCOEosR0FBSSxvREFBaEM7O0FBQ0EsUUFBSTtBQUNGLFlBQU0sS0FBS2pNLEtBQUwsQ0FBVyxDQUFDLE1BQUQsRUFBU2lNLEdBQVQsQ0FBWCxFQUEwQjtBQUM5QndCLFFBQUFBLFVBQVUsRUFBRTtBQURrQixPQUExQixDQUFOO0FBR0QsS0FKRCxDQUlFLE9BQU9DLEVBQVAsRUFBVztBQUNYLFVBQUl4TyxnQkFBRTBILFFBQUYsQ0FBVzhHLEVBQUUsQ0FBQ3ZKLE1BQWQsRUFBc0JxSixhQUF0QixDQUFKLEVBQTBDO0FBQ3hDO0FBQ0Q7O0FBQ0QsWUFBTUUsRUFBTjtBQUNEO0FBQ0Y7QUFDRixDQXpCRDs7QUFrQ0FoUCxPQUFPLENBQUNpUCxtQkFBUixHQUE4QixlQUFlQSxtQkFBZixDQUFvQ0MsTUFBcEMsRUFBNENsRSxXQUE1QyxFQUF5RDtBQUVyRixPQUFLbUUsU0FBTCxDQUFlRCxNQUFmO0FBRUEsTUFBSUUsS0FBSyxHQUFHQyxJQUFJLENBQUNDLEdBQUwsRUFBWjtBQUNBLE1BQUk5RyxTQUFTLEdBQUcsS0FBaEI7O0FBQ0EsTUFBSTtBQUNGLFdBQVE2RyxJQUFJLENBQUNDLEdBQUwsS0FBYUYsS0FBZCxHQUF1QjVHLFNBQTlCLEVBQXlDO0FBQ3ZDLFVBQUksTUFBTSxLQUFLdUMsYUFBTCxDQUFtQkMsV0FBbkIsQ0FBVixFQUEyQztBQUV6QyxjQUFNLHFCQUFNLEdBQU4sQ0FBTjtBQUNBO0FBQ0Q7O0FBQ0Q7QUFDRDs7QUFDRCxVQUFNLElBQUl0SyxLQUFKLENBQVcsNkJBQTRCOEgsU0FBVSxLQUFqRCxDQUFOO0FBQ0QsR0FWRCxDQVVFLE9BQU9qSCxDQUFQLEVBQVU7QUFDVixVQUFNLElBQUliLEtBQUosQ0FBVyxvREFBbURhLENBQUMsQ0FBQ2lDLE9BQVEsRUFBeEUsQ0FBTjtBQUNEO0FBQ0YsQ0FuQkQ7O0FBMkJBeEQsT0FBTyxDQUFDbVAsU0FBUixHQUFvQixlQUFlQSxTQUFmLENBQTBCRCxNQUExQixFQUFrQztBQUNwRCxNQUFJLENBQUMsS0FBS25MLFlBQUwsQ0FBa0JtTCxNQUFsQixDQUFMLEVBQWdDO0FBQzlCLFVBQU0sSUFBSXhPLEtBQUosQ0FBVyxrQkFBaUJ3TyxNQUFPLEVBQW5DLENBQU47QUFDRDs7QUFDRGxPLGtCQUFJQyxLQUFKLENBQVcsaUJBQWdCaU8sTUFBTyxFQUFsQzs7QUFDQSxRQUFNLEtBQUs1TixLQUFMLENBQVcsQ0FBQyxJQUFELEVBQU8sV0FBUCxFQUFvQixJQUFwQixFQUEwQjROLE1BQTFCLENBQVgsQ0FBTjtBQUNELENBTkQ7O0FBV0FsUCxPQUFPLENBQUN1UCxrQkFBUixHQUE2QixlQUFlQSxrQkFBZixHQUFxQztBQUNoRSxNQUFJLEtBQUtDLGNBQUwsSUFBdUIsS0FBS0EsY0FBTCxDQUFvQkMsU0FBL0MsRUFBMEQ7QUFDeEQsVUFBTSxLQUFLRCxjQUFMLENBQW9CRSxJQUFwQixFQUFOO0FBQ0Q7QUFDRixDQUpEOztBQWVBMVAsT0FBTyxDQUFDMlAsVUFBUixHQUFxQixlQUFlQSxVQUFmLENBQTJCeEwsR0FBM0IsRUFBZ0N5TCxRQUFoQyxFQUEwQ0MsY0FBMUMsRUFBMEQ7QUFDN0UsTUFBSUQsUUFBUSxDQUFDLENBQUQsQ0FBUixLQUFnQixHQUFwQixFQUF5QjtBQUN2QnpMLElBQUFBLEdBQUcsR0FBRyxFQUFOO0FBQ0Q7O0FBQ0QsTUFBSTJMLFdBQVcsR0FBRyxDQUFDM0wsR0FBRyxHQUFHeUwsUUFBUCxFQUFpQjdILE9BQWpCLENBQXlCLE1BQXpCLEVBQWlDLEdBQWpDLENBQWxCO0FBQ0EsTUFBSWpDLE1BQU0sR0FBRyxNQUFNLEtBQUt4RSxLQUFMLENBQVcsQ0FDNUIsSUFENEIsRUFDdEIsWUFEc0IsRUFFNUIsSUFGNEIsRUFFdEIsZUFGc0IsRUFHNUJ3TyxXQUg0QixFQUk1QkQsY0FKNEIsQ0FBWCxDQUFuQjs7QUFNQSxNQUFJL0osTUFBTSxDQUFDaUcsT0FBUCxDQUFlLFdBQWYsTUFBZ0MsQ0FBQyxDQUFyQyxFQUF3QztBQUN0QyxVQUFNLElBQUlyTCxLQUFKLENBQVcsNERBQTJEb0YsTUFBTSxDQUFDSSxLQUFQLENBQWEsSUFBYixFQUFtQixDQUFuQixDQUFzQixFQUE1RixDQUFOO0FBQ0Q7QUFDRixDQWREOztBQTBCQWxHLE9BQU8sQ0FBQytQLGVBQVIsR0FBMEIsZUFBZUEsZUFBZixDQUFnQ0MsZUFBaEMsRUFBaURDLE9BQWpELEVBQTBEQyxZQUExRCxFQUF3RTtBQUNoRyxNQUFJLENBQUMsS0FBS25NLFlBQUwsQ0FBa0JpTSxlQUFsQixDQUFMLEVBQXlDO0FBQ3ZDLFVBQU0sSUFBSXRQLEtBQUosQ0FBVyxpQkFBZ0JzUCxlQUFnQixFQUEzQyxDQUFOO0FBQ0Q7O0FBQ0QsU0FBTyxNQUFNLElBQUlyQixpQkFBSixDQUFNLE9BQU93QixPQUFQLEVBQWdCQyxNQUFoQixLQUEyQjtBQUM1QyxRQUFJalEsSUFBSSxHQUFHLEtBQUtzQixVQUFMLENBQWdCNE8sV0FBaEIsQ0FDUkMsTUFEUSxDQUNELENBQUMsT0FBRCxFQUFVLElBQVYsRUFBZ0IsWUFBaEIsRUFBOEIsSUFBOUIsRUFBb0MsVUFBcEMsRUFBZ0QsTUFBaEQsRUFBd0QsSUFBeEQsQ0FEQyxFQUVSQSxNQUZRLENBRUQsQ0FBQ04sZUFBRCxDQUZDLENBQVg7O0FBR0FoUCxvQkFBSUMsS0FBSixDQUFXLGtDQUFpQyxDQUFDLEtBQUtRLFVBQUwsQ0FBZ0JDLElBQWpCLEVBQXVCNE8sTUFBdkIsQ0FBOEJuUSxJQUE5QixFQUFvQ1UsSUFBcEMsQ0FBeUMsR0FBekMsQ0FBOEMsRUFBMUY7O0FBQ0EsUUFBSTtBQUVGLFdBQUsyTyxjQUFMLEdBQXNCLElBQUllLHdCQUFKLENBQWUsS0FBSzlPLFVBQUwsQ0FBZ0JDLElBQS9CLEVBQXFDdkIsSUFBckMsQ0FBdEI7QUFDQSxZQUFNLEtBQUtxUCxjQUFMLENBQW9CSixLQUFwQixDQUEwQixDQUExQixDQUFOO0FBQ0EsV0FBS0ksY0FBTCxDQUFvQmxHLEVBQXBCLENBQXVCLFFBQXZCLEVBQWlDLENBQUN4RCxNQUFELEVBQVNMLE1BQVQsS0FBb0I7QUFDbkQsWUFBSUEsTUFBSixFQUFZO0FBQ1YySyxVQUFBQSxNQUFNLENBQUMsSUFBSTFQLEtBQUosQ0FBVyxrREFBaUQrRSxNQUFPLEVBQW5FLENBQUQsQ0FBTjtBQUNEO0FBQ0YsT0FKRDtBQUtBLFlBQU0sS0FBSytLLGVBQUwsQ0FBcUJQLE9BQXJCLEVBQThCQyxZQUE5QixDQUFOO0FBQ0FDLE1BQUFBLE9BQU87QUFDUixLQVhELENBV0UsT0FBTzVPLENBQVAsRUFBVTtBQUNWNk8sTUFBQUEsTUFBTSxDQUFDLElBQUkxUCxLQUFKLENBQVcsNENBQTJDYSxDQUFDLENBQUNpQyxPQUFRLEVBQWhFLENBQUQsQ0FBTjtBQUNEO0FBQ0YsR0FuQlksQ0FBYjtBQW9CRCxDQXhCRDs7QUFrQ0F4RCxPQUFPLENBQUMwQyxpQkFBUixHQUE0QixlQUFlQSxpQkFBZixDQUFrQytOLFFBQWxDLEVBQTRDO0FBQ3RFLE1BQUkzSyxNQUFNLEdBQUcsTUFBTSxLQUFLeEUsS0FBTCxDQUFXLENBQUMsU0FBRCxFQUFZbVAsUUFBWixDQUFYLENBQW5CO0FBQ0EsTUFBSUMsR0FBRyxHQUFHNUssTUFBTSxDQUFDakQsSUFBUCxFQUFWOztBQUNBN0Isa0JBQUlDLEtBQUosQ0FBVyw0QkFBMkJ3UCxRQUFTLE1BQUtDLEdBQUksRUFBeEQ7O0FBQ0EsU0FBT0EsR0FBUDtBQUNELENBTEQ7O0FBc0JBMVEsT0FBTyxDQUFDMlEsaUJBQVIsR0FBNEIsZUFBZUEsaUJBQWYsQ0FBa0NDLElBQWxDLEVBQXdDRixHQUF4QyxFQUE2Q2pHLElBQUksR0FBRyxFQUFwRCxFQUF3RDtBQUNsRixRQUFNO0FBQUNzRSxJQUFBQSxVQUFVLEdBQUc7QUFBZCxNQUFzQnRFLElBQTVCOztBQUNBekosa0JBQUlDLEtBQUosQ0FBVyw0QkFBMkIyUCxJQUFLLFNBQVFGLEdBQUksR0FBdkQ7O0FBQ0EsUUFBTSxLQUFLcFAsS0FBTCxDQUFXLENBQUMsU0FBRCxFQUFZc1AsSUFBWixFQUFrQkYsR0FBbEIsQ0FBWCxFQUFtQztBQUN2QzNCLElBQUFBO0FBRHVDLEdBQW5DLENBQU47QUFHRCxDQU5EOztBQVdBL08sT0FBTyxDQUFDNlEsb0JBQVIsR0FBK0IsZUFBZUEsb0JBQWYsR0FBdUM7QUFDcEUsU0FBTyxNQUFNLEtBQUtuTyxpQkFBTCxDQUF1QixzQkFBdkIsQ0FBYjtBQUNELENBRkQ7O0FBT0ExQyxPQUFPLENBQUM4USxtQkFBUixHQUE4QixlQUFlQSxtQkFBZixHQUFzQztBQUNsRSxTQUFPLE1BQU0sS0FBS3BPLGlCQUFMLENBQXVCLHFCQUF2QixDQUFiO0FBQ0QsQ0FGRDs7QUFPQTFDLE9BQU8sQ0FBQytRLGtCQUFSLEdBQTZCLGVBQWVBLGtCQUFmLEdBQXFDO0FBQ2hFLFNBQU8sTUFBTSxLQUFLck8saUJBQUwsQ0FBdUIsb0JBQXZCLENBQWI7QUFDRCxDQUZEOztBQU9BMUMsT0FBTyxDQUFDZ1Isd0JBQVIsR0FBbUMsZUFBZUEsd0JBQWYsR0FBMkM7QUFDNUUsU0FBTyxNQUFNLEtBQUt0TyxpQkFBTCxDQUF1Qiw0QkFBdkIsQ0FBYjtBQUNELENBRkQ7O0FBT0ExQyxPQUFPLENBQUNpUix1QkFBUixHQUFrQyxlQUFlQSx1QkFBZixHQUEwQztBQUMxRSxTQUFPLE1BQU0sS0FBS3ZPLGlCQUFMLENBQXVCLDBCQUF2QixDQUFiO0FBQ0QsQ0FGRDs7QUFPQTFDLE9BQU8sQ0FBQ2tSLHNCQUFSLEdBQWlDLGVBQWVBLHNCQUFmLEdBQXlDO0FBQ3hFLFNBQU8sTUFBTSxLQUFLeE8saUJBQUwsQ0FBdUIsbUJBQXZCLENBQWI7QUFDRCxDQUZEOztBQU9BMUMsT0FBTyxDQUFDbVIsUUFBUixHQUFtQixlQUFlQSxRQUFmLEdBQTJCO0FBQzVDLFNBQU8sTUFBTSxLQUFLek8saUJBQUwsQ0FBdUIsa0JBQXZCLENBQWI7QUFDRCxDQUZEOztBQU9BMUMsT0FBTyxDQUFDb1IsZUFBUixHQUEwQixlQUFlQSxlQUFmLEdBQWtDO0FBQzFELFNBQU8sTUFBTSxLQUFLMU8saUJBQUwsQ0FBdUIseUJBQXZCLENBQWI7QUFDRCxDQUZEOztBQVVBMUMsT0FBTyxDQUFDcVIsYUFBUixHQUF3QixlQUFlQSxhQUFmLEdBQWdDO0FBQ3RELE1BQUl2TCxNQUFNLEdBQUcsTUFBTSxLQUFLeEUsS0FBTCxDQUFXLENBQUMsSUFBRCxFQUFPLE1BQVAsQ0FBWCxDQUFuQjtBQUNBLE1BQUlnUSxJQUFJLEdBQUcsSUFBSXhSLE1BQUosQ0FBVyw4QkFBWCxFQUEyQ21FLElBQTNDLENBQWdENkIsTUFBaEQsQ0FBWDs7QUFDQSxNQUFJd0wsSUFBSSxJQUFJQSxJQUFJLENBQUN4USxNQUFMLElBQWUsQ0FBM0IsRUFBOEI7QUFDNUIsV0FBT3dRLElBQUksQ0FBQyxDQUFELENBQUosQ0FBUXpPLElBQVIsRUFBUDtBQUNEOztBQUNELFNBQU8sSUFBUDtBQUNELENBUEQ7O0FBZUE3QyxPQUFPLENBQUN1UixnQkFBUixHQUEyQixlQUFlQSxnQkFBZixHQUFtQztBQUM1RCxNQUFJekwsTUFBTSxHQUFHLE1BQU0sS0FBS3hFLEtBQUwsQ0FBVyxDQUFDLElBQUQsRUFBTyxTQUFQLENBQVgsQ0FBbkI7QUFDQSxNQUFJa1EsT0FBTyxHQUFHLElBQUkxUixNQUFKLENBQVcsaUNBQVgsRUFBOENtRSxJQUE5QyxDQUFtRDZCLE1BQW5ELENBQWQ7O0FBQ0EsTUFBSTBMLE9BQU8sSUFBSUEsT0FBTyxDQUFDMVEsTUFBUixJQUFrQixDQUFqQyxFQUFvQztBQUNsQyxRQUFJMlEsYUFBYSxHQUFHN08sUUFBUSxDQUFDNE8sT0FBTyxDQUFDLENBQUQsQ0FBUCxDQUFXM08sSUFBWCxFQUFELEVBQW9CLEVBQXBCLENBQTVCO0FBQ0EsV0FBT1UsS0FBSyxDQUFDa08sYUFBRCxDQUFMLEdBQXVCLElBQXZCLEdBQThCQSxhQUFyQztBQUNEOztBQUNELFNBQU8sSUFBUDtBQUNELENBUkQ7O0FBaUJBelIsT0FBTyxDQUFDMFIsWUFBUixHQUF1QixlQUFlQSxZQUFmLENBQTZCQyxTQUE3QixFQUF3Q0MsU0FBeEMsRUFBbUQ7QUFDeEUsTUFBSUMsS0FBSyxHQUFJLEdBQUVGLFNBQVUsSUFBR0MsU0FBVSxFQUF0Qzs7QUFDQSxNQUFJcFIsZ0JBQUVzUixXQUFGLENBQWNILFNBQWQsQ0FBSixFQUE4QjtBQUM1QixVQUFNLElBQUlqUixLQUFKLENBQVcsMERBQXlEbVIsS0FBTSxFQUExRSxDQUFOO0FBQ0Q7O0FBQ0QsTUFBSXJSLGdCQUFFc1IsV0FBRixDQUFjRixTQUFkLENBQUosRUFBOEI7QUFDNUIsVUFBTSxJQUFJbFIsS0FBSixDQUFXLHlEQUF3RG1SLEtBQU0sRUFBekUsQ0FBTjtBQUNEOztBQUVELFFBQU1FLGdCQUFnQixHQUFHLENBQ3ZCLENBQUMsWUFBRCxFQUFlRixLQUFmLENBRHVCLEVBRXZCLENBQUMsd0JBQUQsRUFBMkJGLFNBQTNCLENBRnVCLEVBR3ZCLENBQUMsd0JBQUQsRUFBMkJDLFNBQTNCLENBSHVCLENBQXpCOztBQUtBLE9BQUssTUFBTSxDQUFDSSxVQUFELEVBQWFDLFlBQWIsQ0FBWCxJQUF5Q0YsZ0JBQXpDLEVBQTJEO0FBQ3pELFVBQU0sS0FBS3RMLFVBQUwsQ0FBZ0IsUUFBaEIsRUFBMEJ1TCxVQUExQixFQUFzQ0MsWUFBdEMsQ0FBTjtBQUNEO0FBQ0YsQ0FqQkQ7O0FBdUJBalMsT0FBTyxDQUFDa1MsZUFBUixHQUEwQixlQUFlQSxlQUFmLEdBQWtDO0FBQzFELFFBQU1ILGdCQUFnQixHQUFHLENBQ3ZCLFlBRHVCLEVBRXZCLHdCQUZ1QixFQUd2Qix3QkFIdUIsRUFJdkIsa0NBSnVCLENBQXpCOztBQU1BLE9BQUssTUFBTXpILE9BQVgsSUFBc0J5SCxnQkFBdEIsRUFBd0M7QUFDdEMsVUFBTSxLQUFLelEsS0FBTCxDQUFXLENBQUMsVUFBRCxFQUFhLFFBQWIsRUFBdUIsUUFBdkIsRUFBaUNnSixPQUFqQyxDQUFYLENBQU47QUFDRDtBQUNGLENBVkQ7O0FBcUJBdEssT0FBTyxDQUFDeUcsVUFBUixHQUFxQixlQUFlQSxVQUFmLENBQTJCMEwsU0FBM0IsRUFBc0M3SCxPQUF0QyxFQUErQzNELEtBQS9DLEVBQXNEO0FBQ3pFLFNBQU8sTUFBTSxLQUFLckYsS0FBTCxDQUFXLENBQUMsVUFBRCxFQUFhLEtBQWIsRUFBb0I2USxTQUFwQixFQUErQjdILE9BQS9CLEVBQXdDM0QsS0FBeEMsQ0FBWCxDQUFiO0FBQ0QsQ0FGRDs7QUFZQTNHLE9BQU8sQ0FBQ2lHLFVBQVIsR0FBcUIsZUFBZUEsVUFBZixDQUEyQmtNLFNBQTNCLEVBQXNDN0gsT0FBdEMsRUFBK0M7QUFDbEUsU0FBTyxNQUFNLEtBQUtoSixLQUFMLENBQVcsQ0FBQyxVQUFELEVBQWEsS0FBYixFQUFvQjZRLFNBQXBCLEVBQStCN0gsT0FBL0IsQ0FBWCxDQUFiO0FBQ0QsQ0FGRDs7QUFXQXRLLE9BQU8sQ0FBQ29TLFNBQVIsR0FBb0IsZUFBZUEsU0FBZixDQUEwQnRILE9BQU8sR0FBRyxNQUFwQyxFQUE0QztBQUM5RCxTQUFPLE1BQU0sS0FBS0YsT0FBTCxDQUFhLENBQUMsV0FBRCxDQUFiLEVBQTRCO0FBQUNFLElBQUFBO0FBQUQsR0FBNUIsQ0FBYjtBQUNELENBRkQ7O0FBNkJBOUssT0FBTyxDQUFDcVMsWUFBUixHQUF1QixTQUFTQSxZQUFULENBQXVCQyxXQUF2QixFQUFvQ0MsT0FBTyxHQUFHLEVBQTlDLEVBQWtEO0FBQ3ZFLFFBQU1sUixHQUFHLEdBQUcsQ0FBQyxjQUFELENBQVo7QUFDQSxRQUFNO0FBQ0ptUixJQUFBQSxTQURJO0FBRUpDLElBQUFBLE9BRkk7QUFHSkMsSUFBQUEsU0FISTtBQUlKQyxJQUFBQTtBQUpJLE1BS0ZKLE9BTEo7O0FBTUEsTUFBSXpJLG9CQUFLQyxRQUFMLENBQWN5SSxTQUFkLENBQUosRUFBOEI7QUFDNUJuUixJQUFBQSxHQUFHLENBQUNULElBQUosQ0FBUyxRQUFULEVBQW1CNFIsU0FBbkI7QUFDRDs7QUFDRCxNQUFJMUksb0JBQUtDLFFBQUwsQ0FBYzJJLFNBQWQsQ0FBSixFQUE4QjtBQUM1QnJSLElBQUFBLEdBQUcsQ0FBQ1QsSUFBSixDQUFTLGNBQVQsRUFBeUI4UixTQUF6QjtBQUNEOztBQUNELE1BQUk1SSxvQkFBS0MsUUFBTCxDQUFjMEksT0FBZCxDQUFKLEVBQTRCO0FBQzFCcFIsSUFBQUEsR0FBRyxDQUFDVCxJQUFKLENBQVMsWUFBVCxFQUF1QjZSLE9BQXZCO0FBQ0Q7O0FBQ0QsTUFBSUUsU0FBSixFQUFlO0FBQ2J0UixJQUFBQSxHQUFHLENBQUNULElBQUosQ0FBUyxhQUFUO0FBQ0Q7O0FBQ0RTLEVBQUFBLEdBQUcsQ0FBQ1QsSUFBSixDQUFTMFIsV0FBVDtBQUVBLFFBQU1NLE9BQU8sR0FBRyxDQUNkLEdBQUcsS0FBS25SLFVBQUwsQ0FBZ0I0TyxXQURMLEVBRWQsT0FGYyxFQUdkLEdBQUdoUCxHQUhXLENBQWhCOztBQUtBTCxrQkFBSUMsS0FBSixDQUFXLDREQUEyRDZJLG9CQUFLK0ksS0FBTCxDQUFXRCxPQUFYLENBQW9CLEVBQTFGOztBQUNBLFNBQU8sSUFBSXJDLHdCQUFKLENBQWUsS0FBSzlPLFVBQUwsQ0FBZ0JDLElBQS9CLEVBQXFDa1IsT0FBckMsQ0FBUDtBQUNELENBN0JEOztBQXVDQTVTLE9BQU8sQ0FBQzhTLGVBQVIsR0FBMEIsZUFBZUEsZUFBZixDQUFnQ0MsR0FBaEMsRUFBcUNDLEVBQXJDLEVBQXlDO0FBQ2pFLFFBQU1DLFdBQVcsR0FBRyxNQUFNLEtBQUszTCxVQUFMLEVBQTFCOztBQUNBLE1BQUkyTCxXQUFXLEtBQUtGLEdBQXBCLEVBQXlCO0FBQ3ZCL1Isb0JBQUlDLEtBQUosQ0FBVyxvQ0FBbUM4UixHQUFJLGlDQUFsRDtBQUNELEdBRkQsTUFFTztBQUNMLFVBQU0sS0FBSzdMLFNBQUwsQ0FBZTZMLEdBQWYsQ0FBTjtBQUNBLFVBQU0sS0FBSzFMLE1BQUwsQ0FBWTBMLEdBQVosQ0FBTjtBQUVBLFVBQU1wRSxrQkFBRXVFLEtBQUYsQ0FBUSxHQUFSLENBQU47QUFDRDs7QUFDRCxNQUFJO0FBQ0YsV0FBTyxNQUFNRixFQUFFLEVBQWY7QUFDRCxHQUZELFNBRVU7QUFDUixRQUFJQyxXQUFXLEtBQUtGLEdBQXBCLEVBQXlCO0FBQ3ZCLFlBQU0sS0FBSzFMLE1BQUwsQ0FBWTRMLFdBQVosQ0FBTjtBQUNEO0FBQ0Y7QUFDRixDQWpCRDs7QUEwQkFqVCxPQUFPLENBQUNtVCxXQUFSLEdBQXNCLGVBQWVBLFdBQWYsR0FBOEI7QUFDbERuUyxrQkFBSUMsS0FBSixDQUFVLDBCQUFWOztBQUNBLE1BQUk7QUFDRixXQUFPLE1BQU0sS0FBS3lCLGlCQUFMLENBQXVCLHNCQUF2QixDQUFiO0FBQ0QsR0FGRCxDQUVFLE9BQU9uQixDQUFQLEVBQVU7QUFDVixVQUFNLElBQUliLEtBQUosQ0FBVywyQ0FBMENhLENBQUMsQ0FBQ2lDLE9BQVEsRUFBL0QsQ0FBTjtBQUNEO0FBQ0YsQ0FQRDs7QUE0QkF4RCxPQUFPLENBQUNvVCxZQUFSLEdBQXVCLGVBQWVBLFlBQWYsR0FBK0I7QUFDcEQsT0FBS0MsaUJBQUwsR0FBeUIsS0FBS0EsaUJBQUwsSUFDcEI3UyxnQkFBRThTLE9BQUYsQ0FBVSxZQUFZLE1BQU0sS0FBSzFJLE9BQUwsQ0FBYSxDQUFDLFVBQUQsQ0FBYixDQUE1QixFQUF3RCxNQUFNLEtBQUsySSxXQUFuRSxDQURMOztBQUVBLE1BQUk7QUFDRixXQUFPLENBQUMsTUFBTSxLQUFLRixpQkFBTCxFQUFQLEVBQ0puTixLQURJLENBQ0UsS0FERixFQUVKQyxHQUZJLENBRUNvSSxDQUFELElBQU9BLENBQUMsQ0FBQzFMLElBQUYsRUFGUCxFQUdKd0QsTUFISSxDQUdHQyxPQUhILENBQVA7QUFJRCxHQUxELENBS0UsT0FBTy9FLENBQVAsRUFBVTtBQUNWLFFBQUlmLGdCQUFFMEgsUUFBRixDQUFXM0csQ0FBQyxDQUFDa0UsTUFBYixFQUFxQixpQkFBckIsQ0FBSixFQUE2QztBQUMzQyxhQUFPLEVBQVA7QUFDRDs7QUFDRCxVQUFNbEUsQ0FBTjtBQUNEO0FBQ0YsQ0FkRDs7QUE2QkF2QixPQUFPLENBQUN3VCwwQkFBUixHQUFxQyxlQUFlQSwwQkFBZixHQUE2QztBQUNoRixRQUFNQyxLQUFLLEdBQUdDLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQixJQUF0QixDQUFkO0FBQ0FGLEVBQUFBLEtBQUssQ0FBQ0csV0FBTixHQUFvQkgsS0FBSyxDQUFDRyxXQUFOLEtBQXFCLE1BQU0sS0FBS2hKLE9BQUwsQ0FBYSxDQUFDLE1BQUQsQ0FBYixDQUEzQixDQUFwQjtBQUNBLFNBQU82SSxLQUFLLENBQUNHLFdBQU4sQ0FBa0IxTCxRQUFsQixDQUEyQixhQUEzQixLQUNGLENBQUMsTUFBTSxLQUFLa0wsWUFBTCxFQUFQLEVBQTRCbEwsUUFBNUIsQ0FBcUMsS0FBckMsQ0FETDtBQUVELENBTEQ7O0FBZUFsSSxPQUFPLENBQUM2VCw2QkFBUixHQUF3QyxlQUFlQSw2QkFBZixHQUFnRDtBQUN0RixRQUFNO0FBQUNDLElBQUFBO0FBQUQsTUFBVyxNQUFNLEtBQUtDLFVBQUwsRUFBdkI7O0FBQ0EsTUFBSSxDQUFDRCxNQUFMLEVBQWE7QUFDWCxXQUFPLEtBQVA7QUFDRDs7QUFDRCxTQUFPaEssb0JBQUtrSyxlQUFMLENBQXFCRixNQUFNLENBQUNHLE9BQTVCLEVBQXFDLElBQXJDLEVBQTJDLFFBQTNDLEtBQ0YsQ0FBQyxNQUFNLEtBQUtiLFlBQUwsRUFBUCxFQUE0QmxMLFFBQTVCLENBQXFDLFVBQXJDLENBREw7QUFFRCxDQVBEOztBQWlCQWxJLE9BQU8sQ0FBQ2tVLHNCQUFSLEdBQWlDLGVBQWVBLHNCQUFmLEdBQXlDO0FBQ3hFLE1BQUksT0FBTSxLQUFLNVIsV0FBTCxFQUFOLElBQTJCLEVBQS9CLEVBQW1DO0FBRWpDLFdBQU8sRUFBUDtBQUNEOztBQUVEdEIsa0JBQUl5QyxJQUFKLENBQVMsb0NBQVQ7O0FBQ0EsUUFBTTBRLE1BQU0sR0FBRyxNQUFNLEtBQUs3UyxLQUFMLENBQVcsQ0FBQyxTQUFELEVBQVksWUFBWixFQUEwQixXQUExQixDQUFYLENBQXJCO0FBQ0EsU0FBT2QsZ0JBQUVxQyxJQUFGLENBQU9zUixNQUFQLEVBQWVqTyxLQUFmLENBQXFCLElBQXJCLEVBQ0pDLEdBREksQ0FDQ2tGLElBQUQsSUFBVTdLLGdCQUFFcUMsSUFBRixDQUFPd0ksSUFBUCxDQURWLEVBRUpoRixNQUZJLENBRUdDLE9BRkgsQ0FBUDtBQUdELENBWEQ7O0FBc0JBdEcsT0FBTyxDQUFDb1Usd0JBQVIsR0FBbUMsZUFBZUEsd0JBQWYsQ0FBeUMsR0FBR0MsUUFBNUMsRUFBc0Q7QUFDdkYsTUFBSTdULGdCQUFFTyxPQUFGLENBQVVzVCxRQUFWLEtBQXVCLE9BQU0sS0FBSy9SLFdBQUwsRUFBTixJQUEyQixFQUF0RCxFQUEwRDtBQUV4RCxXQUFPLEtBQVA7QUFDRDs7QUFFRHRCLGtCQUFJeUMsSUFBSixDQUFVLFVBQVNxRyxvQkFBS3dLLFNBQUwsQ0FBZSxTQUFmLEVBQTBCRCxRQUFRLENBQUN2VCxNQUFuQyxDQUEyQyxJQUFHSSxJQUFJLENBQUNDLFNBQUwsQ0FBZWtULFFBQWYsQ0FBeUIsb0JBQTFGOztBQUNBLFFBQU0sS0FBS3BVLFdBQUwsQ0FBa0JrRSxHQUFELElBQVMsQ0FBQyxTQUFELEVBQVksWUFBWixFQUEwQixXQUExQixFQUF3QyxJQUFHQSxHQUFJLEVBQS9DLENBQTFCLEVBQTZFa1EsUUFBN0UsQ0FBTjtBQUNBLFNBQU8sSUFBUDtBQUNELENBVEQ7O2VBV2VyVSxPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgZ2V0SU1FTGlzdEZyb21PdXRwdXQsIGdldFN1cmZhY2VPcmllbnRhdGlvbiwgZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMsXG59IGZyb20gJy4uL2hlbHBlcnMuanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgTG9nY2F0IGZyb20gJy4uL2xvZ2NhdCc7XG5pbXBvcnQgeyBzbGVlcCwgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFN1YlByb2Nlc3MgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5jb25zdCBNQVhfU0hFTExfQlVGRkVSX0xFTkdUSCA9IDEwMDA7XG5jb25zdCBOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SID0gL25vdCBhIGNoYW5nZWFibGUgcGVybWlzc2lvbiB0eXBlL2k7XG5jb25zdCBJR05PUkVEX1BFUk1fRVJST1JTID0gW1xuICBOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SLFxuICAvVW5rbm93biBwZXJtaXNzaW9uL2ksXG5dO1xuY29uc3QgTUFYX1BHUkVQX1BBVFRFUk5fTEVOID0gMTU7XG5jb25zdCBISURERU5fQVBJX1BPTElDWV9LRVlTID0gW1xuICAnaGlkZGVuX2FwaV9wb2xpY3lfcHJlX3BfYXBwcycsXG4gICdoaWRkZW5fYXBpX3BvbGljeV9wX2FwcHMnLFxuICAnaGlkZGVuX2FwaV9wb2xpY3knXG5dO1xuY29uc3QgUElEX0NPTFVNTl9USVRMRSA9ICdQSUQnO1xuY29uc3QgUFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRSA9ICdOQU1FJztcbmNvbnN0IFBTX1RJVExFX1BBVFRFUk4gPSBuZXcgUmVnRXhwKGBeKC4qXFxcXGIke1BJRF9DT0xVTU5fVElUTEV9XFxcXGIuKlxcXFxiJHtQUk9DRVNTX05BTUVfQ09MVU1OX1RJVExFfVxcXFxiLiopJGAsICdtJyk7XG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNTc5MTQyMy9hZGItc2hlbGwtaW5wdXQtdGV4dC1kb2VzLW5vdC10YWtlLWFtcGVyc2FuZC1jaGFyYWN0ZXIvMjU3OTE0OThcbmNvbnN0IEFEQl9JTlBVVF9FU0NBUEVfUEFUVEVSTiA9IC9bKCk8Pnw7JipcXFxcfl5cIiddL2c7XG5cbmNvbnN0IG1ldGhvZHMgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGNodW5rcyBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50cyBhbmQgZXhlY3V0ZXMgdGhlbSBpbiBgYWRiIHNoZWxsYC5cbiAqIFRoaXMgaXMgZmFzdGVyIHRoYW4gY2FsbGluZyBgYWRiIHNoZWxsYCBzZXBhcmF0ZWx5IGZvciBlYWNoIGFyZywgaG93ZXZlclxuICogdGhlcmUgaXMgYSBsaW1pdCBmb3IgYSBtYXhpbXVtIGxlbmd0aCBvZiBhIHNpbmdsZSBhZGIgY29tbWFuZC4gdGhhdCBpcyB3aHlcbiAqIHdlIG5lZWQgYWxsIHRoaXMgY29tcGxpY2F0ZWQgbG9naWMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXJnVHJhbnNmb3JtZXIgQSBmdW5jdGlvbiwgdGhhdCByZWNlaXZlcyBzaW5nbGUgYXJndW1lbnRcbiAqIGZyb20gdGhlIGBhcmdzYCBhcnJheSBhbmQgdHJhbnNmb3JtcyBpdCBpbnRvIGEgc2hlbGwgY29tbWFuZC4gVGhlIHJlc3VsdFxuICogb2YgdGhlIGZ1bmN0aW9uIG11c3QgYmUgYW4gYXJyYXksIHdoZXJlIGVhY2ggaXRlbSBpcyBhIHBhcnQgb2YgYSBzaW5nbGUgY29tbWFuZC5cbiAqIFRoZSBsYXN0IGl0ZW0gb2YgdGhlIGFycmF5IGNvdWxkIGJlICc7Jy4gSWYgdGhpcyBpcyBub3QgYSBzZW1pY29sb24gdGhlbiBpdCBpcyBnb2luZyB0b1xuICogYmUgYWRkZWQgYXV0b21hdGljYWxseS5cbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyfHN0cmluZz59IGFyZ3MgQXJyYXkgb2YgYXJndW1lbnQgdmFsdWVzIHRvIGNyZWF0ZSBjaHVua3MgZm9yXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYW55IG9mIHRoZSBjaHVua3MgcmV0dXJucyBub24temVybyBleGl0IGNvZGUgYWZ0ZXIgYmVpbmcgZXhlY3V0ZWRcbiAqL1xubWV0aG9kcy5zaGVsbENodW5rcyA9IGFzeW5jIGZ1bmN0aW9uIHNoZWxsQ2h1bmtzIChhcmdUcmFuc2Zvcm1lciwgYXJncykge1xuICBjb25zdCBjb21tYW5kcyA9IFtdO1xuICBsZXQgY21kQ2h1bmsgPSBbXTtcbiAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgIGNvbnN0IG5leHRDbWQgPSBhcmdUcmFuc2Zvcm1lcihhcmcpO1xuICAgIGlmICghXy5pc0FycmF5KG5leHRDbWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FyZ3VtZW50IHRyYW5zZm9ybWVyIG11c3QgcmVzdWx0IGluIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIGlmIChfLmxhc3QobmV4dENtZCkgIT09ICc7Jykge1xuICAgICAgbmV4dENtZC5wdXNoKCc7Jyk7XG4gICAgfVxuICAgIGlmIChuZXh0Q21kLmpvaW4oJyAnKS5sZW5ndGggKyBjbWRDaHVuay5qb2luKCcgJykubGVuZ3RoID49IE1BWF9TSEVMTF9CVUZGRVJfTEVOR1RIKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKGNtZENodW5rKTtcbiAgICAgIGNtZENodW5rID0gW107XG4gICAgfVxuICAgIGNtZENodW5rID0gWy4uLmNtZENodW5rLCAuLi5uZXh0Q21kXTtcbiAgfVxuICBpZiAoIV8uaXNFbXB0eShjbWRDaHVuaykpIHtcbiAgICBjb21tYW5kcy5wdXNoKGNtZENodW5rKTtcbiAgfVxuICBsb2cuZGVidWcoYEdvdCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgY2h1bmtzIHRvIGV4ZWN1dGU6ICR7SlNPTi5zdHJpbmdpZnkoY29tbWFuZHMpfWApO1xuICBsZXQgbGFzdEVycm9yID0gbnVsbDtcbiAgZm9yIChjb25zdCBjbWQgb2YgY29tbWFuZHMpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zaGVsbChjbWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxhc3RFcnJvciA9IGU7XG4gICAgfVxuICB9XG4gIGlmIChsYXN0RXJyb3IpIHtcbiAgICB0aHJvdyBsYXN0RXJyb3I7XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IHRoZSBwYXRoIHRvIGFkYiBleGVjdXRhYmxlIGFtZCBhc3NpZ24gaXRcbiAqIHRvIHRoaXMuZXhlY3V0YWJsZS5wYXRoIGFuZCB0aGlzLmJpbmFyaWVzLmFkYiBwcm9wZXJ0aWVzLlxuICpcbiAqIEByZXR1cm4ge0FEQn0gQURCIGluc3RhbmNlLlxuICovXG5tZXRob2RzLmdldEFkYldpdGhDb3JyZWN0QWRiUGF0aCA9IGFzeW5jIGZ1bmN0aW9uIGdldEFkYldpdGhDb3JyZWN0QWRiUGF0aCAoKSB7XG4gIHRoaXMuZXhlY3V0YWJsZS5wYXRoID0gYXdhaXQgdGhpcy5nZXRTZGtCaW5hcnlQYXRoKCdhZGInKTtcbiAgcmV0dXJuIHRoaXMuYWRiO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgcGF0aCB0byBhYXB0IHRvb2wgYW5kIGFzc2lnbiBpdCB0b1xuICogdGhpcy5iaW5hcmllcy5hYXB0IHByb3BlcnR5XG4gKi9cbm1ldGhvZHMuaW5pdEFhcHQgPSBhc3luYyBmdW5jdGlvbiBpbml0QWFwdCAoKSB7XG4gIGF3YWl0IHRoaXMuZ2V0U2RrQmluYXJ5UGF0aCgnYWFwdCcpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgcGF0aCB0byBhYXB0MiB0b29sIGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuYWFwdDIgcHJvcGVydHlcbiAqL1xubWV0aG9kcy5pbml0QWFwdDIgPSBhc3luYyBmdW5jdGlvbiBpbml0QWFwdDIgKCkge1xuICBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ2FhcHQyJyk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZnVsbCBwYXRoIHRvIHppcGFsaWduIHRvb2wgYW5kIGFzc2lnbiBpdCB0b1xuICogdGhpcy5iaW5hcmllcy56aXBhbGlnbiBwcm9wZXJ0eVxuICovXG5tZXRob2RzLmluaXRaaXBBbGlnbiA9IGFzeW5jIGZ1bmN0aW9uIGluaXRaaXBBbGlnbiAoKSB7XG4gIGF3YWl0IHRoaXMuZ2V0U2RrQmluYXJ5UGF0aCgnemlwYWxpZ24nKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBmdWxsIHBhdGggdG8gYnVuZGxldG9vbCBiaW5hcnkgYW5kIGFzc2lnbiBpdCB0b1xuICogdGhpcy5iaW5hcmllcy5idW5kbGV0b29sIHByb3BlcnR5XG4gKi9cbm1ldGhvZHMuaW5pdEJ1bmRsZXRvb2wgPSBhc3luYyBmdW5jdGlvbiBpbml0QnVuZGxldG9vbCAoKSB7XG4gIHRyeSB7XG4gICAgdGhpcy5iaW5hcmllcy5idW5kbGV0b29sID0gYXdhaXQgZnMud2hpY2goJ2J1bmRsZXRvb2wuamFyJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcignYnVuZGxldG9vbC5qYXIgYmluYXJ5IGlzIGV4cGVjdGVkIHRvIGJlIHByZXNlbnQgaW4gUEFUSC4gJyArXG4gICAgICAnVmlzaXQgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9idW5kbGV0b29sIGZvciBtb3JlIGRldGFpbHMuJyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIEFQSSBsZXZlbCBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgQVBJIGxldmVsIGFzIGludGVnZXIgbnVtYmVyLCBmb3IgZXhhbXBsZSAyMSBmb3JcbiAqICAgICAgICAgICAgICAgICAgQW5kcm9pZCBMb2xsaXBvcC4gVGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpcyBjYWNoZWQsIHNvIGFsbCB0aGUgZnVydGhlclxuICogY2FsbHMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBmaXJzdCBvbmUuXG4gKi9cbm1ldGhvZHMuZ2V0QXBpTGV2ZWwgPSBhc3luYyBmdW5jdGlvbiBnZXRBcGlMZXZlbCAoKSB7XG4gIGlmICghXy5pc0ludGVnZXIodGhpcy5fYXBpTGV2ZWwpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0ck91dHB1dCA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLmJ1aWxkLnZlcnNpb24uc2RrJyk7XG4gICAgICBsZXQgYXBpTGV2ZWwgPSBwYXJzZUludChzdHJPdXRwdXQudHJpbSgpLCAxMCk7XG5cbiAgICAgIC8vIFdvcmthcm91bmQgZm9yIHByZXZpZXcvYmV0YSBwbGF0Zm9ybSBBUEkgbGV2ZWxcbiAgICAgIGNvbnN0IGNoYXJDb2RlUSA9ICdxJy5jaGFyQ29kZUF0KDApO1xuICAgICAgLy8gMjggaXMgdGhlIGZpcnN0IEFQSSBMZXZlbCwgd2hlcmUgQW5kcm9pZCBTREsgc3RhcnRlZCByZXR1cm5pbmcgbGV0dGVycyBpbiByZXNwb25zZSB0byBnZXRQbGF0Zm9ybVZlcnNpb25cbiAgICAgIGNvbnN0IGFwaUxldmVsRGlmZiA9IGFwaUxldmVsIC0gMjg7XG4gICAgICBjb25zdCBjb2RlbmFtZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGVRICsgYXBpTGV2ZWxEaWZmKTtcbiAgICAgIGlmIChhcGlMZXZlbERpZmYgPj0gMCAmJiAoYXdhaXQgdGhpcy5nZXRQbGF0Zm9ybVZlcnNpb24oKSkudG9Mb3dlckNhc2UoKSA9PT0gY29kZW5hbWUpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBSZWxlYXNlIHZlcnNpb24gaXMgJHtjb2RlbmFtZS50b1VwcGVyQ2FzZSgpfSBidXQgZm91bmQgQVBJIExldmVsICR7YXBpTGV2ZWx9LiBTZXR0aW5nIEFQSSBMZXZlbCB0byAke2FwaUxldmVsICsgMX1gKTtcbiAgICAgICAgYXBpTGV2ZWwrKztcbiAgICAgIH1cblxuICAgICAgdGhpcy5fYXBpTGV2ZWwgPSBhcGlMZXZlbDtcbiAgICAgIGxvZy5kZWJ1ZyhgRGV2aWNlIEFQSSBsZXZlbDogJHt0aGlzLl9hcGlMZXZlbH1gKTtcbiAgICAgIGlmIChpc05hTih0aGlzLl9hcGlMZXZlbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgYWN0dWFsIG91dHB1dCAnJHtzdHJPdXRwdXR9JyBjYW5ub3QgYmUgY29udmVydGVkIHRvIGFuIGludGVnZXJgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgZGV2aWNlIEFQSSBsZXZlbC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcy5fYXBpTGV2ZWw7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwbGF0Zm9ybSB2ZXJzaW9uIGFzIGEgc3RyaW5nLCBmb3IgZXhhbXBsZSAnNS4wJyBmb3JcbiAqIEFuZHJvaWQgTG9sbGlwb3AuXG4gKi9cbm1ldGhvZHMuZ2V0UGxhdGZvcm1WZXJzaW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0UGxhdGZvcm1WZXJzaW9uICgpIHtcbiAgbG9nLmluZm8oJ0dldHRpbmcgZGV2aWNlIHBsYXRmb3JtIHZlcnNpb24nKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8uYnVpbGQudmVyc2lvbi5yZWxlYXNlJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgZGV2aWNlIHBsYXRmb3JtIHZlcnNpb24uIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBWZXJpZnkgd2hldGhlciBhIGRldmljZSBpcyBjb25uZWN0ZWQuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhdCBsZWFzdCBvbmUgZGV2aWNlIGlzIHZpc2libGUgdG8gYWRiLlxuICovXG5tZXRob2RzLmlzRGV2aWNlQ29ubmVjdGVkID0gYXN5bmMgZnVuY3Rpb24gaXNEZXZpY2VDb25uZWN0ZWQgKCkge1xuICBsZXQgZGV2aWNlcyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGVkRGV2aWNlcygpO1xuICByZXR1cm4gZGV2aWNlcy5sZW5ndGggPiAwO1xufTtcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjcmVhdGUgYSBuZXcgZm9sZGVyIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBuZXcgcGF0aCB0byBiZSBjcmVhdGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBta2RpciBjb21tYW5kIG91dHB1dC5cbiAqL1xubWV0aG9kcy5ta2RpciA9IGFzeW5jIGZ1bmN0aW9uIG1rZGlyIChyZW1vdGVQYXRoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnbWtkaXInLCAnLXAnLCByZW1vdGVQYXRoXSk7XG59O1xuXG4vKipcbiAqIFZlcmlmeSB3aGV0aGVyIHRoZSBnaXZlbiBhcmd1bWVudCBpcyBhXG4gKiB2YWxpZCBjbGFzcyBuYW1lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc1N0cmluZyAtIFRoZSBhY3R1YWwgY2xhc3MgbmFtZSB0byBiZSB2ZXJpZmllZC5cbiAqIEByZXR1cm4gez9BcnJheS48TWF0Y2g+fSBUaGUgcmVzdWx0IG9mIFJlZ2V4cC5leGVjIG9wZXJhdGlvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIF9udWxsXyBpZiBubyBtYXRjaGVzIGFyZSBmb3VuZC5cbiAqL1xubWV0aG9kcy5pc1ZhbGlkQ2xhc3MgPSBmdW5jdGlvbiBpc1ZhbGlkQ2xhc3MgKGNsYXNzU3RyaW5nKSB7XG4gIC8vIHNvbWUucGFja2FnZS9zb21lLnBhY2thZ2UuQWN0aXZpdHlcbiAgcmV0dXJuIG5ldyBSZWdFeHAoL15bYS16QS1aMC05Li9fXSskLykuZXhlYyhjbGFzc1N0cmluZyk7XG59O1xuXG4vKipcbiAqIEZvcmNlIGFwcGxpY2F0aW9uIHRvIHN0b3Agb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHN0b3BwZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuXG4gKi9cbm1ldGhvZHMuZm9yY2VTdG9wID0gYXN5bmMgZnVuY3Rpb24gZm9yY2VTdG9wIChwa2cpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydhbScsICdmb3JjZS1zdG9wJywgcGtnXSk7XG59O1xuXG4vKlxuICogS2lsbCBhcHBsaWNhdGlvblxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHN0b3BwZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuXG4gKi9cbm1ldGhvZHMua2lsbFBhY2thZ2UgPSBhc3luYyBmdW5jdGlvbiBraWxsUGFja2FnZSAocGtnKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnYW0nLCAna2lsbCcsIHBrZ10pO1xufTtcblxuLyoqXG4gKiBDbGVhciB0aGUgdXNlciBkYXRhIG9mIHRoZSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uIG9uIHRoZSBkZXZpY2VcbiAqIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgY2xlYXJlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC5cbiAqL1xubWV0aG9kcy5jbGVhciA9IGFzeW5jIGZ1bmN0aW9uIGNsZWFyIChwa2cpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydwbScsICdjbGVhcicsIHBrZ10pO1xufTtcblxuLyoqXG4gKiBHcmFudCBhbGwgcGVybWlzc2lvbnMgcmVxdWVzdGVkIGJ5IHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKiBUaGlzIG1ldGhvZCBpcyBvbmx5IHVzZWZ1bCBvbiBBbmRyb2lkIDYuMCsgYW5kIGZvciBhcHBsaWNhdGlvbnNcbiAqIHRoYXQgc3VwcG9ydCBjb21wb25lbnRzLWJhc2VkIHBlcm1pc3Npb25zIHNldHRpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IGFwayAtIFRoZSBwYXRoIHRvIHRoZSBhY3R1YWwgYXBrIGZpbGUuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGdyYW50aW5nIHBlcm1pc3Npb25zXG4gKi9cbm1ldGhvZHMuZ3JhbnRBbGxQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdyYW50QWxsUGVybWlzc2lvbnMgKHBrZywgYXBrKSB7XG4gIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpO1xuICBsZXQgdGFyZ2V0U2RrID0gMDtcbiAgbGV0IGR1bXBzeXNPdXRwdXQgPSBudWxsO1xuICB0cnkge1xuICAgIGlmICghYXBrKSB7XG4gICAgICAvKipcbiAgICAgICAqIElmIGFwayBub3QgcHJvdmlkZWQsIGNvbnNpZGVyaW5nIGFwayBhbHJlYWR5IGluc3RhbGxlZCBvbiB0aGUgZGV2aWNlXG4gICAgICAgKiBhbmQgZmV0Y2hpbmcgdGFyZ2V0U2RrIHVzaW5nIHBhY2thZ2UgbmFtZS5cbiAgICAgICAqL1xuICAgICAgZHVtcHN5c091dHB1dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgICAgIHRhcmdldFNkayA9IGF3YWl0IHRoaXMudGFyZ2V0U2RrVmVyc2lvblVzaW5nUEtHKHBrZywgZHVtcHN5c091dHB1dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldFNkayA9IGF3YWl0IHRoaXMudGFyZ2V0U2RrVmVyc2lvbkZyb21NYW5pZmVzdChhcGspO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vYXZvaWRpbmcgbG9nZ2luZyBlcnJvciBzdGFjaywgYXMgY2FsbGluZyBsaWJyYXJ5IGZ1bmN0aW9uIHdvdWxkIGhhdmUgbG9nZ2VkXG4gICAgbG9nLndhcm4oYFJhbiBpbnRvIHByb2JsZW0gZ2V0dGluZyB0YXJnZXQgU0RLIHZlcnNpb247IGlnbm9yaW5nLi4uYCk7XG4gIH1cbiAgaWYgKGFwaUxldmVsID49IDIzICYmIHRhcmdldFNkayA+PSAyMykge1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBkZXZpY2UgaXMgcnVubmluZyBBbmRyb2lkIDYuMChBUEkgMjMpIG9yIGhpZ2hlciwgYW5kIHlvdXIgYXBwJ3MgdGFyZ2V0IFNESyBpcyAyMyBvciBoaWdoZXI6XG4gICAgICogVGhlIGFwcCBoYXMgdG8gbGlzdCB0aGUgcGVybWlzc2lvbnMgaW4gdGhlIG1hbmlmZXN0LlxuICAgICAqIHJlZmVyOiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS90cmFpbmluZy9wZXJtaXNzaW9ucy9yZXF1ZXN0aW5nLmh0bWxcbiAgICAgKi9cbiAgICBkdW1wc3lzT3V0cHV0ID0gZHVtcHN5c091dHB1dCB8fCBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gICAgY29uc3QgcmVxdWVzdGVkUGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLmdldFJlcVBlcm1pc3Npb25zKHBrZywgZHVtcHN5c091dHB1dCk7XG4gICAgY29uc3QgZ3JhbnRlZFBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5nZXRHcmFudGVkUGVybWlzc2lvbnMocGtnLCBkdW1wc3lzT3V0cHV0KTtcbiAgICBjb25zdCBwZXJtaXNzaW9uc1RvR3JhbnQgPSBfLmRpZmZlcmVuY2UocmVxdWVzdGVkUGVybWlzc2lvbnMsIGdyYW50ZWRQZXJtaXNzaW9ucyk7XG4gICAgaWYgKF8uaXNFbXB0eShwZXJtaXNzaW9uc1RvR3JhbnQpKSB7XG4gICAgICBsb2cuaW5mbyhgJHtwa2d9IGNvbnRhaW5zIG5vIHBlcm1pc3Npb25zIGF2YWlsYWJsZSBmb3IgZ3JhbnRpbmdgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5ncmFudFBlcm1pc3Npb25zKHBrZywgcGVybWlzc2lvbnNUb0dyYW50KTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR3JhbnQgbXVsdGlwbGUgcGVybWlzc2lvbnMgZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKiBUaGlzIGNhbGwgaXMgbW9yZSBwZXJmb3JtYW50IHRoYW4gYGdyYW50UGVybWlzc2lvbmAgb25lLCBzaW5jZSBpdCBjb21iaW5lc1xuICogbXVsdGlwbGUgYGFkYiBzaGVsbGAgY2FsbHMgaW50byBhIHNpbmdsZSBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gcGVybWlzc2lvbnMgLSBUaGUgbGlzdCBvZiBwZXJtaXNzaW9ucyB0byBiZSBncmFudGVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9ucy5cbiAqL1xubWV0aG9kcy5ncmFudFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ3JhbnRQZXJtaXNzaW9ucyAocGtnLCBwZXJtaXNzaW9ucykge1xuICAvLyBBcyBpdCBjb25zdW1lcyBtb3JlIHRpbWUgZm9yIGdyYW50aW5nIGVhY2ggcGVybWlzc2lvbixcbiAgLy8gdHJ5aW5nIHRvIGdyYW50IGFsbCBwZXJtaXNzaW9uIGJ5IGZvcm1pbmcgZXF1aXZhbGVudCBjb21tYW5kLlxuICAvLyBBbHNvLCBpdCBpcyBuZWNlc3NhcnkgdG8gc3BsaXQgbG9uZyBjb21tYW5kcyBpbnRvIGNodW5rcywgc2luY2UgdGhlIG1heGltdW0gbGVuZ3RoIG9mXG4gIC8vIGFkYiBzaGVsbCBidWZmZXIgaXMgbGltaXRlZFxuICBsb2cuZGVidWcoYEdyYW50aW5nIHBlcm1pc3Npb25zICR7SlNPTi5zdHJpbmdpZnkocGVybWlzc2lvbnMpfSB0byAnJHtwa2d9J2ApO1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGxDaHVua3MoKHBlcm0pID0+IFsncG0nLCAnZ3JhbnQnLCBwa2csIHBlcm1dLCBwZXJtaXNzaW9ucyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIUlHTk9SRURfUEVSTV9FUlJPUlMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KGUuc3RkZXJyIHx8IGUubWVzc2FnZSkpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHcmFudCBzaW5nbGUgcGVybWlzc2lvbiBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGVybWlzc2lvbiAtIFRoZSBmdWxsIG5hbWUgb2YgdGhlIHBlcm1pc3Npb24gdG8gYmUgZ3JhbnRlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnMuXG4gKi9cbm1ldGhvZHMuZ3JhbnRQZXJtaXNzaW9uID0gYXN5bmMgZnVuY3Rpb24gZ3JhbnRQZXJtaXNzaW9uIChwa2csIHBlcm1pc3Npb24pIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsncG0nLCAnZ3JhbnQnLCBwa2csIHBlcm1pc3Npb25dKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUi50ZXN0KGUuc3RkZXJyIHx8IGUubWVzc2FnZSkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIFJldm9rZSBzaW5nbGUgcGVybWlzc2lvbiBmcm9tIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IHBlcm1pc3Npb24gLSBUaGUgZnVsbCBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uIHRvIGJlIHJldm9rZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zLlxuICovXG5tZXRob2RzLnJldm9rZVBlcm1pc3Npb24gPSBhc3luYyBmdW5jdGlvbiByZXZva2VQZXJtaXNzaW9uIChwa2csIHBlcm1pc3Npb24pIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsncG0nLCAncmV2b2tlJywgcGtnLCBwZXJtaXNzaW9uXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIU5PVF9DSEFOR0VBQkxFX1BFUk1fRVJST1IudGVzdChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBncmFudGVkIHBlcm1pc3Npb25zIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjbWRPdXRwdXQgW251bGxdIC0gT3B0aW9uYWwgcGFyYW1ldGVyIGNvbnRhaW5pbmcgY29tbWFuZCBvdXRwdXQgb2ZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2R1bXBzeXMgcGFja2FnZV8gY29tbWFuZC4gSXQgbWF5IHNwZWVkIHVwIHRoZSBtZXRob2QgZXhlY3V0aW9uLlxuICogQHJldHVybiB7QXJyYXk8U3RyaW5nPn0gVGhlIGxpc3Qgb2YgZ3JhbnRlZCBwZXJtaXNzaW9ucyBvciBhbiBlbXB0eSBsaXN0LlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9ucy5cbiAqL1xubWV0aG9kcy5nZXRHcmFudGVkUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBnZXRHcmFudGVkUGVybWlzc2lvbnMgKHBrZywgY21kT3V0cHV0ID0gbnVsbCkge1xuICBsb2cuZGVidWcoJ1JldHJpZXZpbmcgZ3JhbnRlZCBwZXJtaXNzaW9ucycpO1xuICBjb25zdCBzdGRvdXQgPSBjbWRPdXRwdXQgfHwgYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICByZXR1cm4gZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMoc3Rkb3V0LCBbJ2luc3RhbGwnLCAncnVudGltZSddLCB0cnVlKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgZGVuaWVkIHBlcm1pc3Npb25zIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjbWRPdXRwdXQgW251bGxdIC0gT3B0aW9uYWwgcGFyYW1ldGVyIGNvbnRhaW5pbmcgY29tbWFuZCBvdXRwdXQgb2ZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2R1bXBzeXMgcGFja2FnZV8gY29tbWFuZC4gSXQgbWF5IHNwZWVkIHVwIHRoZSBtZXRob2QgZXhlY3V0aW9uLlxuICogQHJldHVybiB7QXJyYXk8U3RyaW5nPn0gVGhlIGxpc3Qgb2YgZGVuaWVkIHBlcm1pc3Npb25zIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGVuaWVkUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBnZXREZW5pZWRQZXJtaXNzaW9ucyAocGtnLCBjbWRPdXRwdXQgPSBudWxsKSB7XG4gIGxvZy5kZWJ1ZygnUmV0cmlldmluZyBkZW5pZWQgcGVybWlzc2lvbnMnKTtcbiAgY29uc3Qgc3Rkb3V0ID0gY21kT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgcmV0dXJuIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zKHN0ZG91dCwgWydpbnN0YWxsJywgJ3J1bnRpbWUnXSwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiByZXF1ZXN0ZWQgcGVybWlzc2lvbnMgZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IGNtZE91dHB1dCBbbnVsbF0gLSBPcHRpb25hbCBwYXJhbWV0ZXIgY29udGFpbmluZyBjb21tYW5kIG91dHB1dCBvZlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZHVtcHN5cyBwYWNrYWdlXyBjb21tYW5kLiBJdCBtYXkgc3BlZWQgdXAgdGhlIG1ldGhvZCBleGVjdXRpb24uXG4gKiBAcmV0dXJuIHtBcnJheTxTdHJpbmc+fSBUaGUgbGlzdCBvZiByZXF1ZXN0ZWQgcGVybWlzc2lvbnMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5nZXRSZXFQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdldFJlcVBlcm1pc3Npb25zIChwa2csIGNtZE91dHB1dCA9IG51bGwpIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIHJlcXVlc3RlZCBwZXJtaXNzaW9ucycpO1xuICBjb25zdCBzdGRvdXQgPSBjbWRPdXRwdXQgfHwgYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICByZXR1cm4gZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMoc3Rkb3V0LCBbJ3JlcXVlc3RlZCddKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgbG9jYXRpb24gcHJvdmlkZXJzIGZvciB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBsb2NhdGlvbiBwcm92aWRlcnMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5nZXRMb2NhdGlvblByb3ZpZGVycyA9IGFzeW5jIGZ1bmN0aW9uIGdldExvY2F0aW9uUHJvdmlkZXJzICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnc2VjdXJlJywgJ2xvY2F0aW9uX3Byb3ZpZGVyc19hbGxvd2VkJyk7XG4gIHJldHVybiBzdGRvdXQudHJpbSgpLnNwbGl0KCcsJylcbiAgICAubWFwKChwKSA9PiBwLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufTtcblxuLyoqXG4gKiBUb2dnbGUgdGhlIHN0YXRlIG9mIEdQUyBsb2NhdGlvbiBwcm92aWRlci5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRvIGVuYWJsZSAodHJ1ZSkgb3IgZGlzYWJsZSAoZmFsc2UpIHRoZSBHUFMgcHJvdmlkZXIuXG4gKi9cbm1ldGhvZHMudG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIgKGVuYWJsZWQpIHtcbiAgYXdhaXQgdGhpcy5zZXRTZXR0aW5nKCdzZWN1cmUnLCAnbG9jYXRpb25fcHJvdmlkZXJzX2FsbG93ZWQnLCBgJHtlbmFibGVkID8gJysnIDogJy0nfWdwc2ApO1xufTtcblxuLyoqXG4gKiBTZXQgaGlkZGVuIGFwaSBwb2xpY3kgdG8gbWFuYWdlIGFjY2VzcyB0byBub24tU0RLIEFQSXMuXG4gKiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9wcmV2aWV3L3Jlc3RyaWN0aW9ucy1ub24tc2RrLWludGVyZmFjZXNcbiAqXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHZhbHVlIC0gVGhlIEFQSSBlbmZvcmNlbWVudCBwb2xpY3kuXG4gKiAgICAgRm9yIEFuZHJvaWQgUFxuICogICAgIDA6IERpc2FibGUgbm9uLVNESyBBUEkgdXNhZ2UgZGV0ZWN0aW9uLiBUaGlzIHdpbGwgYWxzbyBkaXNhYmxlIGxvZ2dpbmcsIGFuZCBhbHNvIGJyZWFrIHRoZSBzdHJpY3QgbW9kZSBBUEksXG4gKiAgICAgICAgZGV0ZWN0Tm9uU2RrQXBpVXNhZ2UoKS4gTm90IHJlY29tbWVuZGVkLlxuICogICAgIDE6IFwiSnVzdCB3YXJuXCIgLSBwZXJtaXQgYWNjZXNzIHRvIGFsbCBub24tU0RLIEFQSXMsIGJ1dCBrZWVwIHdhcm5pbmdzIGluIHRoZSBsb2cuXG4gKiAgICAgICAgVGhlIHN0cmljdCBtb2RlIEFQSSB3aWxsIGtlZXAgd29ya2luZy5cbiAqICAgICAyOiBEaXNhbGxvdyB1c2FnZSBvZiBkYXJrIGdyZXkgYW5kIGJsYWNrIGxpc3RlZCBBUElzLlxuICogICAgIDM6IERpc2FsbG93IHVzYWdlIG9mIGJsYWNrbGlzdGVkIEFQSXMsIGJ1dCBhbGxvdyB1c2FnZSBvZiBkYXJrIGdyZXkgbGlzdGVkIEFQSXMuXG4gKlxuICogICAgIEZvciBBbmRyb2lkIFFcbiAqICAgICBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9wcmV2aWV3L25vbi1zZGstcSNlbmFibGUtbm9uLXNkay1hY2Nlc3NcbiAqICAgICAwOiBEaXNhYmxlIGFsbCBkZXRlY3Rpb24gb2Ygbm9uLVNESyBpbnRlcmZhY2VzLiBVc2luZyB0aGlzIHNldHRpbmcgZGlzYWJsZXMgYWxsIGxvZyBtZXNzYWdlcyBmb3Igbm9uLVNESyBpbnRlcmZhY2UgdXNhZ2VcbiAqICAgICAgICBhbmQgcHJldmVudHMgeW91IGZyb20gdGVzdGluZyB5b3VyIGFwcCB1c2luZyB0aGUgU3RyaWN0TW9kZSBBUEkuIFRoaXMgc2V0dGluZyBpcyBub3QgcmVjb21tZW5kZWQuXG4gKiAgICAgMTogRW5hYmxlIGFjY2VzcyB0byBhbGwgbm9uLVNESyBpbnRlcmZhY2VzLCBidXQgcHJpbnQgbG9nIG1lc3NhZ2VzIHdpdGggd2FybmluZ3MgZm9yIGFueSBub24tU0RLIGludGVyZmFjZSB1c2FnZS5cbiAqICAgICAgICBVc2luZyB0aGlzIHNldHRpbmcgYWxzbyBhbGxvd3MgeW91IHRvIHRlc3QgeW91ciBhcHAgdXNpbmcgdGhlIFN0cmljdE1vZGUgQVBJLlxuICogICAgIDI6IERpc2FsbG93IHVzYWdlIG9mIG5vbi1TREsgaW50ZXJmYWNlcyB0aGF0IGJlbG9uZyB0byBlaXRoZXIgdGhlIGJsYWNrIGxpc3RcbiAqICAgICAgICBvciB0byBhIHJlc3RyaWN0ZWQgZ3JleWxpc3QgZm9yIHlvdXIgdGFyZ2V0IEFQSSBsZXZlbC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUVycm9yIFtmYWxzZV0gV2hldGhlciB0byBpZ25vcmUgYW4gZXhjZXB0aW9uIGluICdhZGIgc2hlbGwgc2V0dGluZ3MgcHV0IGdsb2JhbCcgY29tbWFuZFxuICogQHRocm93cyB7ZXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciBhbmQgaWdub3JlRXJyb3Igd2FzIHRydWUgd2hpbGUgZXhlY3V0aW5nICdhZGIgc2hlbGwgc2V0dGluZ3MgcHV0IGdsb2JhbCdcbiAqICAgICAgICAgICAgICAgICBjb21tYW5kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5zZXRIaWRkZW5BcGlQb2xpY3kgPSBhc3luYyBmdW5jdGlvbiBzZXRIaWRkZW5BcGlQb2xpY3kgKHZhbHVlLCBpZ25vcmVFcnJvciA9IGZhbHNlKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChISURERU5fQVBJX1BPTElDWV9LRVlTLm1hcCgoaykgPT4gYHNldHRpbmdzIHB1dCBnbG9iYWwgJHtrfSAke3ZhbHVlfWApLmpvaW4oJzsnKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIWlnbm9yZUVycm9yKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBsb2cuaW5mbyhgRmFpbGVkIHRvIHNldCBzZXR0aW5nIGtleXMgJyR7SElEREVOX0FQSV9QT0xJQ1lfS0VZU30nIHRvICcke3ZhbHVlfScuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXNldCBhY2Nlc3MgdG8gbm9uLVNESyBBUElzIHRvIGl0cyBkZWZhdWx0IHNldHRpbmcuXG4gKiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9wcmV2aWV3L3Jlc3RyaWN0aW9ucy1ub24tc2RrLWludGVyZmFjZXNcbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUVycm9yIFtmYWxzZV0gV2hldGhlciB0byBpZ25vcmUgYW4gZXhjZXB0aW9uIGluICdhZGIgc2hlbGwgc2V0dGluZ3MgZGVsZXRlIGdsb2JhbCcgY29tbWFuZFxuICogQHRocm93cyB7ZXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciBhbmQgaWdub3JlRXJyb3Igd2FzIHRydWUgd2hpbGUgZXhlY3V0aW5nICdhZGIgc2hlbGwgc2V0dGluZ3MgZGVsZXRlIGdsb2JhbCdcbiAqICAgICAgICAgICAgICAgICBjb21tYW5kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5zZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5ID0gYXN5bmMgZnVuY3Rpb24gc2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSAoaWdub3JlRXJyb3IgPSBmYWxzZSkge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoSElEREVOX0FQSV9QT0xJQ1lfS0VZUy5tYXAoKGspID0+IGBzZXR0aW5ncyBkZWxldGUgZ2xvYmFsICR7a31gKS5qb2luKCc7JykpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFpZ25vcmVFcnJvcikge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nLmluZm8oYEZhaWxlZCB0byBkZWxldGUga2V5cyAnJHtISURERU5fQVBJX1BPTElDWV9LRVlTfScuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTdG9wIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UgaWYgaXQgaXMgcnVubmluZyBhbmQgY2xlYXJzIGl0cyBhcHBsaWNhdGlvbiBkYXRhLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqL1xubWV0aG9kcy5zdG9wQW5kQ2xlYXIgPSBhc3luYyBmdW5jdGlvbiBzdG9wQW5kQ2xlYXIgKHBrZykge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuZm9yY2VTdG9wKHBrZyk7XG4gICAgYXdhaXQgdGhpcy5jbGVhcihwa2cpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc3RvcCBhbmQgY2xlYXIgJHtwa2d9LiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGlucHV0IG1ldGhvZHMgKElNRXMpIGZvciB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBsaXN0IG9mIElNRSBuYW1lcyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmF2YWlsYWJsZUlNRXMgPSBhc3luYyBmdW5jdGlvbiBhdmFpbGFibGVJTUVzICgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2V0SU1FTGlzdEZyb21PdXRwdXQoYXdhaXQgdGhpcy5zaGVsbChbJ2ltZScsICdsaXN0JywgJy1hJ10pKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBhdmFpbGFibGUgSU1FJ3MuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBlbmFibGVkIGlucHV0IG1ldGhvZHMgKElNRXMpIGZvciB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBsaXN0IG9mIGVuYWJsZWQgSU1FIG5hbWVzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuZW5hYmxlZElNRXMgPSBhc3luYyBmdW5jdGlvbiBlbmFibGVkSU1FcyAoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdldElNRUxpc3RGcm9tT3V0cHV0KGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnbGlzdCddKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgZW5hYmxlZCBJTUUncy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEVuYWJsZSB0aGUgcGFydGljdWxhciBpbnB1dCBtZXRob2Qgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbWVJZCAtIE9uZSBvZiBleGlzdGluZyBJTUUgaWRzLlxuICovXG5tZXRob2RzLmVuYWJsZUlNRSA9IGFzeW5jIGZ1bmN0aW9uIGVuYWJsZUlNRSAoaW1lSWQpIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2ltZScsICdlbmFibGUnLCBpbWVJZF0pO1xufTtcblxuLyoqXG4gKiBEaXNhYmxlIHRoZSBwYXJ0aWN1bGFyIGlucHV0IG1ldGhvZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGltZUlkIC0gT25lIG9mIGV4aXN0aW5nIElNRSBpZHMuXG4gKi9cbm1ldGhvZHMuZGlzYWJsZUlNRSA9IGFzeW5jIGZ1bmN0aW9uIGRpc2FibGVJTUUgKGltZUlkKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnZGlzYWJsZScsIGltZUlkXSk7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgcGFydGljdWxhciBpbnB1dCBtZXRob2Qgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbWVJZCAtIE9uZSBvZiBleGlzdGluZyBJTUUgaWRzLlxuICovXG5tZXRob2RzLnNldElNRSA9IGFzeW5jIGZ1bmN0aW9uIHNldElNRSAoaW1lSWQpIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2ltZScsICdzZXQnLCBpbWVJZF0pO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGRlZmF1bHQgaW5wdXQgbWV0aG9kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBpbnB1dCBtZXRob2RcbiAqL1xubWV0aG9kcy5kZWZhdWx0SU1FID0gYXN5bmMgZnVuY3Rpb24gZGVmYXVsdElNRSAoKSB7XG4gIHRyeSB7XG4gICAgbGV0IGVuZ2luZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnc2VjdXJlJywgJ2RlZmF1bHRfaW5wdXRfbWV0aG9kJyk7XG4gICAgaWYgKGVuZ2luZSA9PT0gJ251bGwnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGVuZ2luZS50cmltKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgZGVmYXVsdCBJTUUuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBwYXJ0aWN1bGFyIGtleWNvZGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0ga2V5Y29kZSAtIFRoZSBhY3R1YWwga2V5IGNvZGUgdG8gYmUgc2VudC5cbiAqL1xubWV0aG9kcy5rZXlldmVudCA9IGFzeW5jIGZ1bmN0aW9uIGtleWV2ZW50IChrZXljb2RlKSB7XG4gIC8vIGtleWNvZGUgbXVzdCBiZSBhbiBpbnQuXG4gIGxldCBjb2RlID0gcGFyc2VJbnQoa2V5Y29kZSwgMTApO1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnaW5wdXQnLCAna2V5ZXZlbnQnLCBjb2RlXSk7XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHBhcnRpY3VsYXIgdGV4dCBvciBhIG51bWJlciB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBUaGUgdGV4dCBnZXRzIHByb3Blcmx5IGVzY2FwZWQgYmVmb3JlIGJlaW5nIHBhc3NlZCB0byBBREIuXG4gKiBOb29wIGlmIHRoZSB0ZXh0IGlzIGVtcHR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gdGV4dCAtIFRoZSBhY3R1YWwgdGV4dCB0byBiZSBzZW50LlxuICogQHRocm93cyB7RXJyb3J9IElmIGl0IGlzIGltcG9zc2libGUgdG8gZXNjYXBlIHRoZSBnaXZlbiBzdHJpbmdcbiAqL1xubWV0aG9kcy5pbnB1dFRleHQgPSBhc3luYyBmdW5jdGlvbiBpbnB1dFRleHQgKHRleHQpIHtcbiAgaWYgKHRleHQgPT09ICcnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3JpZ2luYWxTdHIgPSBgJHt0ZXh0fWA7XG4gIGNvbnN0IGVzY2FwZWRUZXh0ID0gb3JpZ2luYWxTdHIucmVwbGFjZSgvXFwkL2csICdcXFxcJCcpLnJlcGxhY2UoLyAvZywgJyVzJyk7XG4gIGxldCBhcmdzID0gWydpbnB1dCcsICd0ZXh0Jywgb3JpZ2luYWxTdHJdO1xuICBpZiAoZXNjYXBlZFRleHQgIT09IG9yaWdpbmFsU3RyIHx8IEFEQl9JTlBVVF9FU0NBUEVfUEFUVEVSTi50ZXN0KG9yaWdpbmFsU3RyKSkge1xuICAgIGlmIChfLmV2ZXJ5KFsnXCInLCBgJ2BdLCAoYykgPT4gb3JpZ2luYWxTdHIuaW5jbHVkZXMoYykpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEaWQgbm90IGtub3cgaG93IHRvIGVzY2FwZSBhIHN0cmluZyB0aGF0IGNvbnRhaW5zIGJvdGggdHlwZXMgb2YgcXVvdGVzIChcIiBhbmQgJylgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBxID0gb3JpZ2luYWxTdHIuaW5jbHVkZXMoJ1wiJykgPyBgJ2AgOiAnXCInO1xuICAgIGFyZ3MgPSBbYGlucHV0IHRleHQgJHtxfSR7ZXNjYXBlZFRleHR9JHtxfWBdO1xuICB9XG4gIGF3YWl0IHRoaXMuc2hlbGwoYXJncyk7XG59O1xuXG4vKipcbiAqIENsZWFyIHRoZSBhY3RpdmUgdGV4dCBmaWVsZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgYnkgc2VuZGluZ1xuICogc3BlY2lhbCBrZXlldmVudHMgdG8gaXQuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBbMTAwXSAtIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgdGV4dCBpbiB0aGUgZmllbGQgdG8gYmUgY2xlYXJlZC5cbiAqL1xubWV0aG9kcy5jbGVhclRleHRGaWVsZCA9IGFzeW5jIGZ1bmN0aW9uIGNsZWFyVGV4dEZpZWxkIChsZW5ndGggPSAxMDApIHtcbiAgLy8gYXNzdW1lcyB0aGF0IHRoZSBFZGl0VGV4dCBmaWVsZCBhbHJlYWR5IGhhcyBmb2N1c1xuICBsb2cuZGVidWcoYENsZWFyaW5nIHVwIHRvICR7bGVuZ3RofSBjaGFyYWN0ZXJzYCk7XG4gIGlmIChsZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IGFyZ3MgPSBbJ2lucHV0JywgJ2tleWV2ZW50J107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAvLyB3ZSBjYW5ub3Qga25vdyB3aGVyZSB0aGUgY3Vyc29yIGlzIGluIHRoZSB0ZXh0IGZpZWxkLCBzbyBkZWxldGUgYm90aCBiZWZvcmVcbiAgICAvLyBhbmQgYWZ0ZXIgc28gdGhhdCB3ZSBnZXQgcmlkIG9mIGV2ZXJ5dGhpbmdcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC92aWV3L0tleUV2ZW50Lmh0bWwjS0VZQ09ERV9ERUxcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC92aWV3L0tleUV2ZW50Lmh0bWwjS0VZQ09ERV9GT1JXQVJEX0RFTFxuICAgIGFyZ3MucHVzaCgnNjcnLCAnMTEyJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5zaGVsbChhcmdzKTtcbn07XG5cbi8qKlxuICogU2VuZCB0aGUgc3BlY2lhbCBrZXljb2RlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBpbiBvcmRlciB0byBsb2NrIGl0LlxuICovXG5tZXRob2RzLmxvY2sgPSBhc3luYyBmdW5jdGlvbiBsb2NrICgpIHtcbiAgaWYgKGF3YWl0IHRoaXMuaXNTY3JlZW5Mb2NrZWQoKSkge1xuICAgIGxvZy5kZWJ1ZygnU2NyZWVuIGlzIGFscmVhZHkgbG9ja2VkLiBEb2luZyBub3RoaW5nLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBsb2cuZGVidWcoJ1ByZXNzaW5nIHRoZSBLRVlDT0RFX1BPV0VSIGJ1dHRvbiB0byBsb2NrIHNjcmVlbicpO1xuICBhd2FpdCB0aGlzLmtleWV2ZW50KDI2KTtcblxuICBjb25zdCB0aW1lb3V0TXMgPSA1MDAwO1xuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5pc1NjcmVlbkxvY2tlZCgpLCB7XG4gICAgICB3YWl0TXM6IHRpbWVvdXRNcyxcbiAgICAgIGludGVydmFsTXM6IDUwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGRldmljZSBzY3JlZW4gaXMgc3RpbGwgbG9ja2VkIGFmdGVyICR7dGltZW91dE1zfW1zIHRpbWVvdXRgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBzcGVjaWFsIGtleWNvZGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0IGluIG9yZGVyIHRvIGVtdWxhdGVcbiAqIEJhY2sgYnV0dG9uIHRhcC5cbiAqL1xubWV0aG9kcy5iYWNrID0gYXN5bmMgZnVuY3Rpb24gYmFjayAoKSB7XG4gIGxvZy5kZWJ1ZygnUHJlc3NpbmcgdGhlIEJBQ0sgYnV0dG9uJyk7XG4gIGF3YWl0IHRoaXMua2V5ZXZlbnQoNCk7XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHNwZWNpYWwga2V5Y29kZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaW4gb3JkZXIgdG8gZW11bGF0ZVxuICogSG9tZSBidXR0b24gdGFwLlxuICovXG5tZXRob2RzLmdvVG9Ib21lID0gYXN5bmMgZnVuY3Rpb24gZ29Ub0hvbWUgKCkge1xuICBsb2cuZGVidWcoJ1ByZXNzaW5nIHRoZSBIT01FIGJ1dHRvbicpO1xuICBhd2FpdCB0aGlzLmtleWV2ZW50KDMpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBhY3R1YWwgcGF0aCB0byBhZGIgZXhlY3V0YWJsZS5cbiAqL1xubWV0aG9kcy5nZXRBZGJQYXRoID0gZnVuY3Rpb24gZ2V0QWRiUGF0aCAoKSB7XG4gIHJldHVybiB0aGlzLmV4ZWN1dGFibGUucGF0aDtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgY3VycmVudCBzY3JlZW4gb3JpZW50YXRpb24gb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGN1cnJlbnQgb3JpZW50YXRpb24gZW5jb2RlZCBhcyBhbiBpbnRlZ2VyIG51bWJlci5cbiAqL1xubWV0aG9kcy5nZXRTY3JlZW5PcmllbnRhdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldFNjcmVlbk9yaWVudGF0aW9uICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ2lucHV0J10pO1xuICByZXR1cm4gZ2V0U3VyZmFjZU9yaWVudGF0aW9uKHN0ZG91dCk7XG59O1xuXG4vKipcbiAqIFNlbmQgYW4gYXJiaXRyYXJ5IFRlbG5ldCBjb21tYW5kIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGJlIHNlbnQuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgYWN0dWFsIG91dHB1dCBvZiB0aGUgZ2l2ZW4gY29tbWFuZC5cbiAqL1xubWV0aG9kcy5zZW5kVGVsbmV0Q29tbWFuZCA9IGFzeW5jIGZ1bmN0aW9uIHNlbmRUZWxuZXRDb21tYW5kIChjb21tYW5kKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmV4ZWNFbXVDb25zb2xlQ29tbWFuZChjb21tYW5kLCB7cG9ydDogYXdhaXQgdGhpcy5nZXRFbXVsYXRvclBvcnQoKX0pO1xufTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc3RhdGUgb2YgQWlycGxhbmUgbW9kZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBBaXJwbGFuZSBtb2RlIGlzIGVuYWJsZWQuXG4gKi9cbm1ldGhvZHMuaXNBaXJwbGFuZU1vZGVPbiA9IGFzeW5jIGZ1bmN0aW9uIGlzQWlycGxhbmVNb2RlT24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnYWlycGxhbmVfbW9kZV9vbicpO1xuICByZXR1cm4gcGFyc2VJbnQoc3Rkb3V0LCAxMCkgIT09IDA7XG59O1xuXG4vKipcbiAqIENoYW5nZSB0aGUgc3RhdGUgb2YgQWlycGxhbmUgbW9kZSBpbiBTZXR0aW5ncyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBvbiAtIFRydWUgdG8gZW5hYmxlIHRoZSBBaXJwbGFuZSBtb2RlIGluIFNldHRpbmdzIGFuZCBmYWxzZSB0byBkaXNhYmxlIGl0LlxuICovXG5tZXRob2RzLnNldEFpcnBsYW5lTW9kZSA9IGFzeW5jIGZ1bmN0aW9uIHNldEFpcnBsYW5lTW9kZSAob24pIHtcbiAgYXdhaXQgdGhpcy5zZXRTZXR0aW5nKCdnbG9iYWwnLCAnYWlycGxhbmVfbW9kZV9vbicsIG9uID8gMSA6IDApO1xufTtcblxuLyoqXG4gKiBCcm9hZGNhc3QgdGhlIHN0YXRlIG9mIEFpcnBsYW5lIG1vZGUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB7QGxpbmsgI3NldEFpcnBsYW5lTW9kZX0sIG90aGVyd2lzZVxuICogdGhlIG1vZGUgY2hhbmdlIGlzIG5vdCBnb2luZyB0byBiZSBhcHBsaWVkIGZvciB0aGUgZGV2aWNlLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb24gLSBUcnVlIHRvIGJyb2FkY2FzdCBlbmFibGUgYW5kIGZhbHNlIHRvIGJyb2FkY2FzdCBkaXNhYmxlLlxuICovXG5tZXRob2RzLmJyb2FkY2FzdEFpcnBsYW5lTW9kZSA9IGFzeW5jIGZ1bmN0aW9uIGJyb2FkY2FzdEFpcnBsYW5lTW9kZSAob24pIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbXG4gICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgJy1hJywgJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5BSVJQTEFORV9NT0RFJyxcbiAgICAnLS1leicsICdzdGF0ZScsIG9uID8gJ3RydWUnIDogJ2ZhbHNlJ1xuICBdKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIFdpRmkgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgV2lGaSBpcyBlbmFibGVkLlxuICovXG5tZXRob2RzLmlzV2lmaU9uID0gYXN5bmMgZnVuY3Rpb24gaXNXaWZpT24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnd2lmaV9vbicpO1xuICByZXR1cm4gKHBhcnNlSW50KHN0ZG91dCwgMTApICE9PSAwKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIERhdGEgdHJhbnNmZXIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgRGF0YSB0cmFuc2ZlciBpcyBlbmFibGVkLlxuICovXG5tZXRob2RzLmlzRGF0YU9uID0gYXN5bmMgZnVuY3Rpb24gaXNEYXRhT24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnbW9iaWxlX2RhdGEnKTtcbiAgcmV0dXJuIChwYXJzZUludChzdGRvdXQsIDEwKSAhPT0gMCk7XG59O1xuXG4vKipcbiAqIENoYW5nZSB0aGUgc3RhdGUgb2YgV2lGaSBhbmQvb3IgRGF0YSB0cmFuc2ZlciBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSB3aWZpIC0gVHJ1ZSB0byBlbmFibGUgYW5kIGZhbHNlIHRvIGRpc2FibGUgV2lGaS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZGF0YSAtIFRydWUgdG8gZW5hYmxlIGFuZCBmYWxzZSB0byBkaXNhYmxlIERhdGEgdHJhbnNmZXIuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzRW11bGF0b3IgW2ZhbHNlXSAtIFNldCBpdCB0byB0cnVlIGlmIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbiBlbXVsYXRvciByYXRoZXIgdGhhbiBhIHJlYWwgZGV2aWNlLlxuICovXG5tZXRob2RzLnNldFdpZmlBbmREYXRhID0gYXN5bmMgZnVuY3Rpb24gc2V0V2lmaUFuZERhdGEgKHt3aWZpLCBkYXRhfSwgaXNFbXVsYXRvciA9IGZhbHNlKSB7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHdpZmkpKSB7XG4gICAgYXdhaXQgdGhpcy5zZXRXaWZpU3RhdGUod2lmaSwgaXNFbXVsYXRvcik7XG4gIH1cbiAgaWYgKHV0aWwuaGFzVmFsdWUoZGF0YSkpIHtcbiAgICBhd2FpdCB0aGlzLnNldERhdGFTdGF0ZShkYXRhLCBpc0VtdWxhdG9yKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc3RhdGUgb2YgYW5pbWF0aW9uIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGF0IGxlYXN0IG9uZSBvZiBhbmltYXRpb24gc2NhbGUgc2V0dGluZ3NcbiAqICAgICAgICAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byAnMC4wJy5cbiAqL1xubWV0aG9kcy5pc0FuaW1hdGlvbk9uID0gYXN5bmMgZnVuY3Rpb24gaXNBbmltYXRpb25PbiAoKSB7XG4gIGxldCBhbmltYXRvcl9kdXJhdGlvbl9zY2FsZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ2FuaW1hdG9yX2R1cmF0aW9uX3NjYWxlJyk7XG4gIGxldCB0cmFuc2l0aW9uX2FuaW1hdGlvbl9zY2FsZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ3RyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlJyk7XG4gIGxldCB3aW5kb3dfYW5pbWF0aW9uX3NjYWxlID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnd2luZG93X2FuaW1hdGlvbl9zY2FsZScpO1xuICByZXR1cm4gXy5zb21lKFthbmltYXRvcl9kdXJhdGlvbl9zY2FsZSwgdHJhbnNpdGlvbl9hbmltYXRpb25fc2NhbGUsIHdpbmRvd19hbmltYXRpb25fc2NhbGVdLFxuICAgICAgICAgICAgICAgIChzZXR0aW5nKSA9PiBzZXR0aW5nICE9PSAnMC4wJyk7XG59O1xuXG4vKipcbiAqIEZvcmNlZnVsbHkgcmVjdXJzaXZlbHkgcmVtb3ZlIGEgcGF0aCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBCZSBjYXJlZnVsIHdoaWxlIGNhbGxpbmcgdGhpcyBtZXRob2QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byBiZSByZW1vdmVkIHJlY3Vyc2l2ZWx5LlxuICovXG5tZXRob2RzLnJpbXJhZiA9IGFzeW5jIGZ1bmN0aW9uIHJpbXJhZiAocGF0aCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsncm0nLCAnLXJmJywgcGF0aF0pO1xufTtcblxuLyoqXG4gKiBTZW5kIGEgZmlsZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsUGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIGRlc3RpbmF0aW9uIHBhdGggb24gdGhlIHJlbW90ZSBkZXZpY2UuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBtYXBwaW5nLiBTZWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9ub2RlLXRlZW5fcHJvY2VzcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgX2V4ZWNfIG1ldGhvZCBvcHRpb25zLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5cbiAqL1xubWV0aG9kcy5wdXNoID0gYXN5bmMgZnVuY3Rpb24gcHVzaCAobG9jYWxQYXRoLCByZW1vdGVQYXRoLCBvcHRzKSB7XG4gIGF3YWl0IHRoaXMubWtkaXIocGF0aC5wb3NpeC5kaXJuYW1lKHJlbW90ZVBhdGgpKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncHVzaCcsIGxvY2FsUGF0aCwgcmVtb3RlUGF0aF0sIG9wdHMpO1xufTtcblxuLyoqXG4gKiBSZWNlaXZlIGEgZmlsZSBmcm9tIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBzb3VyY2UgcGF0aCBvbiB0aGUgcmVtb3RlIGRldmljZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbFBhdGggLSBUaGUgZGVzdGluYXRpb24gcGF0aCB0byB0aGUgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBtYXBwaW5nLiBTZWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9ub2RlLXRlZW5fcHJvY2VzcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgX2V4ZWNfIG1ldGhvZCBvcHRpb25zLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5cbiAqL1xubWV0aG9kcy5wdWxsID0gYXN5bmMgZnVuY3Rpb24gcHVsbCAocmVtb3RlUGF0aCwgbG9jYWxQYXRoLCBvcHRzID0ge30pIHtcbiAgLy8gcHVsbCBmb2xkZXIgY2FuIHRha2UgbW9yZSB0aW1lLCBpbmNyZWFzaW5nIHRpbWUgb3V0IHRvIDYwIHNlY3NcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncHVsbCcsIHJlbW90ZVBhdGgsIGxvY2FsUGF0aF0sIHsuLi5vcHRzLCB0aW1lb3V0OiBvcHRzLnRpbWVvdXQgPz8gNjAwMDB9KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgcHJvY2VzcyB3aXRoIHRoZSBwYXJ0aWN1bGFyIG5hbWUgaXMgcnVubmluZyBvbiB0aGUgZGV2aWNlXG4gKiB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9jZXNzTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBnaXZlbiBwcm9jZXNzIGlzIHJ1bm5pbmcuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGdpdmVuIHByb2Nlc3MgbmFtZSBpcyBub3QgYSB2YWxpZCBjbGFzcyBuYW1lLlxuICovXG5tZXRob2RzLnByb2Nlc3NFeGlzdHMgPSBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRXhpc3RzIChwcm9jZXNzTmFtZSkge1xuICByZXR1cm4gIV8uaXNFbXB0eShhd2FpdCB0aGlzLmdldFBJRHNCeU5hbWUocHJvY2Vzc05hbWUpKTtcbn07XG5cbi8qKlxuICogR2V0IFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuIEFuIGFycmF5IGNvbnRhaW5zIGVhY2ggZm9yd2FyZGluZyBsaW5lIG9mIG91dHB1dFxuICovXG5tZXRob2RzLmdldEZvcndhcmRMaXN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Rm9yd2FyZExpc3QgKCkge1xuICBsb2cuZGVidWcoYExpc3QgZm9yd2FyZGluZyBwb3J0c2ApO1xuICBjb25zdCBjb25uZWN0aW9ucyA9IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZvcndhcmQnLCAnLS1saXN0J10pO1xuICByZXR1cm4gY29ubmVjdGlvbnMuc3BsaXQoRU9MKS5maWx0ZXIoKGxpbmUpID0+IEJvb2xlYW4obGluZS50cmltKCkpKTtcbn07XG5cbi8qKlxuICogU2V0dXAgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBzeXN0ZW1Qb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgc3lzdGVtIHBvcnQuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGRldmljZVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSByZW1vdGUgZGV2aWNlIHBvcnQuXG4gKi9cbm1ldGhvZHMuZm9yd2FyZFBvcnQgPSBhc3luYyBmdW5jdGlvbiBmb3J3YXJkUG9ydCAoc3lzdGVtUG9ydCwgZGV2aWNlUG9ydCkge1xuICBsb2cuZGVidWcoYEZvcndhcmRpbmcgc3lzdGVtOiAke3N5c3RlbVBvcnR9IHRvIGRldmljZTogJHtkZXZpY2VQb3J0fWApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmb3J3YXJkJywgYHRjcDoke3N5c3RlbVBvcnR9YCwgYHRjcDoke2RldmljZVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuIFRoZSBmb3J3YXJkaW5nXG4gKiBmb3IgdGhlIGdpdmVuIHBvcnQgc2hvdWxkIGJlIHNldHVwIHdpdGgge0BsaW5rICNmb3J3YXJkUG9ydH0gZmlyc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBzeXN0ZW1Qb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgc3lzdGVtIHBvcnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHJlbW92ZSBmb3J3YXJkaW5nIG9uLlxuICovXG5tZXRob2RzLnJlbW92ZVBvcnRGb3J3YXJkID0gYXN5bmMgZnVuY3Rpb24gcmVtb3ZlUG9ydEZvcndhcmQgKHN5c3RlbVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBSZW1vdmluZyBmb3J3YXJkZWQgcG9ydCBzb2NrZXQgY29ubmVjdGlvbjogJHtzeXN0ZW1Qb3J0fSBgKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsnZm9yd2FyZCcsIGAtLXJlbW92ZWAsIGB0Y3A6JHtzeXN0ZW1Qb3J0fWBdKTtcbn07XG5cbi8qKlxuICogR2V0IFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuIEFuIGFycmF5IGNvbnRhaW5zIGVhY2ggZm9yd2FyZGluZyBsaW5lIG9mIG91dHB1dFxuICovXG5tZXRob2RzLmdldFJldmVyc2VMaXN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0UmV2ZXJzZUxpc3QgKCkge1xuICBsb2cuZGVidWcoYExpc3QgcmV2ZXJzZSBmb3J3YXJkaW5nIHBvcnRzYCk7XG4gIGNvbnN0IGNvbm5lY3Rpb25zID0gYXdhaXQgdGhpcy5hZGJFeGVjKFsncmV2ZXJzZScsICctLWxpc3QnXSk7XG4gIHJldHVybiBjb25uZWN0aW9ucy5zcGxpdChFT0wpLmZpbHRlcigobGluZSkgPT4gQm9vbGVhbihsaW5lLnRyaW0oKSkpO1xufTtcblxuLyoqXG4gKiBTZXR1cCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIE9ubHkgYXZhaWxhYmxlIGZvciBBUEkgMjErLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gZGV2aWNlUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBkZXZpY2UgcG9ydC5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3lzdGVtUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHN5c3RlbSBwb3J0LlxuICovXG5tZXRob2RzLnJldmVyc2VQb3J0ID0gYXN5bmMgZnVuY3Rpb24gcmV2ZXJzZVBvcnQgKGRldmljZVBvcnQsIHN5c3RlbVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBGb3J3YXJkaW5nIGRldmljZTogJHtkZXZpY2VQb3J0fSB0byBzeXN0ZW06ICR7c3lzdGVtUG9ydH1gKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncmV2ZXJzZScsIGB0Y3A6JHtkZXZpY2VQb3J0fWAsIGB0Y3A6JHtzeXN0ZW1Qb3J0fWBdKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LiBUaGUgZm9yd2FyZGluZ1xuICogZm9yIHRoZSBnaXZlbiBwb3J0IHNob3VsZCBiZSBzZXR1cCB3aXRoIHtAbGluayAjZm9yd2FyZFBvcnR9IGZpcnN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gZGV2aWNlUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBkZXZpY2UgcG9ydFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVtb3ZlIGZvcndhcmRpbmcgb24uXG4gKi9cbm1ldGhvZHMucmVtb3ZlUG9ydFJldmVyc2UgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVQb3J0UmV2ZXJzZSAoZGV2aWNlUG9ydCkge1xuICBsb2cuZGVidWcoYFJlbW92aW5nIHJldmVyc2UgZm9yd2FyZGVkIHBvcnQgc29ja2V0IGNvbm5lY3Rpb246ICR7ZGV2aWNlUG9ydH0gYCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3JldmVyc2UnLCBgLS1yZW1vdmVgLCBgdGNwOiR7ZGV2aWNlUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIFNldHVwIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LiBUaGUgZGlmZmVyZW5jZVxuICogYmV0d2VlbiB7QGxpbmsgI2ZvcndhcmRQb3J0fSBpcyB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgc2V0dXAgZm9yIGFuIGFic3RyYWN0XG4gKiBsb2NhbCBwb3J0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3lzdGVtUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHN5c3RlbSBwb3J0LlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBkZXZpY2VQb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgcmVtb3RlIGRldmljZSBwb3J0LlxuICovXG5tZXRob2RzLmZvcndhcmRBYnN0cmFjdFBvcnQgPSBhc3luYyBmdW5jdGlvbiBmb3J3YXJkQWJzdHJhY3RQb3J0IChzeXN0ZW1Qb3J0LCBkZXZpY2VQb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBzeXN0ZW06ICR7c3lzdGVtUG9ydH0gdG8gYWJzdHJhY3QgZGV2aWNlOiAke2RldmljZVBvcnR9YCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZvcndhcmQnLCBgdGNwOiR7c3lzdGVtUG9ydH1gLCBgbG9jYWxhYnN0cmFjdDoke2RldmljZVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBFeGVjdXRlIHBpbmcgc2hlbGwgY29tbWFuZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY29tbWFuZCBvdXRwdXQgY29udGFpbnMgJ3BpbmcnIHN1YnN0cmluZy5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZXhlY3V0aW5nICdwaW5nJyBjb21tYW5kIG9uIHRoZVxuICogICAgICAgICAgICAgICAgIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLnBpbmcgPSBhc3luYyBmdW5jdGlvbiBwaW5nICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydlY2hvJywgJ3BpbmcnXSk7XG4gIGlmIChzdGRvdXQuaW5kZXhPZigncGluZycpID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBBREIgcGluZyBmYWlsZWQsIHJldHVybmVkICR7c3Rkb3V0fWApO1xufTtcblxuLyoqXG4gKiBSZXN0YXJ0IHRoZSBkZXZpY2UgdW5kZXIgdGVzdCB1c2luZyBhZGIgY29tbWFuZHMuXG4gKlxuICogQHRocm93cyB7ZXJyb3J9IElmIHN0YXJ0IGZhaWxzLlxuICovXG5tZXRob2RzLnJlc3RhcnQgPSBhc3luYyBmdW5jdGlvbiByZXN0YXJ0ICgpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnN0b3BMb2djYXQoKTtcbiAgICBhd2FpdCB0aGlzLnJlc3RhcnRBZGIoKTtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JEZXZpY2UoNjApO1xuICAgIGF3YWl0IHRoaXMuc3RhcnRMb2djYXQodGhpcy5fbG9nY2F0U3RhcnR1cFBhcmFtcyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJlc3RhcnQgZmFpbGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTG9nY2F0T3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGZvcm1hdCBUaGUgbG9nIHByaW50IGZvcm1hdCwgd2hlcmUgPGZvcm1hdD4gaXMgb25lIG9mOlxuICogICBicmllZiBwcm9jZXNzIHRhZyB0aHJlYWQgcmF3IHRpbWUgdGhyZWFkdGltZSBsb25nXG4gKiBgdGhyZWFkdGltZWAgaXMgdGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAcHJvcGVydHkge0FycmF5PHN0cmluZz59IGZpbHRlclNwZWNzIFNlcmllcyBvZiA8dGFnPls6cHJpb3JpdHldXG4gKiB3aGVyZSA8dGFnPiBpcyBhIGxvZyBjb21wb25lbnQgdGFnIChvciAqIGZvciBhbGwpIGFuZCBwcmlvcml0eSBpczpcbiAqICBWICAgIFZlcmJvc2VcbiAqICBEICAgIERlYnVnXG4gKiAgSSAgICBJbmZvXG4gKiAgVyAgICBXYXJuXG4gKiAgRSAgICBFcnJvclxuICogIEYgICAgRmF0YWxcbiAqICBTICAgIFNpbGVudCAoc3VwcmVzcyBhbGwgb3V0cHV0KVxuICpcbiAqICcqJyBtZWFucyAnKjpkJyBhbmQgPHRhZz4gYnkgaXRzZWxmIG1lYW5zIDx0YWc+OnZcbiAqXG4gKiBJZiBub3Qgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kbGluZSwgZmlsdGVyc3BlYyBpcyBzZXQgZnJvbSBBTkRST0lEX0xPR19UQUdTLlxuICogSWYgbm8gZmlsdGVyc3BlYyBpcyBmb3VuZCwgZmlsdGVyIGRlZmF1bHRzIHRvICcqOkknXG4gKi9cblxuLyoqXG4gKiBTdGFydCB0aGUgbG9nY2F0IHByb2Nlc3MgdG8gZ2F0aGVyIGxvZ3MuXG4gKlxuICogQHBhcmFtIHs/TG9nY2F0T3B0c30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IElmIHJlc3RhcnQgZmFpbHMuXG4gKi9cbm1ldGhvZHMuc3RhcnRMb2djYXQgPSBhc3luYyBmdW5jdGlvbiBzdGFydExvZ2NhdCAob3B0cyA9IHt9KSB7XG4gIGlmICghXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRyeWluZyB0byBzdGFydCBsb2djYXQgY2FwdHVyZSBidXQgaXQncyBhbHJlYWR5IHN0YXJ0ZWQhXCIpO1xuICB9XG5cbiAgdGhpcy5sb2djYXQgPSBuZXcgTG9nY2F0KHtcbiAgICBhZGI6IHRoaXMuZXhlY3V0YWJsZSxcbiAgICBkZWJ1ZzogZmFsc2UsXG4gICAgZGVidWdUcmFjZTogZmFsc2UsXG4gICAgY2xlYXJEZXZpY2VMb2dzT25TdGFydDogISF0aGlzLmNsZWFyRGV2aWNlTG9nc09uU3RhcnQsXG4gIH0pO1xuICBhd2FpdCB0aGlzLmxvZ2NhdC5zdGFydENhcHR1cmUob3B0cyk7XG4gIHRoaXMuX2xvZ2NhdFN0YXJ0dXBQYXJhbXMgPSBvcHRzO1xufTtcblxuLyoqXG4gKiBTdG9wIHRoZSBhY3RpdmUgbG9nY2F0IHByb2Nlc3Mgd2hpY2ggZ2F0aGVycyBsb2dzLlxuICogVGhlIGNhbGwgd2lsbCBiZSBpZ25vcmVkIGlmIG5vIGxvZ2NhdCBwcm9jZXNzIGlzIHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMuc3RvcExvZ2NhdCA9IGFzeW5jIGZ1bmN0aW9uIHN0b3BMb2djYXQgKCkge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IHRoaXMubG9nY2F0LnN0b3BDYXB0dXJlKCk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5sb2djYXQgPSBudWxsO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBvdXRwdXQgZnJvbSB0aGUgY3VycmVudGx5IHJ1bm5pbmcgbG9nY2F0IHByb2Nlc3MuXG4gKiBUaGUgbG9nY2F0IHByb2Nlc3Mgc2hvdWxkIGJlIGV4ZWN1dGVkIGJ5IHsybGluayAjc3RhcnRMb2djYXR9IG1ldGhvZC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb2xsZWN0ZWQgbG9nY2F0IG91dHB1dC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBsb2djYXQgcHJvY2VzcyBpcyBub3QgcnVubmluZy5cbiAqL1xubWV0aG9kcy5nZXRMb2djYXRMb2dzID0gZnVuY3Rpb24gZ2V0TG9nY2F0TG9ncyAoKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZ2V0IGxvZ2NhdCBsb2dzIHNpbmNlIGxvZ2NhdCBoYXNuJ3Qgc3RhcnRlZFwiKTtcbiAgfVxuICByZXR1cm4gdGhpcy5sb2djYXQuZ2V0TG9ncygpO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgbG9nY2F0IG91dHB1dCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciAtIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiwgd2hpY2ggYWNjZXB0cyBvbmUgYXJndW1lbnQuIFRoZSBhcmd1bWVudCBpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGxvZyByZWNvcmQgb2JqZWN0IHdpdGggYHRpbWVzdGFtcGAsIGBsZXZlbGAgYW5kIGBtZXNzYWdlYCBwcm9wZXJ0aWVzLlxuICogQHRocm93cyB7RXJyb3J9IElmIGxvZ2NhdCBwcm9jZXNzIGlzIG5vdCBydW5uaW5nLlxuICovXG5tZXRob2RzLnNldExvZ2NhdExpc3RlbmVyID0gZnVuY3Rpb24gc2V0TG9nY2F0TGlzdGVuZXIgKGxpc3RlbmVyKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTG9nY2F0IHByb2Nlc3MgaGFzbid0IGJlZW4gc3RhcnRlZFwiKTtcbiAgfVxuICB0aGlzLmxvZ2NhdC5vbignb3V0cHV0JywgbGlzdGVuZXIpO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBwcmV2aW91c2x5IHNldCBjYWxsYmFjayBmb3IgdGhlIGxvZ2NhdCBvdXRwdXQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgLSBUaGUgbGlzdGVuZXIgZnVuY3Rpb24sIHdoaWNoIGhhcyBiZWVuIHByZXZpb3VzbHlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIHRvIGBzZXRMb2djYXRMaXN0ZW5lcmBcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBsb2djYXQgcHJvY2VzcyBpcyBub3QgcnVubmluZy5cbiAqL1xubWV0aG9kcy5yZW1vdmVMb2djYXRMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxvZ2NhdExpc3RlbmVyIChsaXN0ZW5lcikge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkxvZ2NhdCBwcm9jZXNzIGhhc24ndCBiZWVuIHN0YXJ0ZWRcIik7XG4gIH1cbiAgdGhpcy5sb2djYXQucmVtb3ZlTGlzdGVuZXIoJ291dHB1dCcsIGxpc3RlbmVyKTtcbn07XG5cbi8qKlxuICogQXQgc29tZSBwb2ludCBvZiB0aW1lIEdvb2dsZSBoYXMgY2hhbmdlZCB0aGUgZGVmYXVsdCBgcHNgIGJlaGF2aW91ciwgc28gaXQgb25seVxuICogbGlzdHMgcHJvY2Vzc2VzIHRoYXQgYmVsb25nIHRvIHRoZSBjdXJyZW50IHNoZWxsIHVzZXIgcmF0aGVyIHRvIGFsbFxuICogdXNlcnMuIEl0IGlzIG5lY2Vzc2FyeSB0byBleGVjdXRlIHBzIHdpdGggLUEgY29tbWFuZCBsaW5lIGFyZ3VtZW50XG4gKiB0byBtaW1pYyB0aGUgcHJldmlvdXMgYmVoYXZpb3VyLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBvdXRwdXQgb2YgYHBzYCBjb21tYW5kIHdoZXJlIGFsbCBwcm9jZXNzZXMgYXJlIGluY2x1ZGVkXG4gKi9cbm1ldGhvZHMubGlzdFByb2Nlc3NTdGF0dXMgPSBhc3luYyBmdW5jdGlvbiBsaXN0UHJvY2Vzc1N0YXR1cyAoKSB7XG4gIGlmICghXy5pc0Jvb2xlYW4odGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24pKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2RvZXNQc1N1cHBvcnRBT3B0aW9uID0gL14tQVxcYi9tLnRlc3QoYXdhaXQgdGhpcy5zaGVsbChbJ3BzJywgJy0taGVscCddKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmRlYnVnKGUuc3RhY2spO1xuICAgICAgdGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwodGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24gPyBbJ3BzJywgJy1BJ10gOiBbJ3BzJ10pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHByb2Nlc3MgbmFtZSBmb3IgdGhlIGdpdmVuIHByb2Nlc3MgaWRlbnRpZmllclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gcGlkIC0gVGhlIHZhbGlkIHByb2Nlc3MgaWRlbnRpZmllclxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBQSUQgaXMgZWl0aGVyIGludmFsaWQgb3IgaXMgbm90IHByZXNlbnRcbiAqIGluIHRoZSBhY3RpdmUgcHJvY2Vzc2VzIGxpc3RcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBwcm9jZXNzIG5hbWVcbiAqL1xubWV0aG9kcy5nZXROYW1lQnlQaWQgPSBhc3luYyBmdW5jdGlvbiBnZXROYW1lQnlQaWQgKHBpZCkge1xuICBpZiAoaXNOYU4ocGlkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIFBJRCB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgbnVtYmVyLiAnJHtwaWR9JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgcGlkID0gcGFyc2VJbnQocGlkLCAxMCk7XG5cbiAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5saXN0UHJvY2Vzc1N0YXR1cygpO1xuICBjb25zdCB0aXRsZU1hdGNoID0gUFNfVElUTEVfUEFUVEVSTi5leGVjKHN0ZG91dCk7XG4gIGlmICghdGl0bGVNYXRjaCkge1xuICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGdldCB0aGUgcHJvY2VzcyBuYW1lIGZvciBQSUQgJyR7cGlkfSdgKTtcbiAgfVxuICBjb25zdCBhbGxUaXRsZXMgPSB0aXRsZU1hdGNoWzFdLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICBjb25zdCBwaWRJbmRleCA9IGFsbFRpdGxlcy5pbmRleE9mKFBJRF9DT0xVTU5fVElUTEUpO1xuICAvLyBpdCBtaWdodCBub3QgYmUgc3RhYmxlIHRvIHRha2UgTkFNRSBieSBpbmRleCwgYmVjYXVzZSBkZXBlbmRpbmcgb24gdGhlXG4gIC8vIGFjdHVhbCBTREsgdGhlIHBzIG91dHB1dCBtaWdodCBub3QgY29udGFpbiBhbiBhYmJyZXZpYXRpb24gZm9yIHRoZSBTIGZsYWc6XG4gIC8vIFVTRVIgICAgIFBJRCAgIFBQSUQgIFZTSVpFICBSU1MgICAgIFdDSEFOICAgIFBDICAgICAgICBOQU1FXG4gIC8vIFVTRVIgICAgIFBJRCAgIFBQSUQgIFZTSVpFICBSU1MgICAgIFdDSEFOICAgIFBDICAgUyAgICBOQU1FXG4gIGNvbnN0IG5hbWVPZmZzZXQgPSBhbGxUaXRsZXMuaW5kZXhPZihQUk9DRVNTX05BTUVfQ09MVU1OX1RJVExFKSAtIGFsbFRpdGxlcy5sZW5ndGg7XG4gIGNvbnN0IHBpZFJlZ2V4ID0gbmV3IFJlZ0V4cChgXiguKlxcXFxiJHtwaWR9XFxcXGIuKikkYCwgJ2dtJyk7XG4gIGxldCBtYXRjaGVkTGluZTtcbiAgd2hpbGUgKChtYXRjaGVkTGluZSA9IHBpZFJlZ2V4LmV4ZWMoc3Rkb3V0KSkpIHtcbiAgICBjb25zdCBpdGVtcyA9IG1hdGNoZWRMaW5lWzFdLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmIChwYXJzZUludChpdGVtc1twaWRJbmRleF0sIDEwKSA9PT0gcGlkICYmIGl0ZW1zW2l0ZW1zLmxlbmd0aCArIG5hbWVPZmZzZXRdKSB7XG4gICAgICByZXR1cm4gaXRlbXNbaXRlbXMubGVuZ3RoICsgbmFtZU9mZnNldF07XG4gICAgfVxuICB9XG4gIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgdGhlIHByb2Nlc3MgbmFtZSBmb3IgUElEICcke3BpZH0nYCk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgbGlzdCBvZiBwcm9jZXNzIGlkcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgcGFydCBvZiBwcm9jZXNzIG5hbWUuXG4gKiBAcmV0dXJuIHtBcnJheS48bnVtYmVyPn0gVGhlIGxpc3Qgb2YgbWF0Y2hlZCBwcm9jZXNzIElEcyBvciBhbiBlbXB0eSBsaXN0LlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwYXNzZWQgcHJvY2VzcyBuYW1lIGlzIG5vdCBhIHZhbGlkIG9uZVxuICovXG5tZXRob2RzLmdldFBJRHNCeU5hbWUgPSBhc3luYyBmdW5jdGlvbiBnZXRQSURzQnlOYW1lIChuYW1lKSB7XG4gIGxvZy5kZWJ1ZyhgR2V0dGluZyBJRHMgb2YgYWxsICcke25hbWV9JyBwcm9jZXNzZXNgKTtcbiAgaWYgKCF0aGlzLmlzVmFsaWRDbGFzcyhuYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwcm9jZXNzIG5hbWU6ICcke25hbWV9J2ApO1xuICB9XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xMzU2N1xuICBpZiAoYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpID49IDIzKSB7XG4gICAgaWYgKCFfLmlzQm9vbGVhbih0aGlzLl9pc1BncmVwQXZhaWxhYmxlKSkge1xuICAgICAgLy8gcGdyZXAgaXMgaW4gcHJpb3JpdHksIHNpbmNlIHBpZG9mIGhhcyBiZWVuIHJlcG9ydGVkIG9mIGhhdmluZyBidWdzIG9uIHNvbWUgcGxhdGZvcm1zXG4gICAgICBjb25zdCBwZ3JlcE91dHB1dCA9IF8udHJpbShhd2FpdCB0aGlzLnNoZWxsKFsncGdyZXAgLS1oZWxwOyBlY2hvICQ/J10pKTtcbiAgICAgIHRoaXMuX2lzUGdyZXBBdmFpbGFibGUgPSBwYXJzZUludChfLmxhc3QocGdyZXBPdXRwdXQuc3BsaXQoL1xccysvKSksIDEwKSA9PT0gMDtcbiAgICAgIGlmICh0aGlzLl9pc1BncmVwQXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuX2NhblBncmVwVXNlRnVsbENtZExpbmVTZWFyY2ggPSAvXi1mXFxiL20udGVzdChwZ3JlcE91dHB1dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pc1BpZG9mQXZhaWxhYmxlID0gcGFyc2VJbnQoYXdhaXQgdGhpcy5zaGVsbChbJ3BpZG9mIC0taGVscCA+IC9kZXYvbnVsbDsgZWNobyAkPyddKSwgMTApID09PSAwO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5faXNQZ3JlcEF2YWlsYWJsZSB8fCB0aGlzLl9pc1BpZG9mQXZhaWxhYmxlKSB7XG4gICAgICBjb25zdCBzaGVsbENvbW1hbmQgPSB0aGlzLl9pc1BncmVwQXZhaWxhYmxlXG4gICAgICAgID8gKHRoaXMuX2NhblBncmVwVXNlRnVsbENtZExpbmVTZWFyY2hcbiAgICAgICAgICA/IFsncGdyZXAnLCAnLWYnLCBfLmVzY2FwZVJlZ0V4cChgKFtbOmJsYW5rOl1dfF4pJHtuYW1lfShbWzpibGFuazpdXXwkKWApXVxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xMzg3MlxuICAgICAgICAgIDogW2BwZ3JlcCBeJHtfLmVzY2FwZVJlZ0V4cChuYW1lLnNsaWNlKC1NQVhfUEdSRVBfUEFUVEVSTl9MRU4pKX0kIGAgK1xuICAgICAgICAgICAgICBgfHwgcGdyZXAgXiR7Xy5lc2NhcGVSZWdFeHAobmFtZS5zbGljZSgwLCBNQVhfUEdSRVBfUEFUVEVSTl9MRU4pKX0kYF0pXG4gICAgICAgIDogWydwaWRvZicsIG5hbWVdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLnNoZWxsKHNoZWxsQ29tbWFuZCkpXG4gICAgICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgICAgICAubWFwKCh4KSA9PiBwYXJzZUludCh4LCAxMCkpXG4gICAgICAgICAgLmZpbHRlcigoeCkgPT4gXy5pc0ludGVnZXIoeCkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBlcnJvciBjb2RlIDEgaXMgcmV0dXJuZWQgaWYgdGhlIHV0aWxpdHkgZGlkIG5vdCBmaW5kIGFueSBwcm9jZXNzZXNcbiAgICAgICAgLy8gd2l0aCB0aGUgZ2l2ZW4gbmFtZVxuICAgICAgICBpZiAoZS5jb2RlICE9PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZXh0cmFjdCBwcm9jZXNzIElEIG9mICcke25hbWV9JzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF8uaW5jbHVkZXMoZS5zdGRlcnIgfHwgZS5zdGRvdXQsICdzeW50YXggZXJyb3InKSkge1xuICAgICAgICAgIGxvZy53YXJuKGBHb3QgYW4gdW5leHBlY3RlZCByZXNwb25zZSBmcm9tIHRoZSBzaGVsbCBpbnRlcnByZXRlcjogJHtlLnN0ZGVyciB8fCBlLnN0ZG91dH1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsb2cuZGVidWcoJ1VzaW5nIHBzLWJhc2VkIFBJRCBkZXRlY3Rpb24nKTtcbiAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5saXN0UHJvY2Vzc1N0YXR1cygpO1xuICBjb25zdCB0aXRsZU1hdGNoID0gUFNfVElUTEVfUEFUVEVSTi5leGVjKHN0ZG91dCk7XG4gIGlmICghdGl0bGVNYXRjaCkge1xuICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGV4dHJhY3QgUElEIG9mICcke25hbWV9JyBmcm9tIHBzIG91dHB1dGApO1xuICB9XG4gIGNvbnN0IGFsbFRpdGxlcyA9IHRpdGxlTWF0Y2hbMV0udHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gIGNvbnN0IHBpZEluZGV4ID0gYWxsVGl0bGVzLmluZGV4T2YoUElEX0NPTFVNTl9USVRMRSk7XG4gIGNvbnN0IHBpZHMgPSBbXTtcbiAgY29uc3QgcHJvY2Vzc05hbWVSZWdleCA9IG5ldyBSZWdFeHAoYF4oLipcXFxcYlxcXFxkK1xcXFxiLipcXFxcYiR7Xy5lc2NhcGVSZWdFeHAobmFtZSl9XFxcXGIuKikkYCwgJ2dtJyk7XG4gIGxldCBtYXRjaGVkTGluZTtcbiAgd2hpbGUgKChtYXRjaGVkTGluZSA9IHByb2Nlc3NOYW1lUmVnZXguZXhlYyhzdGRvdXQpKSkge1xuICAgIGNvbnN0IGl0ZW1zID0gbWF0Y2hlZExpbmVbMV0udHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKHBpZEluZGV4ID49IGFsbFRpdGxlcy5sZW5ndGggfHwgaXNOYU4oaXRlbXNbcGlkSW5kZXhdKSkge1xuICAgICAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBleHRyYWN0IFBJRCBvZiAnJHtuYW1lfScgZnJvbSAnJHttYXRjaGVkTGluZVsxXS50cmltKCl9J2ApO1xuICAgIH1cbiAgICBwaWRzLnB1c2gocGFyc2VJbnQoaXRlbXNbcGlkSW5kZXhdLCAxMCkpO1xuICB9XG4gIHJldHVybiBwaWRzO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGxpc3Qgb2YgcHJvY2VzcyBpZHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHBhcnQgb2YgcHJvY2VzcyBuYW1lLlxuICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59IFRoZSBsaXN0IG9mIG1hdGNoZWQgcHJvY2VzcyBJRHMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5raWxsUHJvY2Vzc2VzQnlOYW1lID0gYXN5bmMgZnVuY3Rpb24ga2lsbFByb2Nlc3Nlc0J5TmFtZSAobmFtZSkge1xuICB0cnkge1xuICAgIGxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyB0byBraWxsIGFsbCAke25hbWV9IHByb2Nlc3Nlc2ApO1xuICAgIGNvbnN0IHBpZHMgPSBhd2FpdCB0aGlzLmdldFBJRHNCeU5hbWUobmFtZSk7XG4gICAgaWYgKF8uaXNFbXB0eShwaWRzKSkge1xuICAgICAgbG9nLmluZm8oYE5vICcke25hbWV9JyBwcm9jZXNzIGhhcyBiZWVuIGZvdW5kYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IEIuYWxsKHBpZHMubWFwKChwKSA9PiB0aGlzLmtpbGxQcm9jZXNzQnlQSUQocCkpKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBraWxsICR7bmFtZX0gcHJvY2Vzc2VzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogS2lsbCB0aGUgcGFydGljdWxhciBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIFRoZSBjdXJyZW50IHVzZXIgaXMgYXV0b21hdGljYWxseSBzd2l0Y2hlZCB0byByb290IGlmIG5lY2Vzc2FyeSBpbiBvcmRlclxuICogdG8gcHJvcGVybHkga2lsbCB0aGUgcHJvY2Vzcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHBpZCAtIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyB0byBiZSBraWxsZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHByb2Nlc3MgY2Fubm90IGJlIGtpbGxlZC5cbiAqL1xubWV0aG9kcy5raWxsUHJvY2Vzc0J5UElEID0gYXN5bmMgZnVuY3Rpb24ga2lsbFByb2Nlc3NCeVBJRCAocGlkKSB7XG4gIGxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyB0byBraWxsIHByb2Nlc3MgJHtwaWR9YCk7XG4gIGNvbnN0IG5vUHJvY2Vzc0ZsYWcgPSAnTm8gc3VjaCBwcm9jZXNzJztcbiAgdHJ5IHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcHJvY2VzcyBleGlzdHMgYW5kIHRocm93IGFuIGV4Y2VwdGlvbiBvdGhlcndpc2VcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsna2lsbCcsIHBpZF0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKF8uaW5jbHVkZXMoZS5zdGRlcnIsIG5vUHJvY2Vzc0ZsYWcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghXy5pbmNsdWRlcyhlLnN0ZGVyciwgJ09wZXJhdGlvbiBub3QgcGVybWl0dGVkJykpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGxvZy5pbmZvKGBDYW5ub3Qga2lsbCBQSUQgJHtwaWR9IGR1ZSB0byBpbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMuIFJldHJ5aW5nIGFzIHJvb3RgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zaGVsbChbJ2tpbGwnLCBwaWRdLCB7XG4gICAgICAgIHByaXZpbGVnZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUxKSB7XG4gICAgICBpZiAoXy5pbmNsdWRlcyhlMS5zdGRlcnIsIG5vUHJvY2Vzc0ZsYWcpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IGUxO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBCcm9hZGNhc3QgcHJvY2VzcyBraWxsaW5nIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW50ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGludGVudCB0byBicm9hZGNhc3QgdG8uXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvY2Vzc05hbWUgLSBUaGUgbmFtZSBvZiB0aGUga2lsbGVkIHByb2Nlc3MuXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGhlIHByb2Nlc3Mgd2FzIG5vdCBraWxsZWQuXG4gKi9cbm1ldGhvZHMuYnJvYWRjYXN0UHJvY2Vzc0VuZCA9IGFzeW5jIGZ1bmN0aW9uIGJyb2FkY2FzdFByb2Nlc3NFbmQgKGludGVudCwgcHJvY2Vzc05hbWUpIHtcbiAgLy8gc3RhcnQgdGhlIGJyb2FkY2FzdCB3aXRob3V0IHdhaXRpbmcgZm9yIGl0IHRvIGZpbmlzaC5cbiAgdGhpcy5icm9hZGNhc3QoaW50ZW50KTtcbiAgLy8gd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gZW5kXG4gIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gIGxldCB0aW1lb3V0TXMgPSA0MDAwMDtcbiAgdHJ5IHtcbiAgICB3aGlsZSAoKERhdGUubm93KCkgLSBzdGFydCkgPCB0aW1lb3V0TXMpIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnByb2Nlc3NFeGlzdHMocHJvY2Vzc05hbWUpKSB7XG4gICAgICAgIC8vIGNvb2wgZG93blxuICAgICAgICBhd2FpdCBzbGVlcCg0MDApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQcm9jZXNzIG5ldmVyIGRpZWQgd2l0aGluICR7dGltZW91dE1zfSBtc2ApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gYnJvYWRjYXN0IHByb2Nlc3MgZW5kLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQnJvYWRjYXN0IGEgbWVzc2FnZSB0byB0aGUgZ2l2ZW4gaW50ZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnRlbnQgLSBUaGUgbmFtZSBvZiB0aGUgaW50ZW50IHRvIGJyb2FkY2FzdCB0by5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBpbnRlbnQgbmFtZSBpcyBub3QgYSB2YWxpZCBjbGFzcyBuYW1lLlxuICovXG5tZXRob2RzLmJyb2FkY2FzdCA9IGFzeW5jIGZ1bmN0aW9uIGJyb2FkY2FzdCAoaW50ZW50KSB7XG4gIGlmICghdGhpcy5pc1ZhbGlkQ2xhc3MoaW50ZW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnRlbnQgJHtpbnRlbnR9YCk7XG4gIH1cbiAgbG9nLmRlYnVnKGBCcm9hZGNhc3Rpbmc6ICR7aW50ZW50fWApO1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnYW0nLCAnYnJvYWRjYXN0JywgJy1hJywgaW50ZW50XSk7XG59O1xuXG4vKipcbiAqIEtpbGwgQW5kcm9pZCBpbnN0cnVtZW50cyBpZiB0aGV5IGFyZSBjdXJyZW50bHkgcnVubmluZy5cbiAqL1xubWV0aG9kcy5lbmRBbmRyb2lkQ292ZXJhZ2UgPSBhc3luYyBmdW5jdGlvbiBlbmRBbmRyb2lkQ292ZXJhZ2UgKCkge1xuICBpZiAodGhpcy5pbnN0cnVtZW50UHJvYyAmJiB0aGlzLmluc3RydW1lbnRQcm9jLmlzUnVubmluZykge1xuICAgIGF3YWl0IHRoaXMuaW5zdHJ1bWVudFByb2Muc3RvcCgpO1xuICB9XG59O1xuXG4vKipcbiAqIEluc3RydW1lbnQgdGhlIHBhcnRpY3VsYXIgYWN0aXZpdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGJlIGluc3RydW1lbnRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpdml0eSAtIFRoZSBuYW1lIG9mIHRoZSBtYWluIGFjdGl2aXR5IGluIHRoaXMgcGFja2FnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0cnVtZW50V2l0aCAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGluc3RydW1lbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhY3Rpdml0eSB3aXRoLlxuICogQHRocm93cyB7ZXJyb3J9IElmIGFueSBleGNlcHRpb24gaXMgcmVwb3J0ZWQgYnkgYWRiIHNoZWxsLlxuICovXG5tZXRob2RzLmluc3RydW1lbnQgPSBhc3luYyBmdW5jdGlvbiBpbnN0cnVtZW50IChwa2csIGFjdGl2aXR5LCBpbnN0cnVtZW50V2l0aCkge1xuICBpZiAoYWN0aXZpdHlbMF0gIT09ICcuJykge1xuICAgIHBrZyA9ICcnO1xuICB9XG4gIGxldCBwa2dBY3Rpdml0eSA9IChwa2cgKyBhY3Rpdml0eSkucmVwbGFjZSgvXFwuKy9nLCAnLicpOyAvLyBGaXggcGtnLi5hY3Rpdml0eSBlcnJvclxuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbXG4gICAgJ2FtJywgJ2luc3RydW1lbnQnLFxuICAgICctZScsICdtYWluX2FjdGl2aXR5JyxcbiAgICBwa2dBY3Rpdml0eSxcbiAgICBpbnN0cnVtZW50V2l0aCxcbiAgXSk7XG4gIGlmIChzdGRvdXQuaW5kZXhPZignRXhjZXB0aW9uJykgIT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGV4Y2VwdGlvbiBkdXJpbmcgaW5zdHJ1bWVudGF0aW9uLiBPcmlnaW5hbCBlcnJvciAke3N0ZG91dC5zcGxpdCgnXFxuJylbMF19YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQ29sbGVjdCBBbmRyb2lkIGNvdmVyYWdlIGJ5IGluc3RydW1lbnRpbmcgdGhlIHBhcnRpY3VsYXIgYWN0aXZpdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGluc3RydW1lbnRDbGFzcyAtIFRoZSBuYW1lIG9mIHRoZSBpbnN0cnVtZW50YXRpb24gY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gd2FpdFBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGJlIGluc3RydW1lbnRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB3YWl0QWN0aXZpdHkgLSBUaGUgbmFtZSBvZiB0aGUgbWFpbiBhY3Rpdml0eSBpbiB0aGlzIHBhY2thZ2UuXG4gKlxuICogQHJldHVybiB7cHJvbWlzZX0gVGhlIHByb21pc2UgaXMgc3VjY2Vzc2Z1bGx5IHJlc29sdmVkIGlmIHRoZSBpbnN0cnVtZW50YXRpb24gc3RhcnRzXG4gKiAgICAgICAgICAgICAgICAgICB3aXRob3V0IGVycm9ycy5cbiAqL1xubWV0aG9kcy5hbmRyb2lkQ292ZXJhZ2UgPSBhc3luYyBmdW5jdGlvbiBhbmRyb2lkQ292ZXJhZ2UgKGluc3RydW1lbnRDbGFzcywgd2FpdFBrZywgd2FpdEFjdGl2aXR5KSB7XG4gIGlmICghdGhpcy5pc1ZhbGlkQ2xhc3MoaW5zdHJ1bWVudENsYXNzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjbGFzcyAke2luc3RydW1lbnRDbGFzc31gKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgbmV3IEIoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBhcmdzID0gdGhpcy5leGVjdXRhYmxlLmRlZmF1bHRBcmdzXG4gICAgICAuY29uY2F0KFsnc2hlbGwnLCAnYW0nLCAnaW5zdHJ1bWVudCcsICctZScsICdjb3ZlcmFnZScsICd0cnVlJywgJy13J10pXG4gICAgICAuY29uY2F0KFtpbnN0cnVtZW50Q2xhc3NdKTtcbiAgICBsb2cuZGVidWcoYENvbGxlY3RpbmcgY292ZXJhZ2UgZGF0YSB3aXRoOiAke1t0aGlzLmV4ZWN1dGFibGUucGF0aF0uY29uY2F0KGFyZ3MpLmpvaW4oJyAnKX1gKTtcbiAgICB0cnkge1xuICAgICAgLy8gYW0gaW5zdHJ1bWVudCBydW5zIGZvciB0aGUgbGlmZSBvZiB0aGUgYXBwIHByb2Nlc3MuXG4gICAgICB0aGlzLmluc3RydW1lbnRQcm9jID0gbmV3IFN1YlByb2Nlc3ModGhpcy5leGVjdXRhYmxlLnBhdGgsIGFyZ3MpO1xuICAgICAgYXdhaXQgdGhpcy5pbnN0cnVtZW50UHJvYy5zdGFydCgwKTtcbiAgICAgIHRoaXMuaW5zdHJ1bWVudFByb2Mub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgICBpZiAoc3RkZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biBpbnN0cnVtZW50YXRpb24uIE9yaWdpbmFsIGVycm9yOiAke3N0ZGVycn1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yQWN0aXZpdHkod2FpdFBrZywgd2FpdEFjdGl2aXR5KTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZWplY3QobmV3IEVycm9yKGBBbmRyb2lkIGNvdmVyYWdlIGZhaWxlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIHBhcnRpY3VsYXIgcHJvcGVydHkgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4gVGhpcyBuYW1lIHNob3VsZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUga25vd24gdG8gX2FkYiBzaGVsbCBnZXRwcm9wXyB0b29sLlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VQcm9wZXJ0eSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVByb3BlcnR5IChwcm9wZXJ0eSkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2dldHByb3AnLCBwcm9wZXJ0eV0pO1xuICBsZXQgdmFsID0gc3Rkb3V0LnRyaW0oKTtcbiAgbG9nLmRlYnVnKGBDdXJyZW50IGRldmljZSBwcm9wZXJ0eSAnJHtwcm9wZXJ0eX0nOiAke3ZhbH1gKTtcbiAgcmV0dXJuIHZhbDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gc2V0UHJvcE9wdHNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcHJpdmlsZWdlZCAtIERvIHdlIHJ1biBzZXRQcm9wIGFzIGEgcHJpdmlsZWdlZCBjb21tYW5kPyBEZWZhdWx0IHRydWUuXG4gKi9cblxuLyoqXG4gKiBTZXQgdGhlIHBhcnRpY3VsYXIgcHJvcGVydHkgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4gVGhpcyBuYW1lIHNob3VsZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUga25vd24gdG8gX2FkYiBzaGVsbCBzZXRwcm9wXyB0b29sLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbCAtIFRoZSBuZXcgcHJvcGVydHkgdmFsdWUuXG4gKiBAcGFyYW0ge3NldFByb3BPcHRzfSBvcHRzXG4gKlxuICogQHRocm93cyB7ZXJyb3J9IElmIF9zZXRwcm9wXyB1dGlsaXR5IGZhaWxzIHRvIGNoYW5nZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xubWV0aG9kcy5zZXREZXZpY2VQcm9wZXJ0eSA9IGFzeW5jIGZ1bmN0aW9uIHNldERldmljZVByb3BlcnR5IChwcm9wLCB2YWwsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7cHJpdmlsZWdlZCA9IHRydWV9ID0gb3B0cztcbiAgbG9nLmRlYnVnKGBTZXR0aW5nIGRldmljZSBwcm9wZXJ0eSAnJHtwcm9wfScgdG8gJyR7dmFsfSdgKTtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ3NldHByb3AnLCBwcm9wLCB2YWxdLCB7XG4gICAgcHJpdmlsZWdlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBzeXN0ZW0gbGFuZ3VhZ2Ugb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVN5c0xhbmd1YWdlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlU3lzTGFuZ3VhZ2UgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMubGFuZ3VhZ2UnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IGNvdW50cnkgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlU3lzQ291bnRyeSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVN5c0NvdW50cnkgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMuY291bnRyeScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgc3lzdGVtIGxvY2FsZSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VTeXNMb2NhbGUgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VTeXNMb2NhbGUgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMubG9jYWxlJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBwcm9kdWN0IGxhbmd1YWdlIG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVByb2R1Y3RMYW5ndWFnZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVByb2R1Y3RMYW5ndWFnZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0LmxvY2FsZS5sYW5ndWFnZScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgcHJvZHVjdCBjb3VudHJ5IG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVByb2R1Y3RDb3VudHJ5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlUHJvZHVjdENvdW50cnkgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5sb2NhbGUucmVnaW9uJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBwcm9kdWN0IGxvY2FsZSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VQcm9kdWN0TG9jYWxlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlUHJvZHVjdExvY2FsZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0LmxvY2FsZScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBtb2RlbCBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXRNb2RlbCA9IGFzeW5jIGZ1bmN0aW9uIGdldE1vZGVsICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubW9kZWwnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgbWFudWZhY3R1cmVyIG5hbWUgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldE1hbnVmYWN0dXJlciA9IGFzeW5jIGZ1bmN0aW9uIGdldE1hbnVmYWN0dXJlciAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0Lm1hbnVmYWN0dXJlcicpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgc2NyZWVuIHNpemUuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBEZXZpY2Ugc2NyZWVuIHNpemUgYXMgc3RyaW5nIGluIGZvcm1hdCAnV3hIJyBvclxuICogICAgICAgICAgICAgICAgICBfbnVsbF8gaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWQuXG4gKi9cbm1ldGhvZHMuZ2V0U2NyZWVuU2l6ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFNjcmVlblNpemUgKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ3dtJywgJ3NpemUnXSk7XG4gIGxldCBzaXplID0gbmV3IFJlZ0V4cCgvUGh5c2ljYWwgc2l6ZTogKFteXFxyP1xcbl0rKSovZykuZXhlYyhzdGRvdXQpO1xuICBpZiAoc2l6ZSAmJiBzaXplLmxlbmd0aCA+PSAyKSB7XG4gICAgcmV0dXJuIHNpemVbMV0udHJpbSgpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgc2NyZWVuIGRlbnNpdHkgaW4gZHBpXG4gKlxuICogQHJldHVybiB7P251bWJlcn0gRGV2aWNlIHNjcmVlbiBkZW5zaXR5IGFzIGEgbnVtYmVyIG9yIF9udWxsXyBpZiBpdFxuICogICAgICAgICAgICAgICAgICBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICovXG5tZXRob2RzLmdldFNjcmVlbkRlbnNpdHkgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5EZW5zaXR5ICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWyd3bScsICdkZW5zaXR5J10pO1xuICBsZXQgZGVuc2l0eSA9IG5ldyBSZWdFeHAoL1BoeXNpY2FsIGRlbnNpdHk6IChbXlxccj9cXG5dKykqL2cpLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKGRlbnNpdHkgJiYgZGVuc2l0eS5sZW5ndGggPj0gMikge1xuICAgIGxldCBkZW5zaXR5TnVtYmVyID0gcGFyc2VJbnQoZGVuc2l0eVsxXS50cmltKCksIDEwKTtcbiAgICByZXR1cm4gaXNOYU4oZGVuc2l0eU51bWJlcikgPyBudWxsIDogZGVuc2l0eU51bWJlcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogU2V0dXAgSFRUUCBwcm94eSBpbiBkZXZpY2UgZ2xvYmFsIHNldHRpbmdzLlxuICogUmVhZCBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9mcmFtZXdvcmtzL2Jhc2UvKy9hbmRyb2lkLTkuMC4wX3IyMS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhIGZvciBlYWNoIHByb3BlcnR5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3h5SG9zdCAtIFRoZSBob3N0IG5hbWUgb2YgdGhlIHByb3h5LlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwcm94eVBvcnQgLSBUaGUgcG9ydCBudW1iZXIgdG8gYmUgc2V0LlxuICovXG5tZXRob2RzLnNldEh0dHBQcm94eSA9IGFzeW5jIGZ1bmN0aW9uIHNldEh0dHBQcm94eSAocHJveHlIb3N0LCBwcm94eVBvcnQpIHtcbiAgbGV0IHByb3h5ID0gYCR7cHJveHlIb3N0fToke3Byb3h5UG9ydH1gO1xuICBpZiAoXy5pc1VuZGVmaW5lZChwcm94eUhvc3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYWxsIHRvIHNldEh0dHBQcm94eSBtZXRob2Qgd2l0aCB1bmRlZmluZWQgcHJveHlfaG9zdDogJHtwcm94eX1gKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwcm94eVBvcnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYWxsIHRvIHNldEh0dHBQcm94eSBtZXRob2Qgd2l0aCB1bmRlZmluZWQgcHJveHlfcG9ydCAke3Byb3h5fWApO1xuICB9XG5cbiAgY29uc3QgaHR0cFByb3h5U2V0dGlucyA9IFtcbiAgICBbJ2h0dHBfcHJveHknLCBwcm94eV0sXG4gICAgWydnbG9iYWxfaHR0cF9wcm94eV9ob3N0JywgcHJveHlIb3N0XSxcbiAgICBbJ2dsb2JhbF9odHRwX3Byb3h5X3BvcnQnLCBwcm94eVBvcnRdXG4gIF07XG4gIGZvciAoY29uc3QgW3NldHRpbmdLZXksIHNldHRpbmdWYWx1ZV0gb2YgaHR0cFByb3h5U2V0dGlucykge1xuICAgIGF3YWl0IHRoaXMuc2V0U2V0dGluZygnZ2xvYmFsJywgc2V0dGluZ0tleSwgc2V0dGluZ1ZhbHVlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBEZWxldGUgSFRUUCBwcm94eSBpbiBkZXZpY2UgZ2xvYmFsIHNldHRpbmdzLlxuICogUmVib290aW5nIHRoZSB0ZXN0IGRldmljZSBpcyBuZWNlc3NhcnkgdG8gYXBwbHkgdGhlIGNoYW5nZS5cbiAqL1xubWV0aG9kcy5kZWxldGVIdHRwUHJveHkgPSBhc3luYyBmdW5jdGlvbiBkZWxldGVIdHRwUHJveHkgKCkge1xuICBjb25zdCBodHRwUHJveHlTZXR0aW5zID0gW1xuICAgICdodHRwX3Byb3h5JyxcbiAgICAnZ2xvYmFsX2h0dHBfcHJveHlfaG9zdCcsXG4gICAgJ2dsb2JhbF9odHRwX3Byb3h5X3BvcnQnLFxuICAgICdnbG9iYWxfaHR0cF9wcm94eV9leGNsdXNpb25fbGlzdCcgLy8gYGdsb2JhbF9odHRwX3Byb3h5X2V4Y2x1c2lvbl9saXN0PWAgd2FzIGdlbmVyYXRlZCBieSBgc2V0dGluZ3MgZ2xvYmFsIGh0dG9fcHJveHkgeHh4eGBcbiAgXTtcbiAgZm9yIChjb25zdCBzZXR0aW5nIG9mIGh0dHBQcm94eVNldHRpbnMpIHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsnc2V0dGluZ3MnLCAnZGVsZXRlJywgJ2dsb2JhbCcsIHNldHRpbmddKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZXQgZGV2aWNlIHByb3BlcnR5LlxuICogW2FuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3Nde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmh0bWx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSAtIG9uZSBvZiB7c3lzdGVtLCBzZWN1cmUsIGdsb2JhbH0sIGNhc2UtaW5zZW5zaXRpdmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2V0dGluZyAtIHByb3BlcnR5IG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHZhbHVlIC0gcHJvcGVydHkgdmFsdWUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IGNvbW1hbmQgb3V0cHV0LlxuICovXG5tZXRob2RzLnNldFNldHRpbmcgPSBhc3luYyBmdW5jdGlvbiBzZXRTZXR0aW5nIChuYW1lc3BhY2UsIHNldHRpbmcsIHZhbHVlKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnc2V0dGluZ3MnLCAncHV0JywgbmFtZXNwYWNlLCBzZXR0aW5nLCB2YWx1ZV0pO1xufTtcblxuLyoqXG4gKiBHZXQgZGV2aWNlIHByb3BlcnR5LlxuICogW2FuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3Nde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmh0bWx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSAtIG9uZSBvZiB7c3lzdGVtLCBzZWN1cmUsIGdsb2JhbH0sIGNhc2UtaW5zZW5zaXRpdmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2V0dGluZyAtIHByb3BlcnR5IG5hbWUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHByb3BlcnR5IHZhbHVlLlxuICovXG5tZXRob2RzLmdldFNldHRpbmcgPSBhc3luYyBmdW5jdGlvbiBnZXRTZXR0aW5nIChuYW1lc3BhY2UsIHNldHRpbmcpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydzZXR0aW5ncycsICdnZXQnLCBuYW1lc3BhY2UsIHNldHRpbmddKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGBhZGIgYnVncmVwb3J0YCBjb21tYW5kIG91dHB1dC4gVGhpc1xuICogb3BlcmF0aW9uIG1heSB0YWtlIHVwIHRvIHNldmVyYWwgbWludXRlcy5cbiAqXG4gKiBAcGFyYW0gez9udW1iZXJ9IHRpbWVvdXQgWzEyMDAwMF0gLSBDb21tYW5kIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDb21tYW5kIHN0ZG91dFxuICovXG5tZXRob2RzLmJ1Z3JlcG9ydCA9IGFzeW5jIGZ1bmN0aW9uIGJ1Z3JlcG9ydCAodGltZW91dCA9IDEyMDAwMCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGJFeGVjKFsnYnVncmVwb3J0J10sIHt0aW1lb3V0fSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNjcmVlbnJlY29yZE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmlkZW9TaXplIC0gVGhlIGZvcm1hdCBpcyB3aWR0aHhoZWlnaHQuXG4gKiAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRoZSBkZXZpY2UncyBuYXRpdmUgZGlzcGxheSByZXNvbHV0aW9uIChpZiBzdXBwb3J0ZWQpLFxuICogICAgICAgICAgICAgICAgICAxMjgweDcyMCBpZiBub3QuIEZvciBiZXN0IHJlc3VsdHMsXG4gKiAgICAgICAgICAgICAgICAgIHVzZSBhIHNpemUgc3VwcG9ydGVkIGJ5IHlvdXIgZGV2aWNlJ3MgQWR2YW5jZWQgVmlkZW8gQ29kaW5nIChBVkMpIGVuY29kZXIuXG4gKiAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCBcIjEyODB4NzIwXCJcbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IGJ1Z1JlcG9ydCAtIFNldCBpdCB0byBgdHJ1ZWAgaW4gb3JkZXIgdG8gZGlzcGxheSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIHRoZSB2aWRlbyBvdmVybGF5LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjaCBhcyBhIHRpbWVzdGFtcCwgdGhhdCBpcyBoZWxwZnVsIGluIHZpZGVvcyBjYXB0dXJlZCB0byBpbGx1c3RyYXRlIGJ1Z3MuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBzaW5jZSBBUEkgbGV2ZWwgMjcgKEFuZHJvaWQgUCkuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSB0aW1lTGltaXQgLSBUaGUgbWF4aW11bSByZWNvcmRpbmcgdGltZSwgaW4gc2Vjb25kcy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IChhbmQgbWF4aW11bSkgdmFsdWUgaXMgMTgwICgzIG1pbnV0ZXMpLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gYml0UmF0ZSAtIFRoZSB2aWRlbyBiaXQgcmF0ZSBmb3IgdGhlIHZpZGVvLCBpbiBtZWdhYml0cyBwZXIgc2Vjb25kLlxuICogICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgNC4gWW91IGNhbiBpbmNyZWFzZSB0aGUgYml0IHJhdGUgdG8gaW1wcm92ZSB2aWRlbyBxdWFsaXR5LFxuICogICAgICAgICAgICAgICAgYnV0IGRvaW5nIHNvIHJlc3VsdHMgaW4gbGFyZ2VyIG1vdmllIGZpbGVzLlxuICovXG5cbi8qKlxuICogSW5pdGlhdGUgc2NyZWVucmVjb3JkIHV0aWxpdHkgb24gdGhlIGRldmljZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXN0aW5hdGlvbiAtIEZ1bGwgcGF0aCB0byB0aGUgd3JpdGFibGUgbWVkaWEgZmlsZSBkZXN0aW5hdGlvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIGRldmljZSBmaWxlIHN5c3RlbS5cbiAqIEBwYXJhbSB7P1NjcmVlbnJlY29yZE9wdGlvbnN9IG9wdGlvbnMgW3t9XVxuICogQHJldHVybnMge1N1YlByb2Nlc3N9IHNjcmVlbnJlY29yZCBwcm9jZXNzLCB3aGljaCBjYW4gYmUgdGhlbiBjb250cm9sbGVkIGJ5IHRoZSBjbGllbnQgY29kZVxuICovXG5tZXRob2RzLnNjcmVlbnJlY29yZCA9IGZ1bmN0aW9uIHNjcmVlbnJlY29yZCAoZGVzdGluYXRpb24sIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBjbWQgPSBbJ3NjcmVlbnJlY29yZCddO1xuICBjb25zdCB7XG4gICAgdmlkZW9TaXplLFxuICAgIGJpdFJhdGUsXG4gICAgdGltZUxpbWl0LFxuICAgIGJ1Z1JlcG9ydCxcbiAgfSA9IG9wdGlvbnM7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHZpZGVvU2l6ZSkpIHtcbiAgICBjbWQucHVzaCgnLS1zaXplJywgdmlkZW9TaXplKTtcbiAgfVxuICBpZiAodXRpbC5oYXNWYWx1ZSh0aW1lTGltaXQpKSB7XG4gICAgY21kLnB1c2goJy0tdGltZS1saW1pdCcsIHRpbWVMaW1pdCk7XG4gIH1cbiAgaWYgKHV0aWwuaGFzVmFsdWUoYml0UmF0ZSkpIHtcbiAgICBjbWQucHVzaCgnLS1iaXQtcmF0ZScsIGJpdFJhdGUpO1xuICB9XG4gIGlmIChidWdSZXBvcnQpIHtcbiAgICBjbWQucHVzaCgnLS1idWdyZXBvcnQnKTtcbiAgfVxuICBjbWQucHVzaChkZXN0aW5hdGlvbik7XG5cbiAgY29uc3QgZnVsbENtZCA9IFtcbiAgICAuLi50aGlzLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3MsXG4gICAgJ3NoZWxsJyxcbiAgICAuLi5jbWRcbiAgXTtcbiAgbG9nLmRlYnVnKGBCdWlsZGluZyBzY3JlZW5yZWNvcmQgcHJvY2VzcyB3aXRoIHRoZSBjb21tYW5kIGxpbmU6IGFkYiAke3V0aWwucXVvdGUoZnVsbENtZCl9YCk7XG4gIHJldHVybiBuZXcgU3ViUHJvY2Vzcyh0aGlzLmV4ZWN1dGFibGUucGF0aCwgZnVsbENtZCk7XG59O1xuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBpbnB1dCBtZXRob2QgY29udGV4dFxuICogYW5kIHRoZW4gcmVzdG9yZXMgdGhlIElNRSB0byB0aGUgb3JpZ2luYWwgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lIC0gVmFsaWQgSU1FIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gRnVuY3Rpb24gdG8gZXhlY3V0ZVxuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHQgb2YgdGhlIGdpdmVuIGZ1bmN0aW9uXG4gKi9cbm1ldGhvZHMucnVuSW5JbWVDb250ZXh0ID0gYXN5bmMgZnVuY3Rpb24gcnVuSW5JbWVDb250ZXh0IChpbWUsIGZuKSB7XG4gIGNvbnN0IG9yaWdpbmFsSW1lID0gYXdhaXQgdGhpcy5kZWZhdWx0SU1FKCk7XG4gIGlmIChvcmlnaW5hbEltZSA9PT0gaW1lKSB7XG4gICAgbG9nLmRlYnVnKGBUaGUgb3JpZ2luYWwgSU1FIGlzIHRoZSBzYW1lIGFzICcke2ltZX0nLiBUaGVyZSBpcyBubyBuZWVkIHRvIHJlc2V0IGl0YCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgdGhpcy5lbmFibGVJTUUoaW1lKTtcbiAgICBhd2FpdCB0aGlzLnNldElNRShpbWUpO1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNTk0M1xuICAgIGF3YWl0IEIuZGVsYXkoNTAwKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChvcmlnaW5hbEltZSAhPT0gaW1lKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldElNRShvcmlnaW5hbEltZSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdldCB0eiBkYXRhYmFzZSB0aW1lIHpvbmUgZm9ybWF0dGVkIHRpbWV6b25lXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVFogZGF0YWJhc2UgVGltZSBab25lcyBmb3JtYXRcbiAqXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgYW55IGV4Y2VwdGlvbiBpcyByZXBvcnRlZCBieSBhZGIgc2hlbGwuXG4gKi9cbm1ldGhvZHMuZ2V0VGltZVpvbmUgPSBhc3luYyBmdW5jdGlvbiBnZXRUaW1lWm9uZSAoKSB7XG4gIGxvZy5kZWJ1ZygnR2V0dGluZyBjdXJyZW50IHRpbWV6b25lJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3BlcnNpc3Quc3lzLnRpbWV6b25lJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgdGltZXpvbmUuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgZmVhdHVyZSBuYW1lcyBvciBhbiBlbXB0eSBsaXN0LlxuICogQW4gZXhhbXBsZSBhZGIgY29tbWFuZCBvdXRwdXQ6XG4gKiBgYGBcbiAqIGNtZFxuICogbHNfdjJcbiAqIGZpeGVkX3B1c2hfbWtkaXJcbiAqIHNoZWxsX3YyXG4gKiBhYmJcbiAqIHN0YXRfdjJcbiAqIGFwZXhcbiAqIGFiYl9leGVjXG4gKiByZW1vdW50X3NoZWxsXG4gKiBmaXhlZF9wdXNoX3N5bWxpbmtfdGltZXN0YW1wXG4gKiBgYGBcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcmV0cmlldmluZyB0aGUgbGlzdFxuICovXG5tZXRob2RzLmxpc3RGZWF0dXJlcyA9IGFzeW5jIGZ1bmN0aW9uIGxpc3RGZWF0dXJlcyAoKSB7XG4gIHRoaXMuX21lbW9pemVkRmVhdHVyZXMgPSB0aGlzLl9tZW1vaXplZEZlYXR1cmVzXG4gICAgfHwgXy5tZW1vaXplKGFzeW5jICgpID0+IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZlYXR1cmVzJ10pLCAoKSA9PiB0aGlzLmN1ckRldmljZUlkKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuX21lbW9pemVkRmVhdHVyZXMoKSlcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAubWFwKCh4KSA9PiB4LnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoXy5pbmNsdWRlcyhlLnN0ZGVyciwgJ3Vua25vd24gY29tbWFuZCcpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBzdGF0ZSBvZiBzdHJlYW1lZCBpbnN0YWxsIGZlYXR1cmUuXG4gKiBUaGlzIGZlYXR1cmUgYWxsb3dzIHRvIHNwZWVkIHVwIGFwayBpbnN0YWxsYXRpb25cbiAqIHNpbmNlIGl0IGRvZXMgbm90IHJlcXVpcmUgdGhlIG9yaWdpbmFsIGFwayB0byBiZSBwdXNoZWQgdG9cbiAqIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBmaXJzdCwgd2hpY2ggYWxzbyBzYXZlcyBzcGFjZS5cbiAqIEFsdGhvdWdoLCBpdCBpcyByZXF1aXJlZCB0aGF0IGJvdGggdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiBhbmQgdGhlIGFkYiBzZXJ2ZXIgaGF2ZSB0aGUgbWVudGlvbmVkIGZ1bmN0aW9uYWxpdHkuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fvc3AtbWlycm9yL3BsYXRmb3JtX3N5c3RlbV9jb3JlL2Jsb2IvbWFzdGVyL2FkYi9jbGllbnQvYWRiX2luc3RhbGwuY3BwXG4gKiBmb3IgbW9yZSBkZXRhaWxzXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgYm90aCBhZGIgYW5kIHRoZVxuICogZGV2aWNlIHVuZGVyIHRlc3RcbiAqL1xubWV0aG9kcy5pc1N0cmVhbWVkSW5zdGFsbFN1cHBvcnRlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkICgpIHtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7XG4gIHByb3RvLl9oZWxwT3V0cHV0ID0gcHJvdG8uX2hlbHBPdXRwdXQgfHwgYXdhaXQgdGhpcy5hZGJFeGVjKFsnaGVscCddKTtcbiAgcmV0dXJuIHByb3RvLl9oZWxwT3V0cHV0LmluY2x1ZGVzKCctLXN0cmVhbWluZycpXG4gICAgJiYgKGF3YWl0IHRoaXMubGlzdEZlYXR1cmVzKCkpLmluY2x1ZGVzKCdjbWQnKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgaW5jcmVtZW50YWwgaW5zdGFsbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSBBREIuXG4gKiBSZWFkIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvZmVhdHVyZXMjaW5jcmVtZW50YWxcbiAqIGZvciBtb3JlIGRldGFpbHMgb24gaXQuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgYm90aCBhZGIgYW5kIHRoZVxuICogZGV2aWNlIHVuZGVyIHRlc3RcbiAqL1xubWV0aG9kcy5pc0luY3JlbWVudGFsSW5zdGFsbFN1cHBvcnRlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkICgpIHtcbiAgY29uc3Qge2JpbmFyeX0gPSBhd2FpdCB0aGlzLmdldFZlcnNpb24oKTtcbiAgaWYgKCFiaW5hcnkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHV0aWwuY29tcGFyZVZlcnNpb25zKGJpbmFyeS52ZXJzaW9uLCAnPj0nLCAnMzAuMC4xJylcbiAgICAmJiAoYXdhaXQgdGhpcy5saXN0RmVhdHVyZXMoKSkuaW5jbHVkZXMoJ2FiYl9leGVjJyk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBwYWNrYWdlcyBmcm9tIERvemUgd2hpdGVsaXN0IG9uIEFuZHJvaWQgOCtcbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGxpc3Qgb2Ygd2hpdGVsaXN0ZWQgcGFja2FnZXMuIEFuIGV4YW1wbGUgb3V0cHV0OlxuICogc3lzdGVtLGNvbS5hbmRyb2lkLnNoZWxsLDIwMDBcbiAqIHN5c3RlbSxjb20uZ29vZ2xlLmFuZHJvaWQuY2VsbGJyb2FkY2FzdHJlY2VpdmVyLDEwMTQzXG4gKiB1c2VyLGlvLmFwcGl1bS5zZXR0aW5ncywxMDE1N1xuICovXG5tZXRob2RzLmdldERldmljZUlkbGVXaGl0ZWxpc3QgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VJZGxlV2hpdGVsaXN0ICgpIHtcbiAgaWYgKGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgLy8gRG96ZSBtb2RlIGhhcyBvbmx5IGJlZW4gYWRkZWQgc2luY2UgQW5kcm9pZCA2XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgbG9nLmluZm8oJ0xpc3RpbmcgcGFja2FnZXMgaW4gRG96ZSB3aGl0ZWxpc3QnKTtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAnZGV2aWNlaWRsZScsICd3aGl0ZWxpc3QnXSk7XG4gIHJldHVybiBfLnRyaW0ob3V0cHV0KS5zcGxpdCgvXFxuLylcbiAgICAubWFwKChsaW5lKSA9PiBfLnRyaW0obGluZSkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn07XG5cbi8qKlxuICogQWRkcyBhbiBleGlzdGluZyBwYWNrYWdlKHMpIGludG8gdGhlIERvemUgd2hpdGVsaXN0IG9uIEFuZHJvaWQgOCtcbiAqXG4gKiBAcGFyYW0gIHsuLi5zdHJpbmd9IHBhY2thZ2VzIE9uZSBvciBtb3JlIHBhY2thZ2VzIHRvIGFkZC4gSWYgdGhlIHBhY2thZ2VcbiAqIGFscmVhZHkgZXhpc3RzIGluIHRoZSB3aGl0ZWxpc3QgdGhlbiBpdCBpcyBvbmx5IGdvaW5nIHRvIGJlIGFkZGVkIG9uY2UuXG4gKiBJZiB0aGUgcGFja2FnZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGlzIG5vdCBpbnN0YWxsZWQvbm90IGtub3duIHRoZW4gYW4gZXJyb3JcbiAqIHdpbGwgYmUgdGhyb3duLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgY29tbWFuZCB0byBhZGQgcGFja2FnZShzKSBoYXMgYmVlbiBleGVjdXRlZFxuICovXG5tZXRob2RzLmFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCA9IGFzeW5jIGZ1bmN0aW9uIGFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCAoLi4ucGFja2FnZXMpIHtcbiAgaWYgKF8uaXNFbXB0eShwYWNrYWdlcykgfHwgYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAvLyBEb3plIG1vZGUgaGFzIG9ubHkgYmVlbiBhZGRlZCBzaW5jZSBBbmRyb2lkIDZcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsb2cuaW5mbyhgQWRkaW5nICR7dXRpbC5wbHVyYWxpemUoJ3BhY2thZ2UnLCBwYWNrYWdlcy5sZW5ndGgpfSAke0pTT04uc3RyaW5naWZ5KHBhY2thZ2VzKX0gdG8gRG96ZSB3aGl0ZWxpc3RgKTtcbiAgYXdhaXQgdGhpcy5zaGVsbENodW5rcygocGtnKSA9PiBbJ2R1bXBzeXMnLCAnZGV2aWNlaWRsZScsICd3aGl0ZWxpc3QnLCBgKyR7cGtnfWBdLCBwYWNrYWdlcyk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbWV0aG9kcztcbiJdLCJmaWxlIjoibGliL3Rvb2xzL2FkYi1jb21tYW5kcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
1096
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9hZGItY29tbWFuZHMuanMiXSwibmFtZXMiOlsiTUFYX1NIRUxMX0JVRkZFUl9MRU5HVEgiLCJOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SIiwiSUdOT1JFRF9QRVJNX0VSUk9SUyIsIk1BWF9QR1JFUF9QQVRURVJOX0xFTiIsIkhJRERFTl9BUElfUE9MSUNZX0tFWVMiLCJQSURfQ09MVU1OX1RJVExFIiwiUFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRSIsIlBTX1RJVExFX1BBVFRFUk4iLCJSZWdFeHAiLCJBREJfSU5QVVRfRVNDQVBFX1BBVFRFUk4iLCJtZXRob2RzIiwic2hlbGxDaHVua3MiLCJhcmdUcmFuc2Zvcm1lciIsImFyZ3MiLCJjb21tYW5kcyIsImNtZENodW5rIiwiYXJnIiwibmV4dENtZCIsIl8iLCJpc0FycmF5IiwiRXJyb3IiLCJsYXN0IiwicHVzaCIsImpvaW4iLCJsZW5ndGgiLCJpc0VtcHR5IiwibG9nIiwiZGVidWciLCJKU09OIiwic3RyaW5naWZ5IiwibGFzdEVycm9yIiwiY21kIiwic2hlbGwiLCJlIiwiZ2V0QWRiV2l0aENvcnJlY3RBZGJQYXRoIiwiZXhlY3V0YWJsZSIsInBhdGgiLCJnZXRTZGtCaW5hcnlQYXRoIiwiYWRiIiwiaW5pdEFhcHQiLCJpbml0QWFwdDIiLCJpbml0WmlwQWxpZ24iLCJpbml0QnVuZGxldG9vbCIsImJpbmFyaWVzIiwiYnVuZGxldG9vbCIsImZzIiwid2hpY2giLCJlcnIiLCJnZXRBcGlMZXZlbCIsImlzSW50ZWdlciIsIl9hcGlMZXZlbCIsInN0ck91dHB1dCIsImdldERldmljZVByb3BlcnR5IiwiYXBpTGV2ZWwiLCJwYXJzZUludCIsInRyaW0iLCJjaGFyQ29kZVEiLCJjaGFyQ29kZUF0IiwiYXBpTGV2ZWxEaWZmIiwiY29kZW5hbWUiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJnZXRQbGF0Zm9ybVZlcnNpb24iLCJ0b0xvd2VyQ2FzZSIsInRvVXBwZXJDYXNlIiwiaXNOYU4iLCJtZXNzYWdlIiwiaW5mbyIsImlzRGV2aWNlQ29ubmVjdGVkIiwiZGV2aWNlcyIsImdldENvbm5lY3RlZERldmljZXMiLCJta2RpciIsInJlbW90ZVBhdGgiLCJpc1ZhbGlkQ2xhc3MiLCJjbGFzc1N0cmluZyIsImV4ZWMiLCJmb3JjZVN0b3AiLCJwa2ciLCJraWxsUGFja2FnZSIsImNsZWFyIiwiZ3JhbnRBbGxQZXJtaXNzaW9ucyIsImFwayIsInRhcmdldFNkayIsImR1bXBzeXNPdXRwdXQiLCJ0YXJnZXRTZGtWZXJzaW9uVXNpbmdQS0ciLCJ0YXJnZXRTZGtWZXJzaW9uRnJvbU1hbmlmZXN0Iiwid2FybiIsInJlcXVlc3RlZFBlcm1pc3Npb25zIiwiZ2V0UmVxUGVybWlzc2lvbnMiLCJncmFudGVkUGVybWlzc2lvbnMiLCJnZXRHcmFudGVkUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9uc1RvR3JhbnQiLCJkaWZmZXJlbmNlIiwiZ3JhbnRQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwicGVybSIsInNvbWUiLCJwYXR0ZXJuIiwidGVzdCIsInN0ZGVyciIsImdyYW50UGVybWlzc2lvbiIsInBlcm1pc3Npb24iLCJyZXZva2VQZXJtaXNzaW9uIiwiY21kT3V0cHV0Iiwic3Rkb3V0IiwiZ2V0RGVuaWVkUGVybWlzc2lvbnMiLCJnZXRMb2NhdGlvblByb3ZpZGVycyIsImdldFNldHRpbmciLCJzcGxpdCIsIm1hcCIsInAiLCJmaWx0ZXIiLCJCb29sZWFuIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsImVuYWJsZWQiLCJzZXRTZXR0aW5nIiwic2V0SGlkZGVuQXBpUG9saWN5IiwidmFsdWUiLCJpZ25vcmVFcnJvciIsImsiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5Iiwic3RvcEFuZENsZWFyIiwiYXZhaWxhYmxlSU1FcyIsImVuYWJsZWRJTUVzIiwiZW5hYmxlSU1FIiwiaW1lSWQiLCJkaXNhYmxlSU1FIiwic2V0SU1FIiwiZGVmYXVsdElNRSIsImVuZ2luZSIsImtleWV2ZW50Iiwia2V5Y29kZSIsImNvZGUiLCJpbnB1dFRleHQiLCJ0ZXh0Iiwib3JpZ2luYWxTdHIiLCJlc2NhcGVkVGV4dCIsInJlcGxhY2UiLCJldmVyeSIsImMiLCJpbmNsdWRlcyIsInEiLCJjbGVhclRleHRGaWVsZCIsImkiLCJsb2NrIiwiaXNTY3JlZW5Mb2NrZWQiLCJ0aW1lb3V0TXMiLCJ3YWl0TXMiLCJpbnRlcnZhbE1zIiwiYmFjayIsImdvVG9Ib21lIiwiZ2V0QWRiUGF0aCIsImdldFNjcmVlbk9yaWVudGF0aW9uIiwic2VuZFRlbG5ldENvbW1hbmQiLCJjb21tYW5kIiwiZXhlY0VtdUNvbnNvbGVDb21tYW5kIiwicG9ydCIsImdldEVtdWxhdG9yUG9ydCIsImlzQWlycGxhbmVNb2RlT24iLCJzZXRBaXJwbGFuZU1vZGUiLCJvbiIsImJyb2FkY2FzdEFpcnBsYW5lTW9kZSIsImlzV2lmaU9uIiwiaXNEYXRhT24iLCJzZXRXaWZpQW5kRGF0YSIsIndpZmkiLCJkYXRhIiwiaXNFbXVsYXRvciIsInV0aWwiLCJoYXNWYWx1ZSIsInNldFdpZmlTdGF0ZSIsInNldERhdGFTdGF0ZSIsImlzQW5pbWF0aW9uT24iLCJhbmltYXRvcl9kdXJhdGlvbl9zY2FsZSIsInRyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlIiwid2luZG93X2FuaW1hdGlvbl9zY2FsZSIsInNldHRpbmciLCJyaW1yYWYiLCJsb2NhbFBhdGgiLCJvcHRzIiwicG9zaXgiLCJkaXJuYW1lIiwiYWRiRXhlYyIsInB1bGwiLCJ0aW1lb3V0IiwicHJvY2Vzc0V4aXN0cyIsInByb2Nlc3NOYW1lIiwiZ2V0UElEc0J5TmFtZSIsImdldEZvcndhcmRMaXN0IiwiY29ubmVjdGlvbnMiLCJFT0wiLCJsaW5lIiwiZm9yd2FyZFBvcnQiLCJzeXN0ZW1Qb3J0IiwiZGV2aWNlUG9ydCIsInJlbW92ZVBvcnRGb3J3YXJkIiwiZ2V0UmV2ZXJzZUxpc3QiLCJyZXZlcnNlUG9ydCIsInJlbW92ZVBvcnRSZXZlcnNlIiwiZm9yd2FyZEFic3RyYWN0UG9ydCIsInBpbmciLCJpbmRleE9mIiwicmVzdGFydCIsInN0b3BMb2djYXQiLCJyZXN0YXJ0QWRiIiwid2FpdEZvckRldmljZSIsInN0YXJ0TG9nY2F0IiwiX2xvZ2NhdFN0YXJ0dXBQYXJhbXMiLCJsb2djYXQiLCJMb2djYXQiLCJkZWJ1Z1RyYWNlIiwiY2xlYXJEZXZpY2VMb2dzT25TdGFydCIsInN0YXJ0Q2FwdHVyZSIsInN0b3BDYXB0dXJlIiwiZ2V0TG9nY2F0TG9ncyIsImdldExvZ3MiLCJzZXRMb2djYXRMaXN0ZW5lciIsImxpc3RlbmVyIiwicmVtb3ZlTG9nY2F0TGlzdGVuZXIiLCJyZW1vdmVMaXN0ZW5lciIsImxpc3RQcm9jZXNzU3RhdHVzIiwiaXNCb29sZWFuIiwiX2RvZXNQc1N1cHBvcnRBT3B0aW9uIiwic3RhY2siLCJnZXROYW1lQnlQaWQiLCJwaWQiLCJ0aXRsZU1hdGNoIiwiYWxsVGl0bGVzIiwicGlkSW5kZXgiLCJuYW1lT2Zmc2V0IiwicGlkUmVnZXgiLCJtYXRjaGVkTGluZSIsIml0ZW1zIiwibmFtZSIsIl9pc1BncmVwQXZhaWxhYmxlIiwicGdyZXBPdXRwdXQiLCJfY2FuUGdyZXBVc2VGdWxsQ21kTGluZVNlYXJjaCIsIl9pc1BpZG9mQXZhaWxhYmxlIiwic2hlbGxDb21tYW5kIiwiZXNjYXBlUmVnRXhwIiwic2xpY2UiLCJ4IiwicGlkcyIsInByb2Nlc3NOYW1lUmVnZXgiLCJraWxsUHJvY2Vzc2VzQnlOYW1lIiwiQiIsImFsbCIsImtpbGxQcm9jZXNzQnlQSUQiLCJub1Byb2Nlc3NGbGFnIiwicHJpdmlsZWdlZCIsImUxIiwiYnJvYWRjYXN0UHJvY2Vzc0VuZCIsImludGVudCIsImJyb2FkY2FzdCIsInN0YXJ0IiwiRGF0ZSIsIm5vdyIsImVuZEFuZHJvaWRDb3ZlcmFnZSIsImluc3RydW1lbnRQcm9jIiwiaXNSdW5uaW5nIiwic3RvcCIsImluc3RydW1lbnQiLCJhY3Rpdml0eSIsImluc3RydW1lbnRXaXRoIiwicGtnQWN0aXZpdHkiLCJhbmRyb2lkQ292ZXJhZ2UiLCJpbnN0cnVtZW50Q2xhc3MiLCJ3YWl0UGtnIiwid2FpdEFjdGl2aXR5IiwicmVzb2x2ZSIsInJlamVjdCIsImRlZmF1bHRBcmdzIiwiY29uY2F0IiwiU3ViUHJvY2VzcyIsIndhaXRGb3JBY3Rpdml0eSIsInByb3BlcnR5IiwidmFsIiwic2V0RGV2aWNlUHJvcGVydHkiLCJwcm9wIiwiZ2V0RGV2aWNlU3lzTGFuZ3VhZ2UiLCJnZXREZXZpY2VTeXNDb3VudHJ5IiwiZ2V0RGV2aWNlU3lzTG9jYWxlIiwiZ2V0RGV2aWNlUHJvZHVjdExhbmd1YWdlIiwiZ2V0RGV2aWNlUHJvZHVjdENvdW50cnkiLCJnZXREZXZpY2VQcm9kdWN0TG9jYWxlIiwiZ2V0TW9kZWwiLCJnZXRNYW51ZmFjdHVyZXIiLCJnZXRTY3JlZW5TaXplIiwic2l6ZSIsImdldFNjcmVlbkRlbnNpdHkiLCJkZW5zaXR5IiwiZGVuc2l0eU51bWJlciIsInNldEh0dHBQcm94eSIsInByb3h5SG9zdCIsInByb3h5UG9ydCIsInByb3h5IiwiaXNVbmRlZmluZWQiLCJodHRwUHJveHlTZXR0aW5zIiwic2V0dGluZ0tleSIsInNldHRpbmdWYWx1ZSIsImRlbGV0ZUh0dHBQcm94eSIsIm5hbWVzcGFjZSIsImJ1Z3JlcG9ydCIsInNjcmVlbnJlY29yZCIsImRlc3RpbmF0aW9uIiwib3B0aW9ucyIsInZpZGVvU2l6ZSIsImJpdFJhdGUiLCJ0aW1lTGltaXQiLCJidWdSZXBvcnQiLCJmdWxsQ21kIiwicXVvdGUiLCJydW5JbkltZUNvbnRleHQiLCJpbWUiLCJmbiIsIm9yaWdpbmFsSW1lIiwiZGVsYXkiLCJnZXRUaW1lWm9uZSIsImxpc3RGZWF0dXJlcyIsIl9tZW1vaXplZEZlYXR1cmVzIiwibWVtb2l6ZSIsImN1ckRldmljZUlkIiwiaXNTdHJlYW1lZEluc3RhbGxTdXBwb3J0ZWQiLCJwcm90byIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwiX2hlbHBPdXRwdXQiLCJpc0luY3JlbWVudGFsSW5zdGFsbFN1cHBvcnRlZCIsImJpbmFyeSIsImdldFZlcnNpb24iLCJjb21wYXJlVmVyc2lvbnMiLCJ2ZXJzaW9uIiwiZ2V0RGV2aWNlSWRsZVdoaXRlbGlzdCIsIm91dHB1dCIsImFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCIsInBhY2thZ2VzIiwicGx1cmFsaXplIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLHVCQUF1QixHQUFHLElBQWhDO0FBQ0EsTUFBTUMseUJBQXlCLEdBQUcsbUNBQWxDO0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUcsQ0FDMUJELHlCQUQwQixFQUUxQixxQkFGMEIsQ0FBNUI7QUFJQSxNQUFNRSxxQkFBcUIsR0FBRyxFQUE5QjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLENBQzdCLDhCQUQ2QixFQUU3QiwwQkFGNkIsRUFHN0IsbUJBSDZCLENBQS9CO0FBS0EsTUFBTUMsZ0JBQWdCLEdBQUcsS0FBekI7QUFDQSxNQUFNQyx5QkFBeUIsR0FBRyxNQUFsQztBQUNBLE1BQU1DLGdCQUFnQixHQUFHLElBQUlDLE1BQUosQ0FBWSxVQUFTSCxnQkFBaUIsV0FBVUMseUJBQTBCLFNBQTFFLEVBQW9GLEdBQXBGLENBQXpCO0FBRUEsTUFBTUcsd0JBQXdCLEdBQUcsbUJBQWpDO0FBRUEsTUFBTUMsT0FBTyxHQUFHLEVBQWhCOztBQWdCQUEsT0FBTyxDQUFDQyxXQUFSLEdBQXNCLGVBQWVBLFdBQWYsQ0FBNEJDLGNBQTVCLEVBQTRDQyxJQUE1QyxFQUFrRDtBQUN0RSxRQUFNQyxRQUFRLEdBQUcsRUFBakI7QUFDQSxNQUFJQyxRQUFRLEdBQUcsRUFBZjs7QUFDQSxPQUFLLE1BQU1DLEdBQVgsSUFBa0JILElBQWxCLEVBQXdCO0FBQ3RCLFVBQU1JLE9BQU8sR0FBR0wsY0FBYyxDQUFDSSxHQUFELENBQTlCOztBQUNBLFFBQUksQ0FBQ0UsZ0JBQUVDLE9BQUYsQ0FBVUYsT0FBVixDQUFMLEVBQXlCO0FBQ3ZCLFlBQU0sSUFBSUcsS0FBSixDQUFVLDhD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Q0Q7O0FBRUR0QixrQkFBSXlDLElBQUosQ0FBVSxVQUFTcUcsY0FBS3dLLFNBQUwsQ0FBZSxTQUFmLEVBQTBCRCxRQUFRLENBQUN2VCxNQUFuQyxDQUEyQyxJQUFHSSxJQUFJLENBQUNDLFNBQUwsQ0FBZWtULFFBQWYsQ0FBeUIsb0JBQTFGOztBQUNBLFFBQU0sS0FBS3BVLFdBQUwsQ0FBa0JrRSxHQUFELElBQVMsQ0FBQyxTQUFELEVBQVksWUFBWixFQUEwQixXQUExQixFQUF3QyxJQUFHQSxHQUFJLEVBQS9DLENBQTFCLEVBQTZFa1EsUUFBN0UsQ0FBTjtBQUNBLFNBQU8sSUFBUDtBQUNELENBVEQ7O2VBV2VyVSxPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgZ2V0SU1FTGlzdEZyb21PdXRwdXQsIGdldFN1cmZhY2VPcmllbnRhdGlvbiwgZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMsXG59IGZyb20gJy4uL2hlbHBlcnMuanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgRU9MIH0gZnJvbSAnb3MnO1xuaW1wb3J0IExvZ2NhdCBmcm9tICcuLi9sb2djYXQnO1xuaW1wb3J0IHsgc2xlZXAsIHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBTdWJQcm9jZXNzIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxuY29uc3QgTUFYX1NIRUxMX0JVRkZFUl9MRU5HVEggPSAxMDAwO1xuY29uc3QgTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUiA9IC9ub3QgYSBjaGFuZ2VhYmxlIHBlcm1pc3Npb24gdHlwZS9pO1xuY29uc3QgSUdOT1JFRF9QRVJNX0VSUk9SUyA9IFtcbiAgTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUixcbiAgL1Vua25vd24gcGVybWlzc2lvbi9pLFxuXTtcbmNvbnN0IE1BWF9QR1JFUF9QQVRURVJOX0xFTiA9IDE1O1xuY29uc3QgSElEREVOX0FQSV9QT0xJQ1lfS0VZUyA9IFtcbiAgJ2hpZGRlbl9hcGlfcG9saWN5X3ByZV9wX2FwcHMnLFxuICAnaGlkZGVuX2FwaV9wb2xpY3lfcF9hcHBzJyxcbiAgJ2hpZGRlbl9hcGlfcG9saWN5J1xuXTtcbmNvbnN0IFBJRF9DT0xVTU5fVElUTEUgPSAnUElEJztcbmNvbnN0IFBST0NFU1NfTkFNRV9DT0xVTU5fVElUTEUgPSAnTkFNRSc7XG5jb25zdCBQU19USVRMRV9QQVRURVJOID0gbmV3IFJlZ0V4cChgXiguKlxcXFxiJHtQSURfQ09MVU1OX1RJVExFfVxcXFxiLipcXFxcYiR7UFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRX1cXFxcYi4qKSRgLCAnbScpO1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjU3OTE0MjMvYWRiLXNoZWxsLWlucHV0LXRleHQtZG9lcy1ub3QtdGFrZS1hbXBlcnNhbmQtY2hhcmFjdGVyLzI1NzkxNDk4XG5jb25zdCBBREJfSU5QVVRfRVNDQVBFX1BBVFRFUk4gPSAvWygpPD58OyYqXFxcXH5eXCInXS9nO1xuXG5jb25zdCBtZXRob2RzID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBjaHVua3MgZm9yIHRoZSBnaXZlbiBhcmd1bWVudHMgYW5kIGV4ZWN1dGVzIHRoZW0gaW4gYGFkYiBzaGVsbGAuXG4gKiBUaGlzIGlzIGZhc3RlciB0aGFuIGNhbGxpbmcgYGFkYiBzaGVsbGAgc2VwYXJhdGVseSBmb3IgZWFjaCBhcmcsIGhvd2V2ZXJcbiAqIHRoZXJlIGlzIGEgbGltaXQgZm9yIGEgbWF4aW11bSBsZW5ndGggb2YgYSBzaW5nbGUgYWRiIGNvbW1hbmQuIHRoYXQgaXMgd2h5XG4gKiB3ZSBuZWVkIGFsbCB0aGlzIGNvbXBsaWNhdGVkIGxvZ2ljLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGFyZ1RyYW5zZm9ybWVyIEEgZnVuY3Rpb24sIHRoYXQgcmVjZWl2ZXMgc2luZ2xlIGFyZ3VtZW50XG4gKiBmcm9tIHRoZSBgYXJnc2AgYXJyYXkgYW5kIHRyYW5zZm9ybXMgaXQgaW50byBhIHNoZWxsIGNvbW1hbmQuIFRoZSByZXN1bHRcbiAqIG9mIHRoZSBmdW5jdGlvbiBtdXN0IGJlIGFuIGFycmF5LCB3aGVyZSBlYWNoIGl0ZW0gaXMgYSBwYXJ0IG9mIGEgc2luZ2xlIGNvbW1hbmQuXG4gKiBUaGUgbGFzdCBpdGVtIG9mIHRoZSBhcnJheSBjb3VsZCBiZSAnOycuIElmIHRoaXMgaXMgbm90IGEgc2VtaWNvbG9uIHRoZW4gaXQgaXMgZ29pbmcgdG9cbiAqIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcnxzdHJpbmc+fSBhcmdzIEFycmF5IG9mIGFyZ3VtZW50IHZhbHVlcyB0byBjcmVhdGUgY2h1bmtzIGZvclxuICogQHRocm93cyB7RXJyb3J9IElmIGFueSBvZiB0aGUgY2h1bmtzIHJldHVybnMgbm9uLXplcm8gZXhpdCBjb2RlIGFmdGVyIGJlaW5nIGV4ZWN1dGVkXG4gKi9cbm1ldGhvZHMuc2hlbGxDaHVua3MgPSBhc3luYyBmdW5jdGlvbiBzaGVsbENodW5rcyAoYXJnVHJhbnNmb3JtZXIsIGFyZ3MpIHtcbiAgY29uc3QgY29tbWFuZHMgPSBbXTtcbiAgbGV0IGNtZENodW5rID0gW107XG4gIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICBjb25zdCBuZXh0Q21kID0gYXJnVHJhbnNmb3JtZXIoYXJnKTtcbiAgICBpZiAoIV8uaXNBcnJheShuZXh0Q21kKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcmd1bWVudCB0cmFuc2Zvcm1lciBtdXN0IHJlc3VsdCBpbiBhbiBhcnJheScpO1xuICAgIH1cbiAgICBpZiAoXy5sYXN0KG5leHRDbWQpICE9PSAnOycpIHtcbiAgICAgIG5leHRDbWQucHVzaCgnOycpO1xuICAgIH1cbiAgICBpZiAobmV4dENtZC5qb2luKCcgJykubGVuZ3RoICsgY21kQ2h1bmsuam9pbignICcpLmxlbmd0aCA+PSBNQVhfU0hFTExfQlVGRkVSX0xFTkdUSCkge1xuICAgICAgY29tbWFuZHMucHVzaChjbWRDaHVuayk7XG4gICAgICBjbWRDaHVuayA9IFtdO1xuICAgIH1cbiAgICBjbWRDaHVuayA9IFsuLi5jbWRDaHVuaywgLi4ubmV4dENtZF07XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkoY21kQ2h1bmspKSB7XG4gICAgY29tbWFuZHMucHVzaChjbWRDaHVuayk7XG4gIH1cbiAgbG9nLmRlYnVnKGBHb3QgdGhlIGZvbGxvd2luZyBjb21tYW5kIGNodW5rcyB0byBleGVjdXRlOiAke0pTT04uc3RyaW5naWZ5KGNvbW1hbmRzKX1gKTtcbiAgbGV0IGxhc3RFcnJvciA9IG51bGw7XG4gIGZvciAoY29uc3QgY21kIG9mIGNvbW1hbmRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2hlbGwoY21kKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsYXN0RXJyb3IgPSBlO1xuICAgIH1cbiAgfVxuICBpZiAobGFzdEVycm9yKSB7XG4gICAgdGhyb3cgbGFzdEVycm9yO1xuICB9XG59O1xuXG4vKipcbiAqIEdldCB0aGUgcGF0aCB0byBhZGIgZXhlY3V0YWJsZSBhbWQgYXNzaWduIGl0XG4gKiB0byB0aGlzLmV4ZWN1dGFibGUucGF0aCBhbmQgdGhpcy5iaW5hcmllcy5hZGIgcHJvcGVydGllcy5cbiAqXG4gKiBAcmV0dXJuIHtBREJ9IEFEQiBpbnN0YW5jZS5cbiAqL1xubWV0aG9kcy5nZXRBZGJXaXRoQ29ycmVjdEFkYlBhdGggPSBhc3luYyBmdW5jdGlvbiBnZXRBZGJXaXRoQ29ycmVjdEFkYlBhdGggKCkge1xuICB0aGlzLmV4ZWN1dGFibGUucGF0aCA9IGF3YWl0IHRoaXMuZ2V0U2RrQmluYXJ5UGF0aCgnYWRiJyk7XG4gIHJldHVybiB0aGlzLmFkYjtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBmdWxsIHBhdGggdG8gYWFwdCB0b29sIGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuYWFwdCBwcm9wZXJ0eVxuICovXG5tZXRob2RzLmluaXRBYXB0ID0gYXN5bmMgZnVuY3Rpb24gaW5pdEFhcHQgKCkge1xuICBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ2FhcHQnKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBmdWxsIHBhdGggdG8gYWFwdDIgdG9vbCBhbmQgYXNzaWduIGl0IHRvXG4gKiB0aGlzLmJpbmFyaWVzLmFhcHQyIHByb3BlcnR5XG4gKi9cbm1ldGhvZHMuaW5pdEFhcHQyID0gYXN5bmMgZnVuY3Rpb24gaW5pdEFhcHQyICgpIHtcbiAgYXdhaXQgdGhpcy5nZXRTZGtCaW5hcnlQYXRoKCdhYXB0MicpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgcGF0aCB0byB6aXBhbGlnbiB0b29sIGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuemlwYWxpZ24gcHJvcGVydHlcbiAqL1xubWV0aG9kcy5pbml0WmlwQWxpZ24gPSBhc3luYyBmdW5jdGlvbiBpbml0WmlwQWxpZ24gKCkge1xuICBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ3ppcGFsaWduJyk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZnVsbCBwYXRoIHRvIGJ1bmRsZXRvb2wgYmluYXJ5IGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuYnVuZGxldG9vbCBwcm9wZXJ0eVxuICovXG5tZXRob2RzLmluaXRCdW5kbGV0b29sID0gYXN5bmMgZnVuY3Rpb24gaW5pdEJ1bmRsZXRvb2wgKCkge1xuICB0cnkge1xuICAgIHRoaXMuYmluYXJpZXMuYnVuZGxldG9vbCA9IGF3YWl0IGZzLndoaWNoKCdidW5kbGV0b29sLmphcicpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1bmRsZXRvb2wuamFyIGJpbmFyeSBpcyBleHBlY3RlZCB0byBiZSBwcmVzZW50IGluIFBBVEguICcgK1xuICAgICAgJ1Zpc2l0IGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvYnVuZGxldG9vbCBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBBUEkgbGV2ZWwgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIEFQSSBsZXZlbCBhcyBpbnRlZ2VyIG51bWJlciwgZm9yIGV4YW1wbGUgMjEgZm9yXG4gKiAgICAgICAgICAgICAgICAgIEFuZHJvaWQgTG9sbGlwb3AuIFRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgaXMgY2FjaGVkLCBzbyBhbGwgdGhlIGZ1cnRoZXJcbiAqIGNhbGxzIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgZmlyc3Qgb25lLlxuICovXG5tZXRob2RzLmdldEFwaUxldmVsID0gYXN5bmMgZnVuY3Rpb24gZ2V0QXBpTGV2ZWwgKCkge1xuICBpZiAoIV8uaXNJbnRlZ2VyKHRoaXMuX2FwaUxldmVsKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdHJPdXRwdXQgPSBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5idWlsZC52ZXJzaW9uLnNkaycpO1xuICAgICAgbGV0IGFwaUxldmVsID0gcGFyc2VJbnQoc3RyT3V0cHV0LnRyaW0oKSwgMTApO1xuXG4gICAgICAvLyBXb3JrYXJvdW5kIGZvciBwcmV2aWV3L2JldGEgcGxhdGZvcm0gQVBJIGxldmVsXG4gICAgICBjb25zdCBjaGFyQ29kZVEgPSAncScuY2hhckNvZGVBdCgwKTtcbiAgICAgIC8vIDI4IGlzIHRoZSBmaXJzdCBBUEkgTGV2ZWwsIHdoZXJlIEFuZHJvaWQgU0RLIHN0YXJ0ZWQgcmV0dXJuaW5nIGxldHRlcnMgaW4gcmVzcG9uc2UgdG8gZ2V0UGxhdGZvcm1WZXJzaW9uXG4gICAgICBjb25zdCBhcGlMZXZlbERpZmYgPSBhcGlMZXZlbCAtIDI4O1xuICAgICAgY29uc3QgY29kZW5hbWUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlUSArIGFwaUxldmVsRGlmZik7XG4gICAgICBpZiAoYXBpTGV2ZWxEaWZmID49IDAgJiYgKGF3YWl0IHRoaXMuZ2V0UGxhdGZvcm1WZXJzaW9uKCkpLnRvTG93ZXJDYXNlKCkgPT09IGNvZGVuYW1lKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgUmVsZWFzZSB2ZXJzaW9uIGlzICR7Y29kZW5hbWUudG9VcHBlckNhc2UoKX0gYnV0IGZvdW5kIEFQSSBMZXZlbCAke2FwaUxldmVsfS4gU2V0dGluZyBBUEkgTGV2ZWwgdG8gJHthcGlMZXZlbCArIDF9YCk7XG4gICAgICAgIGFwaUxldmVsKys7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2FwaUxldmVsID0gYXBpTGV2ZWw7XG4gICAgICBsb2cuZGVidWcoYERldmljZSBBUEkgbGV2ZWw6ICR7dGhpcy5fYXBpTGV2ZWx9YCk7XG4gICAgICBpZiAoaXNOYU4odGhpcy5fYXBpTGV2ZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGFjdHVhbCBvdXRwdXQgJyR7c3RyT3V0cHV0fScgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGRldmljZSBBUEkgbGV2ZWwuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2FwaUxldmVsO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgcGxhdGZvcm0gdmVyc2lvbiBhcyBhIHN0cmluZywgZm9yIGV4YW1wbGUgJzUuMCcgZm9yXG4gKiBBbmRyb2lkIExvbGxpcG9wLlxuICovXG5tZXRob2RzLmdldFBsYXRmb3JtVmVyc2lvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldFBsYXRmb3JtVmVyc2lvbiAoKSB7XG4gIGxvZy5pbmZvKCdHZXR0aW5nIGRldmljZSBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLmJ1aWxkLnZlcnNpb24ucmVsZWFzZScpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGRldmljZSBwbGF0Zm9ybSB2ZXJzaW9uLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogVmVyaWZ5IHdoZXRoZXIgYSBkZXZpY2UgaXMgY29ubmVjdGVkLlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYXQgbGVhc3Qgb25lIGRldmljZSBpcyB2aXNpYmxlIHRvIGFkYi5cbiAqL1xubWV0aG9kcy5pc0RldmljZUNvbm5lY3RlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzRGV2aWNlQ29ubmVjdGVkICgpIHtcbiAgbGV0IGRldmljZXMgPSBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZXMoKTtcbiAgcmV0dXJuIGRldmljZXMubGVuZ3RoID4gMDtcbn07XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgY3JlYXRlIGEgbmV3IGZvbGRlciBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgbmV3IHBhdGggdG8gYmUgY3JlYXRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gbWtkaXIgY29tbWFuZCBvdXRwdXQuXG4gKi9cbm1ldGhvZHMubWtkaXIgPSBhc3luYyBmdW5jdGlvbiBta2RpciAocmVtb3RlUGF0aCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ21rZGlyJywgJy1wJywgcmVtb3RlUGF0aF0pO1xufTtcblxuLyoqXG4gKiBWZXJpZnkgd2hldGhlciB0aGUgZ2l2ZW4gYXJndW1lbnQgaXMgYVxuICogdmFsaWQgY2xhc3MgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NTdHJpbmcgLSBUaGUgYWN0dWFsIGNsYXNzIG5hbWUgdG8gYmUgdmVyaWZpZWQuXG4gKiBAcmV0dXJuIHs/QXJyYXkuPE1hdGNoPn0gVGhlIHJlc3VsdCBvZiBSZWdleHAuZXhlYyBvcGVyYXRpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciBfbnVsbF8gaWYgbm8gbWF0Y2hlcyBhcmUgZm91bmQuXG4gKi9cbm1ldGhvZHMuaXNWYWxpZENsYXNzID0gZnVuY3Rpb24gaXNWYWxpZENsYXNzIChjbGFzc1N0cmluZykge1xuICAvLyBzb21lLnBhY2thZ2Uvc29tZS5wYWNrYWdlLkFjdGl2aXR5XG4gIHJldHVybiBuZXcgUmVnRXhwKC9eW2EtekEtWjAtOS4vX10rJC8pLmV4ZWMoY2xhc3NTdHJpbmcpO1xufTtcblxuLyoqXG4gKiBGb3JjZSBhcHBsaWNhdGlvbiB0byBzdG9wIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBzdG9wcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLlxuICovXG5tZXRob2RzLmZvcmNlU3RvcCA9IGFzeW5jIGZ1bmN0aW9uIGZvcmNlU3RvcCAocGtnKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnYW0nLCAnZm9yY2Utc3RvcCcsIHBrZ10pO1xufTtcblxuLypcbiAqIEtpbGwgYXBwbGljYXRpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBzdG9wcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLlxuICovXG5tZXRob2RzLmtpbGxQYWNrYWdlID0gYXN5bmMgZnVuY3Rpb24ga2lsbFBhY2thZ2UgKHBrZykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ2FtJywgJ2tpbGwnLCBwa2ddKTtcbn07XG5cbi8qKlxuICogQ2xlYXIgdGhlIHVzZXIgZGF0YSBvZiB0aGUgcGFydGljdWxhciBhcHBsaWNhdGlvbiBvbiB0aGUgZGV2aWNlXG4gKiB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIGNsZWFyZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuXG4gKi9cbm1ldGhvZHMuY2xlYXIgPSBhc3luYyBmdW5jdGlvbiBjbGVhciAocGtnKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsncG0nLCAnY2xlYXInLCBwa2ddKTtcbn07XG5cbi8qKlxuICogR3JhbnQgYWxsIHBlcm1pc3Npb25zIHJlcXVlc3RlZCBieSB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICogVGhpcyBtZXRob2QgaXMgb25seSB1c2VmdWwgb24gQW5kcm9pZCA2LjArIGFuZCBmb3IgYXBwbGljYXRpb25zXG4gKiB0aGF0IHN1cHBvcnQgY29tcG9uZW50cy1iYXNlZCBwZXJtaXNzaW9ucyBzZXR0aW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGsgLSBUaGUgcGF0aCB0byB0aGUgYWN0dWFsIGFwayBmaWxlLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBncmFudGluZyBwZXJtaXNzaW9uc1xuICovXG5tZXRob2RzLmdyYW50QWxsUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBncmFudEFsbFBlcm1pc3Npb25zIChwa2csIGFwaykge1xuICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKTtcbiAgbGV0IHRhcmdldFNkayA9IDA7XG4gIGxldCBkdW1wc3lzT3V0cHV0ID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBpZiAoIWFwaykge1xuICAgICAgLyoqXG4gICAgICAgKiBJZiBhcGsgbm90IHByb3ZpZGVkLCBjb25zaWRlcmluZyBhcGsgYWxyZWFkeSBpbnN0YWxsZWQgb24gdGhlIGRldmljZVxuICAgICAgICogYW5kIGZldGNoaW5nIHRhcmdldFNkayB1c2luZyBwYWNrYWdlIG5hbWUuXG4gICAgICAgKi9cbiAgICAgIGR1bXBzeXNPdXRwdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gICAgICB0YXJnZXRTZGsgPSBhd2FpdCB0aGlzLnRhcmdldFNka1ZlcnNpb25Vc2luZ1BLRyhwa2csIGR1bXBzeXNPdXRwdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXRTZGsgPSBhd2FpdCB0aGlzLnRhcmdldFNka1ZlcnNpb25Gcm9tTWFuaWZlc3QoYXBrKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvL2F2b2lkaW5nIGxvZ2dpbmcgZXJyb3Igc3RhY2ssIGFzIGNhbGxpbmcgbGlicmFyeSBmdW5jdGlvbiB3b3VsZCBoYXZlIGxvZ2dlZFxuICAgIGxvZy53YXJuKGBSYW4gaW50byBwcm9ibGVtIGdldHRpbmcgdGFyZ2V0IFNESyB2ZXJzaW9uOyBpZ25vcmluZy4uLmApO1xuICB9XG4gIGlmIChhcGlMZXZlbCA+PSAyMyAmJiB0YXJnZXRTZGsgPj0gMjMpIHtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZGV2aWNlIGlzIHJ1bm5pbmcgQW5kcm9pZCA2LjAoQVBJIDIzKSBvciBoaWdoZXIsIGFuZCB5b3VyIGFwcCdzIHRhcmdldCBTREsgaXMgMjMgb3IgaGlnaGVyOlxuICAgICAqIFRoZSBhcHAgaGFzIHRvIGxpc3QgdGhlIHBlcm1pc3Npb25zIGluIHRoZSBtYW5pZmVzdC5cbiAgICAgKiByZWZlcjogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vdHJhaW5pbmcvcGVybWlzc2lvbnMvcmVxdWVzdGluZy5odG1sXG4gICAgICovXG4gICAgZHVtcHN5c091dHB1dCA9IGR1bXBzeXNPdXRwdXQgfHwgYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICAgIGNvbnN0IHJlcXVlc3RlZFBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5nZXRSZXFQZXJtaXNzaW9ucyhwa2csIGR1bXBzeXNPdXRwdXQpO1xuICAgIGNvbnN0IGdyYW50ZWRQZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMuZ2V0R3JhbnRlZFBlcm1pc3Npb25zKHBrZywgZHVtcHN5c091dHB1dCk7XG4gICAgY29uc3QgcGVybWlzc2lvbnNUb0dyYW50ID0gXy5kaWZmZXJlbmNlKHJlcXVlc3RlZFBlcm1pc3Npb25zLCBncmFudGVkUGVybWlzc2lvbnMpO1xuICAgIGlmIChfLmlzRW1wdHkocGVybWlzc2lvbnNUb0dyYW50KSkge1xuICAgICAgbG9nLmluZm8oYCR7cGtnfSBjb250YWlucyBubyBwZXJtaXNzaW9ucyBhdmFpbGFibGUgZm9yIGdyYW50aW5nYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuZ3JhbnRQZXJtaXNzaW9ucyhwa2csIHBlcm1pc3Npb25zVG9HcmFudCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdyYW50IG11bHRpcGxlIHBlcm1pc3Npb25zIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICogVGhpcyBjYWxsIGlzIG1vcmUgcGVyZm9ybWFudCB0aGFuIGBncmFudFBlcm1pc3Npb25gIG9uZSwgc2luY2UgaXQgY29tYmluZXNcbiAqIG11bHRpcGxlIGBhZGIgc2hlbGxgIGNhbGxzIGludG8gYSBzaW5nbGUgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHBlcm1pc3Npb25zIC0gVGhlIGxpc3Qgb2YgcGVybWlzc2lvbnMgdG8gYmUgZ3JhbnRlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnMuXG4gKi9cbm1ldGhvZHMuZ3JhbnRQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdyYW50UGVybWlzc2lvbnMgKHBrZywgcGVybWlzc2lvbnMpIHtcbiAgLy8gQXMgaXQgY29uc3VtZXMgbW9yZSB0aW1lIGZvciBncmFudGluZyBlYWNoIHBlcm1pc3Npb24sXG4gIC8vIHRyeWluZyB0byBncmFudCBhbGwgcGVybWlzc2lvbiBieSBmb3JtaW5nIGVxdWl2YWxlbnQgY29tbWFuZC5cbiAgLy8gQWxzbywgaXQgaXMgbmVjZXNzYXJ5IHRvIHNwbGl0IGxvbmcgY29tbWFuZHMgaW50byBjaHVua3MsIHNpbmNlIHRoZSBtYXhpbXVtIGxlbmd0aCBvZlxuICAvLyBhZGIgc2hlbGwgYnVmZmVyIGlzIGxpbWl0ZWRcbiAgbG9nLmRlYnVnKGBHcmFudGluZyBwZXJtaXNzaW9ucyAke0pTT04uc3RyaW5naWZ5KHBlcm1pc3Npb25zKX0gdG8gJyR7cGtnfSdgKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsQ2h1bmtzKChwZXJtKSA9PiBbJ3BtJywgJ2dyYW50JywgcGtnLCBwZXJtXSwgcGVybWlzc2lvbnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFJR05PUkVEX1BFUk1fRVJST1JTLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR3JhbnQgc2luZ2xlIHBlcm1pc3Npb24gZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IHBlcm1pc3Npb24gLSBUaGUgZnVsbCBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uIHRvIGJlIGdyYW50ZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zLlxuICovXG5tZXRob2RzLmdyYW50UGVybWlzc2lvbiA9IGFzeW5jIGZ1bmN0aW9uIGdyYW50UGVybWlzc2lvbiAocGtnLCBwZXJtaXNzaW9uKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3BtJywgJ2dyYW50JywgcGtnLCBwZXJtaXNzaW9uXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIU5PVF9DSEFOR0VBQkxFX1BFUk1fRVJST1IudGVzdChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBSZXZva2Ugc2luZ2xlIHBlcm1pc3Npb24gZnJvbSB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwZXJtaXNzaW9uIC0gVGhlIGZ1bGwgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0byBiZSByZXZva2VkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9ucy5cbiAqL1xubWV0aG9kcy5yZXZva2VQZXJtaXNzaW9uID0gYXN5bmMgZnVuY3Rpb24gcmV2b2tlUGVybWlzc2lvbiAocGtnLCBwZXJtaXNzaW9uKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3BtJywgJ3Jldm9rZScsIHBrZywgcGVybWlzc2lvbl0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SLnRlc3QoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgZ3JhbnRlZCBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY21kT3V0cHV0IFtudWxsXSAtIE9wdGlvbmFsIHBhcmFtZXRlciBjb250YWluaW5nIGNvbW1hbmQgb3V0cHV0IG9mXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdW1wc3lzIHBhY2thZ2VfIGNvbW1hbmQuIEl0IG1heSBzcGVlZCB1cCB0aGUgbWV0aG9kIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59IFRoZSBsaXN0IG9mIGdyYW50ZWQgcGVybWlzc2lvbnMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnMuXG4gKi9cbm1ldGhvZHMuZ2V0R3JhbnRlZFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ2V0R3JhbnRlZFBlcm1pc3Npb25zIChwa2csIGNtZE91dHB1dCA9IG51bGwpIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIGdyYW50ZWQgcGVybWlzc2lvbnMnKTtcbiAgY29uc3Qgc3Rkb3V0ID0gY21kT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgcmV0dXJuIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zKHN0ZG91dCwgWydpbnN0YWxsJywgJ3J1bnRpbWUnXSwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGRlbmllZCBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY21kT3V0cHV0IFtudWxsXSAtIE9wdGlvbmFsIHBhcmFtZXRlciBjb250YWluaW5nIGNvbW1hbmQgb3V0cHV0IG9mXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdW1wc3lzIHBhY2thZ2VfIGNvbW1hbmQuIEl0IG1heSBzcGVlZCB1cCB0aGUgbWV0aG9kIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59IFRoZSBsaXN0IG9mIGRlbmllZCBwZXJtaXNzaW9ucyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmdldERlbmllZFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGVuaWVkUGVybWlzc2lvbnMgKHBrZywgY21kT3V0cHV0ID0gbnVsbCkge1xuICBsb2cuZGVidWcoJ1JldHJpZXZpbmcgZGVuaWVkIHBlcm1pc3Npb25zJyk7XG4gIGNvbnN0IHN0ZG91dCA9IGNtZE91dHB1dCB8fCBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gIHJldHVybiBleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyhzdGRvdXQsIFsnaW5zdGFsbCcsICdydW50aW1lJ10sIGZhbHNlKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgcmVxdWVzdGVkIHBlcm1pc3Npb25zIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjbWRPdXRwdXQgW251bGxdIC0gT3B0aW9uYWwgcGFyYW1ldGVyIGNvbnRhaW5pbmcgY29tbWFuZCBvdXRwdXQgb2ZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2R1bXBzeXMgcGFja2FnZV8gY29tbWFuZC4gSXQgbWF5IHNwZWVkIHVwIHRoZSBtZXRob2QgZXhlY3V0aW9uLlxuICogQHJldHVybiB7QXJyYXk8U3RyaW5nPn0gVGhlIGxpc3Qgb2YgcmVxdWVzdGVkIHBlcm1pc3Npb25zIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuZ2V0UmVxUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBnZXRSZXFQZXJtaXNzaW9ucyAocGtnLCBjbWRPdXRwdXQgPSBudWxsKSB7XG4gIGxvZy5kZWJ1ZygnUmV0cmlldmluZyByZXF1ZXN0ZWQgcGVybWlzc2lvbnMnKTtcbiAgY29uc3Qgc3Rkb3V0ID0gY21kT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgcmV0dXJuIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zKHN0ZG91dCwgWydyZXF1ZXN0ZWQnXSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGxvY2F0aW9uIHByb3ZpZGVycyBmb3IgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgbGlzdCBvZiBhdmFpbGFibGUgbG9jYXRpb24gcHJvdmlkZXJzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuZ2V0TG9jYXRpb25Qcm92aWRlcnMgPSBhc3luYyBmdW5jdGlvbiBnZXRMb2NhdGlvblByb3ZpZGVycyAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ3NlY3VyZScsICdsb2NhdGlvbl9wcm92aWRlcnNfYWxsb3dlZCcpO1xuICByZXR1cm4gc3Rkb3V0LnRyaW0oKS5zcGxpdCgnLCcpXG4gICAgLm1hcCgocCkgPT4gcC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn07XG5cbi8qKlxuICogVG9nZ2xlIHRoZSBzdGF0ZSBvZiBHUFMgbG9jYXRpb24gcHJvdmlkZXIuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0byBlbmFibGUgKHRydWUpIG9yIGRpc2FibGUgKGZhbHNlKSB0aGUgR1BTIHByb3ZpZGVyLlxuICovXG5tZXRob2RzLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyIChlbmFibGVkKSB7XG4gIGF3YWl0IHRoaXMuc2V0U2V0dGluZygnc2VjdXJlJywgJ2xvY2F0aW9uX3Byb3ZpZGVyc19hbGxvd2VkJywgYCR7ZW5hYmxlZCA/ICcrJyA6ICctJ31ncHNgKTtcbn07XG5cbi8qKlxuICogU2V0IGhpZGRlbiBhcGkgcG9saWN5IHRvIG1hbmFnZSBhY2Nlc3MgdG8gbm9uLVNESyBBUElzLlxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9yZXN0cmljdGlvbnMtbm9uLXNkay1pbnRlcmZhY2VzXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSB2YWx1ZSAtIFRoZSBBUEkgZW5mb3JjZW1lbnQgcG9saWN5LlxuICogICAgIEZvciBBbmRyb2lkIFBcbiAqICAgICAwOiBEaXNhYmxlIG5vbi1TREsgQVBJIHVzYWdlIGRldGVjdGlvbi4gVGhpcyB3aWxsIGFsc28gZGlzYWJsZSBsb2dnaW5nLCBhbmQgYWxzbyBicmVhayB0aGUgc3RyaWN0IG1vZGUgQVBJLFxuICogICAgICAgIGRldGVjdE5vblNka0FwaVVzYWdlKCkuIE5vdCByZWNvbW1lbmRlZC5cbiAqICAgICAxOiBcIkp1c3Qgd2FyblwiIC0gcGVybWl0IGFjY2VzcyB0byBhbGwgbm9uLVNESyBBUElzLCBidXQga2VlcCB3YXJuaW5ncyBpbiB0aGUgbG9nLlxuICogICAgICAgIFRoZSBzdHJpY3QgbW9kZSBBUEkgd2lsbCBrZWVwIHdvcmtpbmcuXG4gKiAgICAgMjogRGlzYWxsb3cgdXNhZ2Ugb2YgZGFyayBncmV5IGFuZCBibGFjayBsaXN0ZWQgQVBJcy5cbiAqICAgICAzOiBEaXNhbGxvdyB1c2FnZSBvZiBibGFja2xpc3RlZCBBUElzLCBidXQgYWxsb3cgdXNhZ2Ugb2YgZGFyayBncmV5IGxpc3RlZCBBUElzLlxuICpcbiAqICAgICBGb3IgQW5kcm9pZCBRXG4gKiAgICAgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9ub24tc2RrLXEjZW5hYmxlLW5vbi1zZGstYWNjZXNzXG4gKiAgICAgMDogRGlzYWJsZSBhbGwgZGV0ZWN0aW9uIG9mIG5vbi1TREsgaW50ZXJmYWNlcy4gVXNpbmcgdGhpcyBzZXR0aW5nIGRpc2FibGVzIGFsbCBsb2cgbWVzc2FnZXMgZm9yIG5vbi1TREsgaW50ZXJmYWNlIHVzYWdlXG4gKiAgICAgICAgYW5kIHByZXZlbnRzIHlvdSBmcm9tIHRlc3RpbmcgeW91ciBhcHAgdXNpbmcgdGhlIFN0cmljdE1vZGUgQVBJLiBUaGlzIHNldHRpbmcgaXMgbm90IHJlY29tbWVuZGVkLlxuICogICAgIDE6IEVuYWJsZSBhY2Nlc3MgdG8gYWxsIG5vbi1TREsgaW50ZXJmYWNlcywgYnV0IHByaW50IGxvZyBtZXNzYWdlcyB3aXRoIHdhcm5pbmdzIGZvciBhbnkgbm9uLVNESyBpbnRlcmZhY2UgdXNhZ2UuXG4gKiAgICAgICAgVXNpbmcgdGhpcyBzZXR0aW5nIGFsc28gYWxsb3dzIHlvdSB0byB0ZXN0IHlvdXIgYXBwIHVzaW5nIHRoZSBTdHJpY3RNb2RlIEFQSS5cbiAqICAgICAyOiBEaXNhbGxvdyB1c2FnZSBvZiBub24tU0RLIGludGVyZmFjZXMgdGhhdCBiZWxvbmcgdG8gZWl0aGVyIHRoZSBibGFjayBsaXN0XG4gKiAgICAgICAgb3IgdG8gYSByZXN0cmljdGVkIGdyZXlsaXN0IGZvciB5b3VyIHRhcmdldCBBUEkgbGV2ZWwuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVFcnJvciBbZmFsc2VdIFdoZXRoZXIgdG8gaWdub3JlIGFuIGV4Y2VwdGlvbiBpbiAnYWRiIHNoZWxsIHNldHRpbmdzIHB1dCBnbG9iYWwnIGNvbW1hbmRcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgYW5kIGlnbm9yZUVycm9yIHdhcyB0cnVlIHdoaWxlIGV4ZWN1dGluZyAnYWRiIHNoZWxsIHNldHRpbmdzIHB1dCBnbG9iYWwnXG4gKiAgICAgICAgICAgICAgICAgY29tbWFuZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuc2V0SGlkZGVuQXBpUG9saWN5ID0gYXN5bmMgZnVuY3Rpb24gc2V0SGlkZGVuQXBpUG9saWN5ICh2YWx1ZSwgaWdub3JlRXJyb3IgPSBmYWxzZSkge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoSElEREVOX0FQSV9QT0xJQ1lfS0VZUy5tYXAoKGspID0+IGBzZXR0aW5ncyBwdXQgZ2xvYmFsICR7a30gJHt2YWx1ZX1gKS5qb2luKCc7JykpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFpZ25vcmVFcnJvcikge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nLmluZm8oYEZhaWxlZCB0byBzZXQgc2V0dGluZyBrZXlzICcke0hJRERFTl9BUElfUE9MSUNZX0tFWVN9JyB0byAnJHt2YWx1ZX0nLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmVzZXQgYWNjZXNzIHRvIG5vbi1TREsgQVBJcyB0byBpdHMgZGVmYXVsdCBzZXR0aW5nLlxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9yZXN0cmljdGlvbnMtbm9uLXNkay1pbnRlcmZhY2VzXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVFcnJvciBbZmFsc2VdIFdoZXRoZXIgdG8gaWdub3JlIGFuIGV4Y2VwdGlvbiBpbiAnYWRiIHNoZWxsIHNldHRpbmdzIGRlbGV0ZSBnbG9iYWwnIGNvbW1hbmRcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgYW5kIGlnbm9yZUVycm9yIHdhcyB0cnVlIHdoaWxlIGV4ZWN1dGluZyAnYWRiIHNoZWxsIHNldHRpbmdzIGRlbGV0ZSBnbG9iYWwnXG4gKiAgICAgICAgICAgICAgICAgY29tbWFuZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuc2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSA9IGFzeW5jIGZ1bmN0aW9uIHNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3kgKGlnbm9yZUVycm9yID0gZmFsc2UpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKEhJRERFTl9BUElfUE9MSUNZX0tFWVMubWFwKChrKSA9PiBgc2V0dGluZ3MgZGVsZXRlIGdsb2JhbCAke2t9YCkuam9pbignOycpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghaWdub3JlRXJyb3IpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGxvZy5pbmZvKGBGYWlsZWQgdG8gZGVsZXRlIGtleXMgJyR7SElEREVOX0FQSV9QT0xJQ1lfS0VZU30nLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogU3RvcCB0aGUgcGFydGljdWxhciBwYWNrYWdlIGlmIGl0IGlzIHJ1bm5pbmcgYW5kIGNsZWFycyBpdHMgYXBwbGljYXRpb24gZGF0YS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKi9cbm1ldGhvZHMuc3RvcEFuZENsZWFyID0gYXN5bmMgZnVuY3Rpb24gc3RvcEFuZENsZWFyIChwa2cpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmZvcmNlU3RvcChwa2cpO1xuICAgIGF3YWl0IHRoaXMuY2xlYXIocGtnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHN0b3AgYW5kIGNsZWFyICR7cGtnfS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBpbnB1dCBtZXRob2RzIChJTUVzKSBmb3IgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgbGlzdCBvZiBJTUUgbmFtZXMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5hdmFpbGFibGVJTUVzID0gYXN5bmMgZnVuY3Rpb24gYXZhaWxhYmxlSU1FcyAoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdldElNRUxpc3RGcm9tT3V0cHV0KGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnbGlzdCcsICctYSddKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgYXZhaWxhYmxlIElNRSdzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgZW5hYmxlZCBpbnB1dCBtZXRob2RzIChJTUVzKSBmb3IgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgbGlzdCBvZiBlbmFibGVkIElNRSBuYW1lcyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmVuYWJsZWRJTUVzID0gYXN5bmMgZnVuY3Rpb24gZW5hYmxlZElNRXMgKCkge1xuICB0cnkge1xuICAgIHJldHVybiBnZXRJTUVMaXN0RnJvbU91dHB1dChhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ2xpc3QnXSkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGVuYWJsZWQgSU1FJ3MuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBFbmFibGUgdGhlIHBhcnRpY3VsYXIgaW5wdXQgbWV0aG9kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lSWQgLSBPbmUgb2YgZXhpc3RpbmcgSU1FIGlkcy5cbiAqL1xubWV0aG9kcy5lbmFibGVJTUUgPSBhc3luYyBmdW5jdGlvbiBlbmFibGVJTUUgKGltZUlkKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnZW5hYmxlJywgaW1lSWRdKTtcbn07XG5cbi8qKlxuICogRGlzYWJsZSB0aGUgcGFydGljdWxhciBpbnB1dCBtZXRob2Qgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbWVJZCAtIE9uZSBvZiBleGlzdGluZyBJTUUgaWRzLlxuICovXG5tZXRob2RzLmRpc2FibGVJTUUgPSBhc3luYyBmdW5jdGlvbiBkaXNhYmxlSU1FIChpbWVJZCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ2Rpc2FibGUnLCBpbWVJZF0pO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIHBhcnRpY3VsYXIgaW5wdXQgbWV0aG9kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lSWQgLSBPbmUgb2YgZXhpc3RpbmcgSU1FIGlkcy5cbiAqL1xubWV0aG9kcy5zZXRJTUUgPSBhc3luYyBmdW5jdGlvbiBzZXRJTUUgKGltZUlkKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnc2V0JywgaW1lSWRdKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IGlucHV0IG1ldGhvZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7P3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgaW5wdXQgbWV0aG9kXG4gKi9cbm1ldGhvZHMuZGVmYXVsdElNRSA9IGFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRJTUUgKCkge1xuICB0cnkge1xuICAgIGxldCBlbmdpbmUgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ3NlY3VyZScsICdkZWZhdWx0X2lucHV0X21ldGhvZCcpO1xuICAgIGlmIChlbmdpbmUgPT09ICdudWxsJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBlbmdpbmUudHJpbSgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGRlZmF1bHQgSU1FLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogU2VuZCB0aGUgcGFydGljdWxhciBrZXljb2RlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGtleWNvZGUgLSBUaGUgYWN0dWFsIGtleSBjb2RlIHRvIGJlIHNlbnQuXG4gKi9cbm1ldGhvZHMua2V5ZXZlbnQgPSBhc3luYyBmdW5jdGlvbiBrZXlldmVudCAoa2V5Y29kZSkge1xuICAvLyBrZXljb2RlIG11c3QgYmUgYW4gaW50LlxuICBsZXQgY29kZSA9IHBhcnNlSW50KGtleWNvZGUsIDEwKTtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2lucHV0JywgJ2tleWV2ZW50JywgY29kZV0pO1xufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBwYXJ0aWN1bGFyIHRleHQgb3IgYSBudW1iZXIgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogVGhlIHRleHQgZ2V0cyBwcm9wZXJseSBlc2NhcGVkIGJlZm9yZSBiZWluZyBwYXNzZWQgdG8gQURCLlxuICogTm9vcCBpZiB0aGUgdGV4dCBpcyBlbXB0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHRleHQgLSBUaGUgYWN0dWFsIHRleHQgdG8gYmUgc2VudC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBpcyBpbXBvc3NpYmxlIHRvIGVzY2FwZSB0aGUgZ2l2ZW4gc3RyaW5nXG4gKi9cbm1ldGhvZHMuaW5wdXRUZXh0ID0gYXN5bmMgZnVuY3Rpb24gaW5wdXRUZXh0ICh0ZXh0KSB7XG4gIGlmICh0ZXh0ID09PSAnJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG9yaWdpbmFsU3RyID0gYCR7dGV4dH1gO1xuICBjb25zdCBlc2NhcGVkVGV4dCA9IG9yaWdpbmFsU3RyLnJlcGxhY2UoL1xcJC9nLCAnXFxcXCQnKS5yZXBsYWNlKC8gL2csICclcycpO1xuICBsZXQgYXJncyA9IFsnaW5wdXQnLCAndGV4dCcsIG9yaWdpbmFsU3RyXTtcbiAgaWYgKGVzY2FwZWRUZXh0ICE9PSBvcmlnaW5hbFN0ciB8fCBBREJfSU5QVVRfRVNDQVBFX1BBVFRFUk4udGVzdChvcmlnaW5hbFN0cikpIHtcbiAgICBpZiAoXy5ldmVyeShbJ1wiJywgYCdgXSwgKGMpID0+IG9yaWdpbmFsU3RyLmluY2x1ZGVzKGMpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGlkIG5vdCBrbm93IGhvdyB0byBlc2NhcGUgYSBzdHJpbmcgdGhhdCBjb250YWlucyBib3RoIHR5cGVzIG9mIHF1b3RlcyAoXCIgYW5kICcpYFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcSA9IG9yaWdpbmFsU3RyLmluY2x1ZGVzKCdcIicpID8gYCdgIDogJ1wiJztcbiAgICBhcmdzID0gW2BpbnB1dCB0ZXh0ICR7cX0ke2VzY2FwZWRUZXh0fSR7cX1gXTtcbiAgfVxuICBhd2FpdCB0aGlzLnNoZWxsKGFyZ3MpO1xufTtcblxuLyoqXG4gKiBDbGVhciB0aGUgYWN0aXZlIHRleHQgZmllbGQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0IGJ5IHNlbmRpbmdcbiAqIHNwZWNpYWwga2V5ZXZlbnRzIHRvIGl0LlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggWzEwMF0gLSBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHRleHQgaW4gdGhlIGZpZWxkIHRvIGJlIGNsZWFyZWQuXG4gKi9cbm1ldGhvZHMuY2xlYXJUZXh0RmllbGQgPSBhc3luYyBmdW5jdGlvbiBjbGVhclRleHRGaWVsZCAobGVuZ3RoID0gMTAwKSB7XG4gIC8vIGFzc3VtZXMgdGhhdCB0aGUgRWRpdFRleHQgZmllbGQgYWxyZWFkeSBoYXMgZm9jdXNcbiAgbG9nLmRlYnVnKGBDbGVhcmluZyB1cCB0byAke2xlbmd0aH0gY2hhcmFjdGVyc2ApO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBhcmdzID0gWydpbnB1dCcsICdrZXlldmVudCddO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgLy8gd2UgY2Fubm90IGtub3cgd2hlcmUgdGhlIGN1cnNvciBpcyBpbiB0aGUgdGV4dCBmaWVsZCwgc28gZGVsZXRlIGJvdGggYmVmb3JlXG4gICAgLy8gYW5kIGFmdGVyIHNvIHRoYXQgd2UgZ2V0IHJpZCBvZiBldmVyeXRoaW5nXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvdmlldy9LZXlFdmVudC5odG1sI0tFWUNPREVfREVMXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvdmlldy9LZXlFdmVudC5odG1sI0tFWUNPREVfRk9SV0FSRF9ERUxcbiAgICBhcmdzLnB1c2goJzY3JywgJzExMicpO1xuICB9XG4gIGF3YWl0IHRoaXMuc2hlbGwoYXJncyk7XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHNwZWNpYWwga2V5Y29kZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaW4gb3JkZXIgdG8gbG9jayBpdC5cbiAqL1xubWV0aG9kcy5sb2NrID0gYXN5bmMgZnVuY3Rpb24gbG9jayAoKSB7XG4gIGlmIChhd2FpdCB0aGlzLmlzU2NyZWVuTG9ja2VkKCkpIHtcbiAgICBsb2cuZGVidWcoJ1NjcmVlbiBpcyBhbHJlYWR5IGxvY2tlZC4gRG9pbmcgbm90aGluZy4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbG9nLmRlYnVnKCdQcmVzc2luZyB0aGUgS0VZQ09ERV9QT1dFUiBidXR0b24gdG8gbG9jayBzY3JlZW4nKTtcbiAgYXdhaXQgdGhpcy5rZXlldmVudCgyNik7XG5cbiAgY29uc3QgdGltZW91dE1zID0gNTAwMDtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IGF3YWl0IHRoaXMuaXNTY3JlZW5Mb2NrZWQoKSwge1xuICAgICAgd2FpdE1zOiB0aW1lb3V0TXMsXG4gICAgICBpbnRlcnZhbE1zOiA1MDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBkZXZpY2Ugc2NyZWVuIGlzIHN0aWxsIGxvY2tlZCBhZnRlciAke3RpbWVvdXRNc31tcyB0aW1lb3V0YCk7XG4gIH1cbn07XG5cbi8qKlxuICogU2VuZCB0aGUgc3BlY2lhbCBrZXljb2RlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBpbiBvcmRlciB0byBlbXVsYXRlXG4gKiBCYWNrIGJ1dHRvbiB0YXAuXG4gKi9cbm1ldGhvZHMuYmFjayA9IGFzeW5jIGZ1bmN0aW9uIGJhY2sgKCkge1xuICBsb2cuZGVidWcoJ1ByZXNzaW5nIHRoZSBCQUNLIGJ1dHRvbicpO1xuICBhd2FpdCB0aGlzLmtleWV2ZW50KDQpO1xufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBzcGVjaWFsIGtleWNvZGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0IGluIG9yZGVyIHRvIGVtdWxhdGVcbiAqIEhvbWUgYnV0dG9uIHRhcC5cbiAqL1xubWV0aG9kcy5nb1RvSG9tZSA9IGFzeW5jIGZ1bmN0aW9uIGdvVG9Ib21lICgpIHtcbiAgbG9nLmRlYnVnKCdQcmVzc2luZyB0aGUgSE9NRSBidXR0b24nKTtcbiAgYXdhaXQgdGhpcy5rZXlldmVudCgzKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgYWN0dWFsIHBhdGggdG8gYWRiIGV4ZWN1dGFibGUuXG4gKi9cbm1ldGhvZHMuZ2V0QWRiUGF0aCA9IGZ1bmN0aW9uIGdldEFkYlBhdGggKCkge1xuICByZXR1cm4gdGhpcy5leGVjdXRhYmxlLnBhdGg7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIGN1cnJlbnQgc2NyZWVuIG9yaWVudGF0aW9uIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjdXJyZW50IG9yaWVudGF0aW9uIGVuY29kZWQgYXMgYW4gaW50ZWdlciBudW1iZXIuXG4gKi9cbm1ldGhvZHMuZ2V0U2NyZWVuT3JpZW50YXRpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5PcmllbnRhdGlvbiAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdpbnB1dCddKTtcbiAgcmV0dXJuIGdldFN1cmZhY2VPcmllbnRhdGlvbihzdGRvdXQpO1xufTtcblxuLyoqXG4gKiBTZW5kIGFuIGFyYml0cmFyeSBUZWxuZXQgY29tbWFuZCB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBiZSBzZW50LlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGFjdHVhbCBvdXRwdXQgb2YgdGhlIGdpdmVuIGNvbW1hbmQuXG4gKi9cbm1ldGhvZHMuc2VuZFRlbG5ldENvbW1hbmQgPSBhc3luYyBmdW5jdGlvbiBzZW5kVGVsbmV0Q29tbWFuZCAoY29tbWFuZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5leGVjRW11Q29uc29sZUNvbW1hbmQoY29tbWFuZCwge3BvcnQ6IGF3YWl0IHRoaXMuZ2V0RW11bGF0b3JQb3J0KCl9KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIEFpcnBsYW5lIG1vZGUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgQWlycGxhbmUgbW9kZSBpcyBlbmFibGVkLlxuICovXG5tZXRob2RzLmlzQWlycGxhbmVNb2RlT24gPSBhc3luYyBmdW5jdGlvbiBpc0FpcnBsYW5lTW9kZU9uICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ2FpcnBsYW5lX21vZGVfb24nKTtcbiAgcmV0dXJuIHBhcnNlSW50KHN0ZG91dCwgMTApICE9PSAwO1xufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIEFpcnBsYW5lIG1vZGUgaW4gU2V0dGluZ3Mgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb24gLSBUcnVlIHRvIGVuYWJsZSB0aGUgQWlycGxhbmUgbW9kZSBpbiBTZXR0aW5ncyBhbmQgZmFsc2UgdG8gZGlzYWJsZSBpdC5cbiAqL1xubWV0aG9kcy5zZXRBaXJwbGFuZU1vZGUgPSBhc3luYyBmdW5jdGlvbiBzZXRBaXJwbGFuZU1vZGUgKG9uKSB7XG4gIGF3YWl0IHRoaXMuc2V0U2V0dGluZygnZ2xvYmFsJywgJ2FpcnBsYW5lX21vZGVfb24nLCBvbiA/IDEgOiAwKTtcbn07XG5cbi8qKlxuICogQnJvYWRjYXN0IHRoZSBzdGF0ZSBvZiBBaXJwbGFuZSBtb2RlIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIge0BsaW5rICNzZXRBaXJwbGFuZU1vZGV9LCBvdGhlcndpc2VcbiAqIHRoZSBtb2RlIGNoYW5nZSBpcyBub3QgZ29pbmcgdG8gYmUgYXBwbGllZCBmb3IgdGhlIGRldmljZS5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9uIC0gVHJ1ZSB0byBicm9hZGNhc3QgZW5hYmxlIGFuZCBmYWxzZSB0byBicm9hZGNhc3QgZGlzYWJsZS5cbiAqL1xubWV0aG9kcy5icm9hZGNhc3RBaXJwbGFuZU1vZGUgPSBhc3luYyBmdW5jdGlvbiBicm9hZGNhc3RBaXJwbGFuZU1vZGUgKG9uKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoW1xuICAgICdhbScsICdicm9hZGNhc3QnLFxuICAgICctYScsICdhbmRyb2lkLmludGVudC5hY3Rpb24uQUlSUExBTkVfTU9ERScsXG4gICAgJy0tZXonLCAnc3RhdGUnLCBvbiA/ICd0cnVlJyA6ICdmYWxzZSdcbiAgXSk7XG59O1xuXG4vKipcbiAqIENoZWNrIHRoZSBzdGF0ZSBvZiBXaUZpIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIFdpRmkgaXMgZW5hYmxlZC5cbiAqL1xubWV0aG9kcy5pc1dpZmlPbiA9IGFzeW5jIGZ1bmN0aW9uIGlzV2lmaU9uICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ3dpZmlfb24nKTtcbiAgcmV0dXJuIChwYXJzZUludChzdGRvdXQsIDEwKSAhPT0gMCk7XG59O1xuXG4vKipcbiAqIENoZWNrIHRoZSBzdGF0ZSBvZiBEYXRhIHRyYW5zZmVyIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIERhdGEgdHJhbnNmZXIgaXMgZW5hYmxlZC5cbiAqL1xubWV0aG9kcy5pc0RhdGFPbiA9IGFzeW5jIGZ1bmN0aW9uIGlzRGF0YU9uICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ21vYmlsZV9kYXRhJyk7XG4gIHJldHVybiAocGFyc2VJbnQoc3Rkb3V0LCAxMCkgIT09IDApO1xufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIFdpRmkgYW5kL29yIERhdGEgdHJhbnNmZXIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gd2lmaSAtIFRydWUgdG8gZW5hYmxlIGFuZCBmYWxzZSB0byBkaXNhYmxlIFdpRmkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGRhdGEgLSBUcnVlIHRvIGVuYWJsZSBhbmQgZmFsc2UgdG8gZGlzYWJsZSBEYXRhIHRyYW5zZmVyLlxuICogQHBhcmFtIHtib29sZWFufSBpc0VtdWxhdG9yIFtmYWxzZV0gLSBTZXQgaXQgdG8gdHJ1ZSBpZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYW4gZW11bGF0b3IgcmF0aGVyIHRoYW4gYSByZWFsIGRldmljZS5cbiAqL1xubWV0aG9kcy5zZXRXaWZpQW5kRGF0YSA9IGFzeW5jIGZ1bmN0aW9uIHNldFdpZmlBbmREYXRhICh7d2lmaSwgZGF0YX0sIGlzRW11bGF0b3IgPSBmYWxzZSkge1xuICBpZiAodXRpbC5oYXNWYWx1ZSh3aWZpKSkge1xuICAgIGF3YWl0IHRoaXMuc2V0V2lmaVN0YXRlKHdpZmksIGlzRW11bGF0b3IpO1xuICB9XG4gIGlmICh1dGlsLmhhc1ZhbHVlKGRhdGEpKSB7XG4gICAgYXdhaXQgdGhpcy5zZXREYXRhU3RhdGUoZGF0YSwgaXNFbXVsYXRvcik7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIGFuaW1hdGlvbiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhdCBsZWFzdCBvbmUgb2YgYW5pbWF0aW9uIHNjYWxlIHNldHRpbmdzXG4gKiAgICAgICAgICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gJzAuMCcuXG4gKi9cbm1ldGhvZHMuaXNBbmltYXRpb25PbiA9IGFzeW5jIGZ1bmN0aW9uIGlzQW5pbWF0aW9uT24gKCkge1xuICBsZXQgYW5pbWF0b3JfZHVyYXRpb25fc2NhbGUgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICdhbmltYXRvcl9kdXJhdGlvbl9zY2FsZScpO1xuICBsZXQgdHJhbnNpdGlvbl9hbmltYXRpb25fc2NhbGUgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICd0cmFuc2l0aW9uX2FuaW1hdGlvbl9zY2FsZScpO1xuICBsZXQgd2luZG93X2FuaW1hdGlvbl9zY2FsZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ3dpbmRvd19hbmltYXRpb25fc2NhbGUnKTtcbiAgcmV0dXJuIF8uc29tZShbYW5pbWF0b3JfZHVyYXRpb25fc2NhbGUsIHRyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlLCB3aW5kb3dfYW5pbWF0aW9uX3NjYWxlXSxcbiAgICAgICAgICAgICAgICAoc2V0dGluZykgPT4gc2V0dGluZyAhPT0gJzAuMCcpO1xufTtcblxuLyoqXG4gKiBGb3JjZWZ1bGx5IHJlY3Vyc2l2ZWx5IHJlbW92ZSBhIHBhdGggb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogQmUgY2FyZWZ1bCB3aGlsZSBjYWxsaW5nIHRoaXMgbWV0aG9kLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGggdG8gYmUgcmVtb3ZlZCByZWN1cnNpdmVseS5cbiAqL1xubWV0aG9kcy5yaW1yYWYgPSBhc3luYyBmdW5jdGlvbiByaW1yYWYgKHBhdGgpIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ3JtJywgJy1yZicsIHBhdGhdKTtcbn07XG5cbi8qKlxuICogU2VuZCBhIGZpbGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbFBhdGggLSBUaGUgcGF0aCB0byB0aGUgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBkZXN0aW5hdGlvbiBwYXRoIG9uIHRoZSByZW1vdGUgZGV2aWNlLlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHMgLSBBZGRpdGlvbmFsIG9wdGlvbnMgbWFwcGluZy4gU2VlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vbm9kZS10ZWVuX3Byb2Nlc3MsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIF9leGVjXyBtZXRob2Qgb3B0aW9ucywgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYXZhaWxhYmxlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuXG4gKi9cbm1ldGhvZHMucHVzaCA9IGFzeW5jIGZ1bmN0aW9uIHB1c2ggKGxvY2FsUGF0aCwgcmVtb3RlUGF0aCwgb3B0cykge1xuICBhd2FpdCB0aGlzLm1rZGlyKHBhdGgucG9zaXguZGlybmFtZShyZW1vdGVQYXRoKSk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3B1c2gnLCBsb2NhbFBhdGgsIHJlbW90ZVBhdGhdLCBvcHRzKTtcbn07XG5cbi8qKlxuICogUmVjZWl2ZSBhIGZpbGUgZnJvbSB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgc291cmNlIHBhdGggb24gdGhlIHJlbW90ZSBkZXZpY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxQYXRoIC0gVGhlIGRlc3RpbmF0aW9uIHBhdGggdG8gdGhlIGZpbGUgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHMgLSBBZGRpdGlvbmFsIG9wdGlvbnMgbWFwcGluZy4gU2VlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vbm9kZS10ZWVuX3Byb2Nlc3MsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIF9leGVjXyBtZXRob2Qgb3B0aW9ucywgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYXZhaWxhYmxlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuXG4gKi9cbm1ldGhvZHMucHVsbCA9IGFzeW5jIGZ1bmN0aW9uIHB1bGwgKHJlbW90ZVBhdGgsIGxvY2FsUGF0aCwgb3B0cyA9IHt9KSB7XG4gIC8vIHB1bGwgZm9sZGVyIGNhbiB0YWtlIG1vcmUgdGltZSwgaW5jcmVhc2luZyB0aW1lIG91dCB0byA2MCBzZWNzXG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3B1bGwnLCByZW1vdGVQYXRoLCBsb2NhbFBhdGhdLCB7Li4ub3B0cywgdGltZW91dDogb3B0cy50aW1lb3V0ID8/IDYwMDAwfSk7XG59O1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIHByb2Nlc3Mgd2l0aCB0aGUgcGFydGljdWxhciBuYW1lIGlzIHJ1bm5pbmcgb24gdGhlIGRldmljZVxuICogdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvY2Vzc05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvY2VzcyB0byBiZSBjaGVja2VkLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZ2l2ZW4gcHJvY2VzcyBpcyBydW5uaW5nLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBwcm9jZXNzIG5hbWUgaXMgbm90IGEgdmFsaWQgY2xhc3MgbmFtZS5cbiAqL1xubWV0aG9kcy5wcm9jZXNzRXhpc3RzID0gYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0V4aXN0cyAocHJvY2Vzc05hbWUpIHtcbiAgcmV0dXJuICFfLmlzRW1wdHkoYXdhaXQgdGhpcy5nZXRQSURzQnlOYW1lKHByb2Nlc3NOYW1lKSk7XG59O1xuXG4vKipcbiAqIEdldCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLiBBbiBhcnJheSBjb250YWlucyBlYWNoIGZvcndhcmRpbmcgbGluZSBvZiBvdXRwdXRcbiAqL1xubWV0aG9kcy5nZXRGb3J3YXJkTGlzdCA9IGFzeW5jIGZ1bmN0aW9uIGdldEZvcndhcmRMaXN0ICgpIHtcbiAgbG9nLmRlYnVnKGBMaXN0IGZvcndhcmRpbmcgcG9ydHNgKTtcbiAgY29uc3QgY29ubmVjdGlvbnMgPSBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmb3J3YXJkJywgJy0tbGlzdCddKTtcbiAgcmV0dXJuIGNvbm5lY3Rpb25zLnNwbGl0KEVPTCkuZmlsdGVyKChsaW5lKSA9PiBCb29sZWFuKGxpbmUudHJpbSgpKSk7XG59O1xuXG4vKipcbiAqIFNldHVwIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3lzdGVtUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHN5c3RlbSBwb3J0LlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBkZXZpY2VQb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgcmVtb3RlIGRldmljZSBwb3J0LlxuICovXG5tZXRob2RzLmZvcndhcmRQb3J0ID0gYXN5bmMgZnVuY3Rpb24gZm9yd2FyZFBvcnQgKHN5c3RlbVBvcnQsIGRldmljZVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBGb3J3YXJkaW5nIHN5c3RlbTogJHtzeXN0ZW1Qb3J0fSB0byBkZXZpY2U6ICR7ZGV2aWNlUG9ydH1gKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsnZm9yd2FyZCcsIGB0Y3A6JHtzeXN0ZW1Qb3J0fWAsIGB0Y3A6JHtkZXZpY2VQb3J0fWBdKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LiBUaGUgZm9yd2FyZGluZ1xuICogZm9yIHRoZSBnaXZlbiBwb3J0IHNob3VsZCBiZSBzZXR1cCB3aXRoIHtAbGluayAjZm9yd2FyZFBvcnR9IGZpcnN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3lzdGVtUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHN5c3RlbSBwb3J0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byByZW1vdmUgZm9yd2FyZGluZyBvbi5cbiAqL1xubWV0aG9kcy5yZW1vdmVQb3J0Rm9yd2FyZCA9IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZVBvcnRGb3J3YXJkIChzeXN0ZW1Qb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgUmVtb3ZpbmcgZm9yd2FyZGVkIHBvcnQgc29ja2V0IGNvbm5lY3Rpb246ICR7c3lzdGVtUG9ydH0gYCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZvcndhcmQnLCBgLS1yZW1vdmVgLCBgdGNwOiR7c3lzdGVtUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIEdldCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLiBBbiBhcnJheSBjb250YWlucyBlYWNoIGZvcndhcmRpbmcgbGluZSBvZiBvdXRwdXRcbiAqL1xubWV0aG9kcy5nZXRSZXZlcnNlTGlzdCA9IGFzeW5jIGZ1bmN0aW9uIGdldFJldmVyc2VMaXN0ICgpIHtcbiAgbG9nLmRlYnVnKGBMaXN0IHJldmVyc2UgZm9yd2FyZGluZyBwb3J0c2ApO1xuICBjb25zdCBjb25uZWN0aW9ucyA9IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3JldmVyc2UnLCAnLS1saXN0J10pO1xuICByZXR1cm4gY29ubmVjdGlvbnMuc3BsaXQoRU9MKS5maWx0ZXIoKGxpbmUpID0+IEJvb2xlYW4obGluZS50cmltKCkpKTtcbn07XG5cbi8qKlxuICogU2V0dXAgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBPbmx5IGF2YWlsYWJsZSBmb3IgQVBJIDIxKy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGRldmljZVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSByZW1vdGUgZGV2aWNlIHBvcnQuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHN5c3RlbVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSBsb2NhbCBzeXN0ZW0gcG9ydC5cbiAqL1xubWV0aG9kcy5yZXZlcnNlUG9ydCA9IGFzeW5jIGZ1bmN0aW9uIHJldmVyc2VQb3J0IChkZXZpY2VQb3J0LCBzeXN0ZW1Qb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBkZXZpY2U6ICR7ZGV2aWNlUG9ydH0gdG8gc3lzdGVtOiAke3N5c3RlbVBvcnR9YCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3JldmVyc2UnLCBgdGNwOiR7ZGV2aWNlUG9ydH1gLCBgdGNwOiR7c3lzdGVtUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC4gVGhlIGZvcndhcmRpbmdcbiAqIGZvciB0aGUgZ2l2ZW4gcG9ydCBzaG91bGQgYmUgc2V0dXAgd2l0aCB7QGxpbmsgI2ZvcndhcmRQb3J0fSBmaXJzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGRldmljZVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSByZW1vdGUgZGV2aWNlIHBvcnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHJlbW92ZSBmb3J3YXJkaW5nIG9uLlxuICovXG5tZXRob2RzLnJlbW92ZVBvcnRSZXZlcnNlID0gYXN5bmMgZnVuY3Rpb24gcmVtb3ZlUG9ydFJldmVyc2UgKGRldmljZVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBSZW1vdmluZyByZXZlcnNlIGZvcndhcmRlZCBwb3J0IHNvY2tldCBjb25uZWN0aW9uOiAke2RldmljZVBvcnR9IGApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydyZXZlcnNlJywgYC0tcmVtb3ZlYCwgYHRjcDoke2RldmljZVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBTZXR1cCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC4gVGhlIGRpZmZlcmVuY2VcbiAqIGJldHdlZW4ge0BsaW5rICNmb3J3YXJkUG9ydH0gaXMgdGhhdCB0aGlzIG1ldGhvZCBkb2VzIHNldHVwIGZvciBhbiBhYnN0cmFjdFxuICogbG9jYWwgcG9ydC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHN5c3RlbVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSBsb2NhbCBzeXN0ZW0gcG9ydC5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gZGV2aWNlUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBkZXZpY2UgcG9ydC5cbiAqL1xubWV0aG9kcy5mb3J3YXJkQWJzdHJhY3RQb3J0ID0gYXN5bmMgZnVuY3Rpb24gZm9yd2FyZEFic3RyYWN0UG9ydCAoc3lzdGVtUG9ydCwgZGV2aWNlUG9ydCkge1xuICBsb2cuZGVidWcoYEZvcndhcmRpbmcgc3lzdGVtOiAke3N5c3RlbVBvcnR9IHRvIGFic3RyYWN0IGRldmljZTogJHtkZXZpY2VQb3J0fWApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmb3J3YXJkJywgYHRjcDoke3N5c3RlbVBvcnR9YCwgYGxvY2FsYWJzdHJhY3Q6JHtkZXZpY2VQb3J0fWBdKTtcbn07XG5cbi8qKlxuICogRXhlY3V0ZSBwaW5nIHNoZWxsIGNvbW1hbmQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGNvbW1hbmQgb3V0cHV0IGNvbnRhaW5zICdwaW5nJyBzdWJzdHJpbmcuXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGV4ZWN1dGluZyAncGluZycgY29tbWFuZCBvbiB0aGVcbiAqICAgICAgICAgICAgICAgICBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5waW5nID0gYXN5bmMgZnVuY3Rpb24gcGluZyAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZWNobycsICdwaW5nJ10pO1xuICBpZiAoc3Rkb3V0LmluZGV4T2YoJ3BpbmcnKSA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgQURCIHBpbmcgZmFpbGVkLCByZXR1cm5lZCAke3N0ZG91dH1gKTtcbn07XG5cbi8qKlxuICogUmVzdGFydCB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgdXNpbmcgYWRiIGNvbW1hbmRzLlxuICpcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBzdGFydCBmYWlscy5cbiAqL1xubWV0aG9kcy5yZXN0YXJ0ID0gYXN5bmMgZnVuY3Rpb24gcmVzdGFydCAoKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zdG9wTG9nY2F0KCk7XG4gICAgYXdhaXQgdGhpcy5yZXN0YXJ0QWRiKCk7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yRGV2aWNlKDYwKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0TG9nY2F0KHRoaXMuX2xvZ2NhdFN0YXJ0dXBQYXJhbXMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZXN0YXJ0IGZhaWxlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IExvZ2NhdE9wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmb3JtYXQgVGhlIGxvZyBwcmludCBmb3JtYXQsIHdoZXJlIDxmb3JtYXQ+IGlzIG9uZSBvZjpcbiAqICAgYnJpZWYgcHJvY2VzcyB0YWcgdGhyZWFkIHJhdyB0aW1lIHRocmVhZHRpbWUgbG9uZ1xuICogYHRocmVhZHRpbWVgIGlzIHRoZSBkZWZhdWx0IHZhbHVlLlxuICogQHByb3BlcnR5IHtBcnJheTxzdHJpbmc+fSBmaWx0ZXJTcGVjcyBTZXJpZXMgb2YgPHRhZz5bOnByaW9yaXR5XVxuICogd2hlcmUgPHRhZz4gaXMgYSBsb2cgY29tcG9uZW50IHRhZyAob3IgKiBmb3IgYWxsKSBhbmQgcHJpb3JpdHkgaXM6XG4gKiAgViAgICBWZXJib3NlXG4gKiAgRCAgICBEZWJ1Z1xuICogIEkgICAgSW5mb1xuICogIFcgICAgV2FyblxuICogIEUgICAgRXJyb3JcbiAqICBGICAgIEZhdGFsXG4gKiAgUyAgICBTaWxlbnQgKHN1cHJlc3MgYWxsIG91dHB1dClcbiAqXG4gKiAnKicgbWVhbnMgJyo6ZCcgYW5kIDx0YWc+IGJ5IGl0c2VsZiBtZWFucyA8dGFnPjp2XG4gKlxuICogSWYgbm90IHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZGxpbmUsIGZpbHRlcnNwZWMgaXMgc2V0IGZyb20gQU5EUk9JRF9MT0dfVEFHUy5cbiAqIElmIG5vIGZpbHRlcnNwZWMgaXMgZm91bmQsIGZpbHRlciBkZWZhdWx0cyB0byAnKjpJJ1xuICovXG5cbi8qKlxuICogU3RhcnQgdGhlIGxvZ2NhdCBwcm9jZXNzIHRvIGdhdGhlciBsb2dzLlxuICpcbiAqIEBwYXJhbSB7P0xvZ2NhdE9wdHN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiByZXN0YXJ0IGZhaWxzLlxuICovXG5tZXRob2RzLnN0YXJ0TG9nY2F0ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRMb2djYXQgKG9wdHMgPSB7fSkge1xuICBpZiAoIV8uaXNFbXB0eSh0aGlzLmxvZ2NhdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUcnlpbmcgdG8gc3RhcnQgbG9nY2F0IGNhcHR1cmUgYnV0IGl0J3MgYWxyZWFkeSBzdGFydGVkIVwiKTtcbiAgfVxuXG4gIHRoaXMubG9nY2F0ID0gbmV3IExvZ2NhdCh7XG4gICAgYWRiOiB0aGlzLmV4ZWN1dGFibGUsXG4gICAgZGVidWc6IGZhbHNlLFxuICAgIGRlYnVnVHJhY2U6IGZhbHNlLFxuICAgIGNsZWFyRGV2aWNlTG9nc09uU3RhcnQ6ICEhdGhpcy5jbGVhckRldmljZUxvZ3NPblN0YXJ0LFxuICB9KTtcbiAgYXdhaXQgdGhpcy5sb2djYXQuc3RhcnRDYXB0dXJlKG9wdHMpO1xuICB0aGlzLl9sb2djYXRTdGFydHVwUGFyYW1zID0gb3B0cztcbn07XG5cbi8qKlxuICogU3RvcCB0aGUgYWN0aXZlIGxvZ2NhdCBwcm9jZXNzIHdoaWNoIGdhdGhlcnMgbG9ncy5cbiAqIFRoZSBjYWxsIHdpbGwgYmUgaWdub3JlZCBpZiBubyBsb2djYXQgcHJvY2VzcyBpcyBydW5uaW5nLlxuICovXG5tZXRob2RzLnN0b3BMb2djYXQgPSBhc3luYyBmdW5jdGlvbiBzdG9wTG9nY2F0ICgpIHtcbiAgaWYgKF8uaXNFbXB0eSh0aGlzLmxvZ2NhdCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmxvZ2NhdC5zdG9wQ2FwdHVyZSgpO1xuICB9IGZpbmFsbHkge1xuICAgIHRoaXMubG9nY2F0ID0gbnVsbDtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgb3V0cHV0IGZyb20gdGhlIGN1cnJlbnRseSBydW5uaW5nIGxvZ2NhdCBwcm9jZXNzLlxuICogVGhlIGxvZ2NhdCBwcm9jZXNzIHNob3VsZCBiZSBleGVjdXRlZCBieSB7MmxpbmsgI3N0YXJ0TG9nY2F0fSBtZXRob2QuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgY29sbGVjdGVkIGxvZ2NhdCBvdXRwdXQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgbG9nY2F0IHByb2Nlc3MgaXMgbm90IHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMuZ2V0TG9nY2F0TG9ncyA9IGZ1bmN0aW9uIGdldExvZ2NhdExvZ3MgKCkge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGdldCBsb2djYXQgbG9ncyBzaW5jZSBsb2djYXQgaGFzbid0IHN0YXJ0ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHRoaXMubG9nY2F0LmdldExvZ3MoKTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBjYWxsYmFjayBmb3IgdGhlIGxvZ2NhdCBvdXRwdXQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgLSBUaGUgbGlzdGVuZXIgZnVuY3Rpb24sIHdoaWNoIGFjY2VwdHMgb25lIGFyZ3VtZW50LiBUaGUgYXJndW1lbnQgaXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBsb2cgcmVjb3JkIG9iamVjdCB3aXRoIGB0aW1lc3RhbXBgLCBgbGV2ZWxgIGFuZCBgbWVzc2FnZWAgcHJvcGVydGllcy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBsb2djYXQgcHJvY2VzcyBpcyBub3QgcnVubmluZy5cbiAqL1xubWV0aG9kcy5zZXRMb2djYXRMaXN0ZW5lciA9IGZ1bmN0aW9uIHNldExvZ2NhdExpc3RlbmVyIChsaXN0ZW5lcikge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkxvZ2NhdCBwcm9jZXNzIGhhc24ndCBiZWVuIHN0YXJ0ZWRcIik7XG4gIH1cbiAgdGhpcy5sb2djYXQub24oJ291dHB1dCcsIGxpc3RlbmVyKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgcHJldmlvdXNseSBzZXQgY2FsbGJhY2sgZm9yIHRoZSBsb2djYXQgb3V0cHV0IGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIC0gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLCB3aGljaCBoYXMgYmVlbiBwcmV2aW91c2x5XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCB0byBgc2V0TG9nY2F0TGlzdGVuZXJgXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgbG9nY2F0IHByb2Nlc3MgaXMgbm90IHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMucmVtb3ZlTG9nY2F0TGlzdGVuZXIgPSBmdW5jdGlvbiByZW1vdmVMb2djYXRMaXN0ZW5lciAobGlzdGVuZXIpIHtcbiAgaWYgKF8uaXNFbXB0eSh0aGlzLmxvZ2NhdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2djYXQgcHJvY2VzcyBoYXNuJ3QgYmVlbiBzdGFydGVkXCIpO1xuICB9XG4gIHRoaXMubG9nY2F0LnJlbW92ZUxpc3RlbmVyKCdvdXRwdXQnLCBsaXN0ZW5lcik7XG59O1xuXG4vKipcbiAqIEF0IHNvbWUgcG9pbnQgb2YgdGltZSBHb29nbGUgaGFzIGNoYW5nZWQgdGhlIGRlZmF1bHQgYHBzYCBiZWhhdmlvdXIsIHNvIGl0IG9ubHlcbiAqIGxpc3RzIHByb2Nlc3NlcyB0aGF0IGJlbG9uZyB0byB0aGUgY3VycmVudCBzaGVsbCB1c2VyIHJhdGhlciB0byBhbGxcbiAqIHVzZXJzLiBJdCBpcyBuZWNlc3NhcnkgdG8gZXhlY3V0ZSBwcyB3aXRoIC1BIGNvbW1hbmQgbGluZSBhcmd1bWVudFxuICogdG8gbWltaWMgdGhlIHByZXZpb3VzIGJlaGF2aW91ci5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgb3V0cHV0IG9mIGBwc2AgY29tbWFuZCB3aGVyZSBhbGwgcHJvY2Vzc2VzIGFyZSBpbmNsdWRlZFxuICovXG5tZXRob2RzLmxpc3RQcm9jZXNzU3RhdHVzID0gYXN5bmMgZnVuY3Rpb24gbGlzdFByb2Nlc3NTdGF0dXMgKCkge1xuICBpZiAoIV8uaXNCb29sZWFuKHRoaXMuX2RvZXNQc1N1cHBvcnRBT3B0aW9uKSkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9kb2VzUHNTdXBwb3J0QU9wdGlvbiA9IC9eLUFcXGIvbS50ZXN0KGF3YWl0IHRoaXMuc2hlbGwoWydwcycsICctLWhlbHAnXSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5kZWJ1ZyhlLnN0YWNrKTtcbiAgICAgIHRoaXMuX2RvZXNQc1N1cHBvcnRBT3B0aW9uID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKHRoaXMuX2RvZXNQc1N1cHBvcnRBT3B0aW9uID8gWydwcycsICctQSddIDogWydwcyddKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBwcm9jZXNzIG5hbWUgZm9yIHRoZSBnaXZlbiBwcm9jZXNzIGlkZW50aWZpZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHBpZCAtIFRoZSB2YWxpZCBwcm9jZXNzIGlkZW50aWZpZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZ2l2ZW4gUElEIGlzIGVpdGhlciBpbnZhbGlkIG9yIGlzIG5vdCBwcmVzZW50XG4gKiBpbiB0aGUgYWN0aXZlIHByb2Nlc3NlcyBsaXN0XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcHJvY2VzcyBuYW1lXG4gKi9cbm1ldGhvZHMuZ2V0TmFtZUJ5UGlkID0gYXN5bmMgZnVuY3Rpb24gZ2V0TmFtZUJ5UGlkIChwaWQpIHtcbiAgaWYgKGlzTmFOKHBpZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBQSUQgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIG51bWJlci4gJyR7cGlkfScgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIHBpZCA9IHBhcnNlSW50KHBpZCwgMTApO1xuXG4gIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMubGlzdFByb2Nlc3NTdGF0dXMoKTtcbiAgY29uc3QgdGl0bGVNYXRjaCA9IFBTX1RJVExFX1BBVFRFUk4uZXhlYyhzdGRvdXQpO1xuICBpZiAoIXRpdGxlTWF0Y2gpIHtcbiAgICBsb2cuZGVidWcoc3Rkb3V0KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgdGhlIHByb2Nlc3MgbmFtZSBmb3IgUElEICcke3BpZH0nYCk7XG4gIH1cbiAgY29uc3QgYWxsVGl0bGVzID0gdGl0bGVNYXRjaFsxXS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgY29uc3QgcGlkSW5kZXggPSBhbGxUaXRsZXMuaW5kZXhPZihQSURfQ09MVU1OX1RJVExFKTtcbiAgLy8gaXQgbWlnaHQgbm90IGJlIHN0YWJsZSB0byB0YWtlIE5BTUUgYnkgaW5kZXgsIGJlY2F1c2UgZGVwZW5kaW5nIG9uIHRoZVxuICAvLyBhY3R1YWwgU0RLIHRoZSBwcyBvdXRwdXQgbWlnaHQgbm90IGNvbnRhaW4gYW4gYWJicmV2aWF0aW9uIGZvciB0aGUgUyBmbGFnOlxuICAvLyBVU0VSICAgICBQSUQgICBQUElEICBWU0laRSAgUlNTICAgICBXQ0hBTiAgICBQQyAgICAgICAgTkFNRVxuICAvLyBVU0VSICAgICBQSUQgICBQUElEICBWU0laRSAgUlNTICAgICBXQ0hBTiAgICBQQyAgIFMgICAgTkFNRVxuICBjb25zdCBuYW1lT2Zmc2V0ID0gYWxsVGl0bGVzLmluZGV4T2YoUFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRSkgLSBhbGxUaXRsZXMubGVuZ3RoO1xuICBjb25zdCBwaWRSZWdleCA9IG5ldyBSZWdFeHAoYF4oLipcXFxcYiR7cGlkfVxcXFxiLiopJGAsICdnbScpO1xuICBsZXQgbWF0Y2hlZExpbmU7XG4gIHdoaWxlICgobWF0Y2hlZExpbmUgPSBwaWRSZWdleC5leGVjKHN0ZG91dCkpKSB7XG4gICAgY29uc3QgaXRlbXMgPSBtYXRjaGVkTGluZVsxXS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICBpZiAocGFyc2VJbnQoaXRlbXNbcGlkSW5kZXhdLCAxMCkgPT09IHBpZCAmJiBpdGVtc1tpdGVtcy5sZW5ndGggKyBuYW1lT2Zmc2V0XSkge1xuICAgICAgcmV0dXJuIGl0ZW1zW2l0ZW1zLmxlbmd0aCArIG5hbWVPZmZzZXRdO1xuICAgIH1cbiAgfVxuICBsb2cuZGVidWcoc3Rkb3V0KTtcbiAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZ2V0IHRoZSBwcm9jZXNzIG5hbWUgZm9yIFBJRCAnJHtwaWR9J2ApO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGxpc3Qgb2YgcHJvY2VzcyBpZHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHBhcnQgb2YgcHJvY2VzcyBuYW1lLlxuICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59IFRoZSBsaXN0IG9mIG1hdGNoZWQgcHJvY2VzcyBJRHMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcGFzc2VkIHByb2Nlc3MgbmFtZSBpcyBub3QgYSB2YWxpZCBvbmVcbiAqL1xubWV0aG9kcy5nZXRQSURzQnlOYW1lID0gYXN5bmMgZnVuY3Rpb24gZ2V0UElEc0J5TmFtZSAobmFtZSkge1xuICBsb2cuZGVidWcoYEdldHRpbmcgSURzIG9mIGFsbCAnJHtuYW1lfScgcHJvY2Vzc2VzYCk7XG4gIGlmICghdGhpcy5pc1ZhbGlkQ2xhc3MobmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJvY2VzcyBuYW1lOiAnJHtuYW1lfSdgKTtcbiAgfVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTM1NjdcbiAgaWYgKGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA+PSAyMykge1xuICAgIGlmICghXy5pc0Jvb2xlYW4odGhpcy5faXNQZ3JlcEF2YWlsYWJsZSkpIHtcbiAgICAgIC8vIHBncmVwIGlzIGluIHByaW9yaXR5LCBzaW5jZSBwaWRvZiBoYXMgYmVlbiByZXBvcnRlZCBvZiBoYXZpbmcgYnVncyBvbiBzb21lIHBsYXRmb3Jtc1xuICAgICAgY29uc3QgcGdyZXBPdXRwdXQgPSBfLnRyaW0oYXdhaXQgdGhpcy5zaGVsbChbJ3BncmVwIC0taGVscDsgZWNobyAkPyddKSk7XG4gICAgICB0aGlzLl9pc1BncmVwQXZhaWxhYmxlID0gcGFyc2VJbnQoXy5sYXN0KHBncmVwT3V0cHV0LnNwbGl0KC9cXHMrLykpLCAxMCkgPT09IDA7XG4gICAgICBpZiAodGhpcy5faXNQZ3JlcEF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLl9jYW5QZ3JlcFVzZUZ1bGxDbWRMaW5lU2VhcmNoID0gL14tZlxcYi9tLnRlc3QocGdyZXBPdXRwdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faXNQaWRvZkF2YWlsYWJsZSA9IHBhcnNlSW50KGF3YWl0IHRoaXMuc2hlbGwoWydwaWRvZiAtLWhlbHAgPiAvZGV2L251bGw7IGVjaG8gJD8nXSksIDEwKSA9PT0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX2lzUGdyZXBBdmFpbGFibGUgfHwgdGhpcy5faXNQaWRvZkF2YWlsYWJsZSkge1xuICAgICAgY29uc3Qgc2hlbGxDb21tYW5kID0gdGhpcy5faXNQZ3JlcEF2YWlsYWJsZVxuICAgICAgICA/ICh0aGlzLl9jYW5QZ3JlcFVzZUZ1bGxDbWRMaW5lU2VhcmNoXG4gICAgICAgICAgPyBbJ3BncmVwJywgJy1mJywgXy5lc2NhcGVSZWdFeHAoYChbWzpibGFuazpdXXxeKSR7bmFtZX0oW1s6Ymxhbms6XV18JClgKV1cbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTM4NzJcbiAgICAgICAgICA6IFtgcGdyZXAgXiR7Xy5lc2NhcGVSZWdFeHAobmFtZS5zbGljZSgtTUFYX1BHUkVQX1BBVFRFUk5fTEVOKSl9JCBgICtcbiAgICAgICAgICAgICAgYHx8IHBncmVwIF4ke18uZXNjYXBlUmVnRXhwKG5hbWUuc2xpY2UoMCwgTUFYX1BHUkVQX1BBVFRFUk5fTEVOKSl9JGBdKVxuICAgICAgICA6IFsncGlkb2YnLCBuYW1lXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5zaGVsbChzaGVsbENvbW1hbmQpKVxuICAgICAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAgICAgLm1hcCgoeCkgPT4gcGFyc2VJbnQoeCwgMTApKVxuICAgICAgICAgIC5maWx0ZXIoKHgpID0+IF8uaXNJbnRlZ2VyKHgpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gZXJyb3IgY29kZSAxIGlzIHJldHVybmVkIGlmIHRoZSB1dGlsaXR5IGRpZCBub3QgZmluZCBhbnkgcHJvY2Vzc2VzXG4gICAgICAgIC8vIHdpdGggdGhlIGdpdmVuIG5hbWVcbiAgICAgICAgaWYgKGUuY29kZSAhPT0gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGV4dHJhY3QgcHJvY2VzcyBJRCBvZiAnJHtuYW1lfSc6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfLmluY2x1ZGVzKGUuc3RkZXJyIHx8IGUuc3Rkb3V0LCAnc3ludGF4IGVycm9yJykpIHtcbiAgICAgICAgICBsb2cud2FybihgR290IGFuIHVuZXhwZWN0ZWQgcmVzcG9uc2UgZnJvbSB0aGUgc2hlbGwgaW50ZXJwcmV0ZXI6ICR7ZS5zdGRlcnIgfHwgZS5zdGRvdXR9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbG9nLmRlYnVnKCdVc2luZyBwcy1iYXNlZCBQSUQgZGV0ZWN0aW9uJyk7XG4gIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMubGlzdFByb2Nlc3NTdGF0dXMoKTtcbiAgY29uc3QgdGl0bGVNYXRjaCA9IFBTX1RJVExFX1BBVFRFUk4uZXhlYyhzdGRvdXQpO1xuICBpZiAoIXRpdGxlTWF0Y2gpIHtcbiAgICBsb2cuZGVidWcoc3Rkb3V0KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBleHRyYWN0IFBJRCBvZiAnJHtuYW1lfScgZnJvbSBwcyBvdXRwdXRgKTtcbiAgfVxuICBjb25zdCBhbGxUaXRsZXMgPSB0aXRsZU1hdGNoWzFdLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICBjb25zdCBwaWRJbmRleCA9IGFsbFRpdGxlcy5pbmRleE9mKFBJRF9DT0xVTU5fVElUTEUpO1xuICBjb25zdCBwaWRzID0gW107XG4gIGNvbnN0IHByb2Nlc3NOYW1lUmVnZXggPSBuZXcgUmVnRXhwKGBeKC4qXFxcXGJcXFxcZCtcXFxcYi4qXFxcXGIke18uZXNjYXBlUmVnRXhwKG5hbWUpfVxcXFxiLiopJGAsICdnbScpO1xuICBsZXQgbWF0Y2hlZExpbmU7XG4gIHdoaWxlICgobWF0Y2hlZExpbmUgPSBwcm9jZXNzTmFtZVJlZ2V4LmV4ZWMoc3Rkb3V0KSkpIHtcbiAgICBjb25zdCBpdGVtcyA9IG1hdGNoZWRMaW5lWzFdLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmIChwaWRJbmRleCA+PSBhbGxUaXRsZXMubGVuZ3RoIHx8IGlzTmFOKGl0ZW1zW3BpZEluZGV4XSkpIHtcbiAgICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZXh0cmFjdCBQSUQgb2YgJyR7bmFtZX0nIGZyb20gJyR7bWF0Y2hlZExpbmVbMV0udHJpbSgpfSdgKTtcbiAgICB9XG4gICAgcGlkcy5wdXNoKHBhcnNlSW50KGl0ZW1zW3BpZEluZGV4XSwgMTApKTtcbiAgfVxuICByZXR1cm4gcGlkcztcbn07XG5cbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIHByb2Nlc3MgaWRzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBwYXJ0IG9mIHByb2Nlc3MgbmFtZS5cbiAqIEByZXR1cm4ge0FycmF5LjxudW1iZXI+fSBUaGUgbGlzdCBvZiBtYXRjaGVkIHByb2Nlc3MgSURzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMua2lsbFByb2Nlc3Nlc0J5TmFtZSA9IGFzeW5jIGZ1bmN0aW9uIGtpbGxQcm9jZXNzZXNCeU5hbWUgKG5hbWUpIHtcbiAgdHJ5IHtcbiAgICBsb2cuZGVidWcoYEF0dGVtcHRpbmcgdG8ga2lsbCBhbGwgJHtuYW1lfSBwcm9jZXNzZXNgKTtcbiAgICBjb25zdCBwaWRzID0gYXdhaXQgdGhpcy5nZXRQSURzQnlOYW1lKG5hbWUpO1xuICAgIGlmIChfLmlzRW1wdHkocGlkcykpIHtcbiAgICAgIGxvZy5pbmZvKGBObyAnJHtuYW1lfScgcHJvY2VzcyBoYXMgYmVlbiBmb3VuZGApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBCLmFsbChwaWRzLm1hcCgocCkgPT4gdGhpcy5raWxsUHJvY2Vzc0J5UElEKHApKSk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8ga2lsbCAke25hbWV9IHByb2Nlc3Nlcy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEtpbGwgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBUaGUgY3VycmVudCB1c2VyIGlzIGF1dG9tYXRpY2FsbHkgc3dpdGNoZWQgdG8gcm9vdCBpZiBuZWNlc3NhcnkgaW4gb3JkZXJcbiAqIHRvIHByb3Blcmx5IGtpbGwgdGhlIHByb2Nlc3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwaWQgLSBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgdG8gYmUga2lsbGVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwcm9jZXNzIGNhbm5vdCBiZSBraWxsZWQuXG4gKi9cbm1ldGhvZHMua2lsbFByb2Nlc3NCeVBJRCA9IGFzeW5jIGZ1bmN0aW9uIGtpbGxQcm9jZXNzQnlQSUQgKHBpZCkge1xuICBsb2cuZGVidWcoYEF0dGVtcHRpbmcgdG8ga2lsbCBwcm9jZXNzICR7cGlkfWApO1xuICBjb25zdCBub1Byb2Nlc3NGbGFnID0gJ05vIHN1Y2ggcHJvY2Vzcyc7XG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHByb2Nlc3MgZXhpc3RzIGFuZCB0aHJvdyBhbiBleGNlcHRpb24gb3RoZXJ3aXNlXG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ2tpbGwnLCBwaWRdKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChfLmluY2x1ZGVzKGUuc3RkZXJyLCBub1Byb2Nlc3NGbGFnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIV8uaW5jbHVkZXMoZS5zdGRlcnIsICdPcGVyYXRpb24gbm90IHBlcm1pdHRlZCcpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBsb2cuaW5mbyhgQ2Fubm90IGtpbGwgUElEICR7cGlkfSBkdWUgdG8gaW5zdWZmaWNpZW50IHBlcm1pc3Npb25zLiBSZXRyeWluZyBhcyByb290YCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2hlbGwoWydraWxsJywgcGlkXSwge1xuICAgICAgICBwcml2aWxlZ2VkOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlMSkge1xuICAgICAgaWYgKF8uaW5jbHVkZXMoZTEuc3RkZXJyLCBub1Byb2Nlc3NGbGFnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBlMTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQnJvYWRjYXN0IHByb2Nlc3Mga2lsbGluZyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGludGVudCAtIFRoZSBuYW1lIG9mIHRoZSBpbnRlbnQgdG8gYnJvYWRjYXN0IHRvLlxuICogQHBhcmFtIHtzdHJpbmd9IHByb2Nlc3NOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGtpbGxlZCBwcm9jZXNzLlxuICogQHRocm93cyB7ZXJyb3J9IElmIHRoZSBwcm9jZXNzIHdhcyBub3Qga2lsbGVkLlxuICovXG5tZXRob2RzLmJyb2FkY2FzdFByb2Nlc3NFbmQgPSBhc3luYyBmdW5jdGlvbiBicm9hZGNhc3RQcm9jZXNzRW5kIChpbnRlbnQsIHByb2Nlc3NOYW1lKSB7XG4gIC8vIHN0YXJ0IHRoZSBicm9hZGNhc3Qgd2l0aG91dCB3YWl0aW5nIGZvciBpdCB0byBmaW5pc2guXG4gIHRoaXMuYnJvYWRjYXN0KGludGVudCk7XG4gIC8vIHdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIGVuZFxuICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICBsZXQgdGltZW91dE1zID0gNDAwMDA7XG4gIHRyeSB7XG4gICAgd2hpbGUgKChEYXRlLm5vdygpIC0gc3RhcnQpIDwgdGltZW91dE1zKSB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5wcm9jZXNzRXhpc3RzKHByb2Nlc3NOYW1lKSkge1xuICAgICAgICAvLyBjb29sIGRvd25cbiAgICAgICAgYXdhaXQgc2xlZXAoNDAwKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgUHJvY2VzcyBuZXZlciBkaWVkIHdpdGhpbiAke3RpbWVvdXRNc30gbXNgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGJyb2FkY2FzdCBwcm9jZXNzIGVuZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEJyb2FkY2FzdCBhIG1lc3NhZ2UgdG8gdGhlIGdpdmVuIGludGVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW50ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGludGVudCB0byBicm9hZGNhc3QgdG8uXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgaW50ZW50IG5hbWUgaXMgbm90IGEgdmFsaWQgY2xhc3MgbmFtZS5cbiAqL1xubWV0aG9kcy5icm9hZGNhc3QgPSBhc3luYyBmdW5jdGlvbiBicm9hZGNhc3QgKGludGVudCkge1xuICBpZiAoIXRoaXMuaXNWYWxpZENsYXNzKGludGVudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW50ZW50ICR7aW50ZW50fWApO1xuICB9XG4gIGxvZy5kZWJ1ZyhgQnJvYWRjYXN0aW5nOiAke2ludGVudH1gKTtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2FtJywgJ2Jyb2FkY2FzdCcsICctYScsIGludGVudF0pO1xufTtcblxuLyoqXG4gKiBLaWxsIEFuZHJvaWQgaW5zdHJ1bWVudHMgaWYgdGhleSBhcmUgY3VycmVudGx5IHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMuZW5kQW5kcm9pZENvdmVyYWdlID0gYXN5bmMgZnVuY3Rpb24gZW5kQW5kcm9pZENvdmVyYWdlICgpIHtcbiAgaWYgKHRoaXMuaW5zdHJ1bWVudFByb2MgJiYgdGhpcy5pbnN0cnVtZW50UHJvYy5pc1J1bm5pbmcpIHtcbiAgICBhd2FpdCB0aGlzLmluc3RydW1lbnRQcm9jLnN0b3AoKTtcbiAgfVxufTtcblxuLyoqXG4gKiBJbnN0cnVtZW50IHRoZSBwYXJ0aWN1bGFyIGFjdGl2aXR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBiZSBpbnN0cnVtZW50ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aXZpdHkgLSBUaGUgbmFtZSBvZiB0aGUgbWFpbiBhY3Rpdml0eSBpbiB0aGlzIHBhY2thZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5zdHJ1bWVudFdpdGggLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBpbnN0cnVtZW50XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWN0aXZpdHkgd2l0aC5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBhbnkgZXhjZXB0aW9uIGlzIHJlcG9ydGVkIGJ5IGFkYiBzaGVsbC5cbiAqL1xubWV0aG9kcy5pbnN0cnVtZW50ID0gYXN5bmMgZnVuY3Rpb24gaW5zdHJ1bWVudCAocGtnLCBhY3Rpdml0eSwgaW5zdHJ1bWVudFdpdGgpIHtcbiAgaWYgKGFjdGl2aXR5WzBdICE9PSAnLicpIHtcbiAgICBwa2cgPSAnJztcbiAgfVxuICBsZXQgcGtnQWN0aXZpdHkgPSAocGtnICsgYWN0aXZpdHkpLnJlcGxhY2UoL1xcLisvZywgJy4nKTsgLy8gRml4IHBrZy4uYWN0aXZpdHkgZXJyb3JcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoW1xuICAgICdhbScsICdpbnN0cnVtZW50JyxcbiAgICAnLWUnLCAnbWFpbl9hY3Rpdml0eScsXG4gICAgcGtnQWN0aXZpdHksXG4gICAgaW5zdHJ1bWVudFdpdGgsXG4gIF0pO1xuICBpZiAoc3Rkb3V0LmluZGV4T2YoJ0V4Y2VwdGlvbicpICE9PSAtMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBleGNlcHRpb24gZHVyaW5nIGluc3RydW1lbnRhdGlvbi4gT3JpZ2luYWwgZXJyb3IgJHtzdGRvdXQuc3BsaXQoJ1xcbicpWzBdfWApO1xuICB9XG59O1xuXG4vKipcbiAqIENvbGxlY3QgQW5kcm9pZCBjb3ZlcmFnZSBieSBpbnN0cnVtZW50aW5nIHRoZSBwYXJ0aWN1bGFyIGFjdGl2aXR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0cnVtZW50Q2xhc3MgLSBUaGUgbmFtZSBvZiB0aGUgaW5zdHJ1bWVudGF0aW9uIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9IHdhaXRQa2cgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBiZSBpbnN0cnVtZW50ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gd2FpdEFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIG1haW4gYWN0aXZpdHkgaW4gdGhpcyBwYWNrYWdlLlxuICpcbiAqIEByZXR1cm4ge3Byb21pc2V9IFRoZSBwcm9taXNlIGlzIHN1Y2Nlc3NmdWxseSByZXNvbHZlZCBpZiB0aGUgaW5zdHJ1bWVudGF0aW9uIHN0YXJ0c1xuICogICAgICAgICAgICAgICAgICAgd2l0aG91dCBlcnJvcnMuXG4gKi9cbm1ldGhvZHMuYW5kcm9pZENvdmVyYWdlID0gYXN5bmMgZnVuY3Rpb24gYW5kcm9pZENvdmVyYWdlIChpbnN0cnVtZW50Q2xhc3MsIHdhaXRQa2csIHdhaXRBY3Rpdml0eSkge1xuICBpZiAoIXRoaXMuaXNWYWxpZENsYXNzKGluc3RydW1lbnRDbGFzcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2xhc3MgJHtpbnN0cnVtZW50Q2xhc3N9YCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IG5ldyBCKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBsZXQgYXJncyA9IHRoaXMuZXhlY3V0YWJsZS5kZWZhdWx0QXJnc1xuICAgICAgLmNvbmNhdChbJ3NoZWxsJywgJ2FtJywgJ2luc3RydW1lbnQnLCAnLWUnLCAnY292ZXJhZ2UnLCAndHJ1ZScsICctdyddKVxuICAgICAgLmNvbmNhdChbaW5zdHJ1bWVudENsYXNzXSk7XG4gICAgbG9nLmRlYnVnKGBDb2xsZWN0aW5nIGNvdmVyYWdlIGRhdGEgd2l0aDogJHtbdGhpcy5leGVjdXRhYmxlLnBhdGhdLmNvbmNhdChhcmdzKS5qb2luKCcgJyl9YCk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIGFtIGluc3RydW1lbnQgcnVucyBmb3IgdGhlIGxpZmUgb2YgdGhlIGFwcCBwcm9jZXNzLlxuICAgICAgdGhpcy5pbnN0cnVtZW50UHJvYyA9IG5ldyBTdWJQcm9jZXNzKHRoaXMuZXhlY3V0YWJsZS5wYXRoLCBhcmdzKTtcbiAgICAgIGF3YWl0IHRoaXMuaW5zdHJ1bWVudFByb2Muc3RhcnQoMCk7XG4gICAgICB0aGlzLmluc3RydW1lbnRQcm9jLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgaWYgKHN0ZGVycikge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gaW5zdHJ1bWVudGF0aW9uLiBPcmlnaW5hbCBlcnJvcjogJHtzdGRlcnJ9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvckFjdGl2aXR5KHdhaXRQa2csIHdhaXRBY3Rpdml0eSk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQW5kcm9pZCBjb3ZlcmFnZSBmYWlsZWQuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKSk7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBwYXJ0aWN1bGFyIHByb3BlcnR5IG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuIFRoaXMgbmFtZSBzaG91bGRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGtub3duIHRvIF9hZGIgc2hlbGwgZ2V0cHJvcF8gdG9vbC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlUHJvcGVydHkgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VQcm9wZXJ0eSAocHJvcGVydHkpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydnZXRwcm9wJywgcHJvcGVydHldKTtcbiAgbGV0IHZhbCA9IHN0ZG91dC50cmltKCk7XG4gIGxvZy5kZWJ1ZyhgQ3VycmVudCBkZXZpY2UgcHJvcGVydHkgJyR7cHJvcGVydHl9JzogJHt2YWx9YCk7XG4gIHJldHVybiB2YWw7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IHNldFByb3BPcHRzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHByaXZpbGVnZWQgLSBEbyB3ZSBydW4gc2V0UHJvcCBhcyBhIHByaXZpbGVnZWQgY29tbWFuZD8gRGVmYXVsdCB0cnVlLlxuICovXG5cbi8qKlxuICogU2V0IHRoZSBwYXJ0aWN1bGFyIHByb3BlcnR5IG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuIFRoaXMgbmFtZSBzaG91bGRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGtub3duIHRvIF9hZGIgc2hlbGwgc2V0cHJvcF8gdG9vbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWwgLSBUaGUgbmV3IHByb3BlcnR5IHZhbHVlLlxuICogQHBhcmFtIHtzZXRQcm9wT3B0c30gb3B0c1xuICpcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBfc2V0cHJvcF8gdXRpbGl0eSBmYWlscyB0byBjaGFuZ2UgcHJvcGVydHkgdmFsdWUuXG4gKi9cbm1ldGhvZHMuc2V0RGV2aWNlUHJvcGVydHkgPSBhc3luYyBmdW5jdGlvbiBzZXREZXZpY2VQcm9wZXJ0eSAocHJvcCwgdmFsLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge3ByaXZpbGVnZWQgPSB0cnVlfSA9IG9wdHM7XG4gIGxvZy5kZWJ1ZyhgU2V0dGluZyBkZXZpY2UgcHJvcGVydHkgJyR7cHJvcH0nIHRvICcke3ZhbH0nYCk7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydzZXRwcm9wJywgcHJvcCwgdmFsXSwge1xuICAgIHByaXZpbGVnZWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgc3lzdGVtIGxhbmd1YWdlIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VTeXNMYW5ndWFnZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVN5c0xhbmd1YWdlICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3BlcnNpc3Quc3lzLmxhbmd1YWdlJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBjb3VudHJ5IG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVN5c0NvdW50cnkgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VTeXNDb3VudHJ5ICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3BlcnNpc3Quc3lzLmNvdW50cnknKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IHN5c3RlbSBsb2NhbGUgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlU3lzTG9jYWxlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlU3lzTG9jYWxlICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3BlcnNpc3Quc3lzLmxvY2FsZScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgcHJvZHVjdCBsYW5ndWFnZSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VQcm9kdWN0TGFuZ3VhZ2UgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VQcm9kdWN0TGFuZ3VhZ2UgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5sb2NhbGUubGFuZ3VhZ2UnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IHByb2R1Y3QgY291bnRyeSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VQcm9kdWN0Q291bnRyeSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVByb2R1Y3RDb3VudHJ5ICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubG9jYWxlLnJlZ2lvbicpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgcHJvZHVjdCBsb2NhbGUgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlUHJvZHVjdExvY2FsZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVByb2R1Y3RMb2NhbGUgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5sb2NhbGUnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgbW9kZWwgbmFtZSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0TW9kZWwgPSBhc3luYyBmdW5jdGlvbiBnZXRNb2RlbCAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0Lm1vZGVsJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG1hbnVmYWN0dXJlciBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXRNYW51ZmFjdHVyZXIgPSBhc3luYyBmdW5jdGlvbiBnZXRNYW51ZmFjdHVyZXIgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5tYW51ZmFjdHVyZXInKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IHNjcmVlbiBzaXplLlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gRGV2aWNlIHNjcmVlbiBzaXplIGFzIHN0cmluZyBpbiBmb3JtYXQgJ1d4SCcgb3JcbiAqICAgICAgICAgICAgICAgICAgX251bGxfIGlmIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkLlxuICovXG5tZXRob2RzLmdldFNjcmVlblNpemUgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5TaXplICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWyd3bScsICdzaXplJ10pO1xuICBsZXQgc2l6ZSA9IG5ldyBSZWdFeHAoL1BoeXNpY2FsIHNpemU6IChbXlxccj9cXG5dKykqL2cpLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKHNpemUgJiYgc2l6ZS5sZW5ndGggPj0gMikge1xuICAgIHJldHVybiBzaXplWzFdLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IHNjcmVlbiBkZW5zaXR5IGluIGRwaVxuICpcbiAqIEByZXR1cm4gez9udW1iZXJ9IERldmljZSBzY3JlZW4gZGVuc2l0eSBhcyBhIG51bWJlciBvciBfbnVsbF8gaWYgaXRcbiAqICAgICAgICAgICAgICAgICAgY2Fubm90IGJlIGRldGVybWluZWRcbiAqL1xubWV0aG9kcy5nZXRTY3JlZW5EZW5zaXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuRGVuc2l0eSAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnd20nLCAnZGVuc2l0eSddKTtcbiAgbGV0IGRlbnNpdHkgPSBuZXcgUmVnRXhwKC9QaHlzaWNhbCBkZW5zaXR5OiAoW15cXHI/XFxuXSspKi9nKS5leGVjKHN0ZG91dCk7XG4gIGlmIChkZW5zaXR5ICYmIGRlbnNpdHkubGVuZ3RoID49IDIpIHtcbiAgICBsZXQgZGVuc2l0eU51bWJlciA9IHBhcnNlSW50KGRlbnNpdHlbMV0udHJpbSgpLCAxMCk7XG4gICAgcmV0dXJuIGlzTmFOKGRlbnNpdHlOdW1iZXIpID8gbnVsbCA6IGRlbnNpdHlOdW1iZXI7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIFNldHVwIEhUVFAgcHJveHkgaW4gZGV2aWNlIGdsb2JhbCBzZXR0aW5ncy5cbiAqIFJlYWQgaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vZnJhbWV3b3Jrcy9iYXNlLysvYW5kcm9pZC05LjAuMF9yMjEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YSBmb3IgZWFjaCBwcm9wZXJ0eVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm94eUhvc3QgLSBUaGUgaG9zdCBuYW1lIG9mIHRoZSBwcm94eS5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gcHJveHlQb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIGJlIHNldC5cbiAqL1xubWV0aG9kcy5zZXRIdHRwUHJveHkgPSBhc3luYyBmdW5jdGlvbiBzZXRIdHRwUHJveHkgKHByb3h5SG9zdCwgcHJveHlQb3J0KSB7XG4gIGxldCBwcm94eSA9IGAke3Byb3h5SG9zdH06JHtwcm94eVBvcnR9YDtcbiAgaWYgKF8uaXNVbmRlZmluZWQocHJveHlIb3N0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2FsbCB0byBzZXRIdHRwUHJveHkgbWV0aG9kIHdpdGggdW5kZWZpbmVkIHByb3h5X2hvc3Q6ICR7cHJveHl9YCk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocHJveHlQb3J0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2FsbCB0byBzZXRIdHRwUHJveHkgbWV0aG9kIHdpdGggdW5kZWZpbmVkIHByb3h5X3BvcnQgJHtwcm94eX1gKTtcbiAgfVxuXG4gIGNvbnN0IGh0dHBQcm94eVNldHRpbnMgPSBbXG4gICAgWydodHRwX3Byb3h5JywgcHJveHldLFxuICAgIFsnZ2xvYmFsX2h0dHBfcHJveHlfaG9zdCcsIHByb3h5SG9zdF0sXG4gICAgWydnbG9iYWxfaHR0cF9wcm94eV9wb3J0JywgcHJveHlQb3J0XVxuICBdO1xuICBmb3IgKGNvbnN0IFtzZXR0aW5nS2V5LCBzZXR0aW5nVmFsdWVdIG9mIGh0dHBQcm94eVNldHRpbnMpIHtcbiAgICBhd2FpdCB0aGlzLnNldFNldHRpbmcoJ2dsb2JhbCcsIHNldHRpbmdLZXksIHNldHRpbmdWYWx1ZSk7XG4gIH1cbn07XG5cbi8qKlxuICogRGVsZXRlIEhUVFAgcHJveHkgaW4gZGV2aWNlIGdsb2JhbCBzZXR0aW5ncy5cbiAqIFJlYm9vdGluZyB0aGUgdGVzdCBkZXZpY2UgaXMgbmVjZXNzYXJ5IHRvIGFwcGx5IHRoZSBjaGFuZ2UuXG4gKi9cbm1ldGhvZHMuZGVsZXRlSHR0cFByb3h5ID0gYXN5bmMgZnVuY3Rpb24gZGVsZXRlSHR0cFByb3h5ICgpIHtcbiAgY29uc3QgaHR0cFByb3h5U2V0dGlucyA9IFtcbiAgICAnaHR0cF9wcm94eScsXG4gICAgJ2dsb2JhbF9odHRwX3Byb3h5X2hvc3QnLFxuICAgICdnbG9iYWxfaHR0cF9wcm94eV9wb3J0JyxcbiAgICAnZ2xvYmFsX2h0dHBfcHJveHlfZXhjbHVzaW9uX2xpc3QnIC8vIGBnbG9iYWxfaHR0cF9wcm94eV9leGNsdXNpb25fbGlzdD1gIHdhcyBnZW5lcmF0ZWQgYnkgYHNldHRpbmdzIGdsb2JhbCBodHRvX3Byb3h5IHh4eHhgXG4gIF07XG4gIGZvciAoY29uc3Qgc2V0dGluZyBvZiBodHRwUHJveHlTZXR0aW5zKSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3NldHRpbmdzJywgJ2RlbGV0ZScsICdnbG9iYWwnLCBzZXR0aW5nXSk7XG4gIH1cbn07XG5cbi8qKlxuICogU2V0IGRldmljZSBwcm9wZXJ0eS5cbiAqIFthbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzXXtAbGluayBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5odG1sfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgLSBvbmUgb2Yge3N5c3RlbSwgc2VjdXJlLCBnbG9iYWx9LCBjYXNlLWluc2Vuc2l0aXZlLlxuICogQHBhcmFtIHtzdHJpbmd9IHNldHRpbmcgLSBwcm9wZXJ0eSBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSB2YWx1ZSAtIHByb3BlcnR5IHZhbHVlLlxuICogQHJldHVybiB7c3RyaW5nfSBjb21tYW5kIG91dHB1dC5cbiAqL1xubWV0aG9kcy5zZXRTZXR0aW5nID0gYXN5bmMgZnVuY3Rpb24gc2V0U2V0dGluZyAobmFtZXNwYWNlLCBzZXR0aW5nLCB2YWx1ZSkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ3NldHRpbmdzJywgJ3B1dCcsIG5hbWVzcGFjZSwgc2V0dGluZywgdmFsdWVdKTtcbn07XG5cbi8qKlxuICogR2V0IGRldmljZSBwcm9wZXJ0eS5cbiAqIFthbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzXXtAbGluayBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5odG1sfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgLSBvbmUgb2Yge3N5c3RlbSwgc2VjdXJlLCBnbG9iYWx9LCBjYXNlLWluc2Vuc2l0aXZlLlxuICogQHBhcmFtIHtzdHJpbmd9IHNldHRpbmcgLSBwcm9wZXJ0eSBuYW1lLlxuICogQHJldHVybiB7c3RyaW5nfSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xubWV0aG9kcy5nZXRTZXR0aW5nID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2V0dGluZyAobmFtZXNwYWNlLCBzZXR0aW5nKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnc2V0dGluZ3MnLCAnZ2V0JywgbmFtZXNwYWNlLCBzZXR0aW5nXSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBgYWRiIGJ1Z3JlcG9ydGAgY29tbWFuZCBvdXRwdXQuIFRoaXNcbiAqIG9wZXJhdGlvbiBtYXkgdGFrZSB1cCB0byBzZXZlcmFsIG1pbnV0ZXMuXG4gKlxuICogQHBhcmFtIHs/bnVtYmVyfSB0aW1lb3V0IFsxMjAwMDBdIC0gQ29tbWFuZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kc1xuICogQHJldHVybnMge3N0cmluZ30gQ29tbWFuZCBzdGRvdXRcbiAqL1xubWV0aG9kcy5idWdyZXBvcnQgPSBhc3luYyBmdW5jdGlvbiBidWdyZXBvcnQgKHRpbWVvdXQgPSAxMjAwMDApIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2J1Z3JlcG9ydCddLCB7dGltZW91dH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTY3JlZW5yZWNvcmRPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZpZGVvU2l6ZSAtIFRoZSBmb3JtYXQgaXMgd2lkdGh4aGVpZ2h0LlxuICogICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgZGV2aWNlJ3MgbmF0aXZlIGRpc3BsYXkgcmVzb2x1dGlvbiAoaWYgc3VwcG9ydGVkKSxcbiAqICAgICAgICAgICAgICAgICAgMTI4MHg3MjAgaWYgbm90LiBGb3IgYmVzdCByZXN1bHRzLFxuICogICAgICAgICAgICAgICAgICB1c2UgYSBzaXplIHN1cHBvcnRlZCBieSB5b3VyIGRldmljZSdzIEFkdmFuY2VkIFZpZGVvIENvZGluZyAoQVZDKSBlbmNvZGVyLlxuICogICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgXCIxMjgweDcyMFwiXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBidWdSZXBvcnQgLSBTZXQgaXQgdG8gYHRydWVgIGluIG9yZGVyIHRvIGRpc3BsYXkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGUgdmlkZW8gb3ZlcmxheSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2ggYXMgYSB0aW1lc3RhbXAsIHRoYXQgaXMgaGVscGZ1bCBpbiB2aWRlb3MgY2FwdHVyZWQgdG8gaWxsdXN0cmF0ZSBidWdzLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gaXMgb25seSBzdXBwb3J0ZWQgc2luY2UgQVBJIGxldmVsIDI3IChBbmRyb2lkIFApLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gdGltZUxpbWl0IC0gVGhlIG1heGltdW0gcmVjb3JkaW5nIHRpbWUsIGluIHNlY29uZHMuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCAoYW5kIG1heGltdW0pIHZhbHVlIGlzIDE4MCAoMyBtaW51dGVzKS5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IGJpdFJhdGUgLSBUaGUgdmlkZW8gYml0IHJhdGUgZm9yIHRoZSB2aWRlbywgaW4gbWVnYWJpdHMgcGVyIHNlY29uZC5cbiAqICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDQuIFlvdSBjYW4gaW5jcmVhc2UgdGhlIGJpdCByYXRlIHRvIGltcHJvdmUgdmlkZW8gcXVhbGl0eSxcbiAqICAgICAgICAgICAgICAgIGJ1dCBkb2luZyBzbyByZXN1bHRzIGluIGxhcmdlciBtb3ZpZSBmaWxlcy5cbiAqL1xuXG4vKipcbiAqIEluaXRpYXRlIHNjcmVlbnJlY29yZCB1dGlsaXR5IG9uIHRoZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzdGluYXRpb24gLSBGdWxsIHBhdGggdG8gdGhlIHdyaXRhYmxlIG1lZGlhIGZpbGUgZGVzdGluYXRpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBkZXZpY2UgZmlsZSBzeXN0ZW0uXG4gKiBAcGFyYW0gez9TY3JlZW5yZWNvcmRPcHRpb25zfSBvcHRpb25zIFt7fV1cbiAqIEByZXR1cm5zIHtTdWJQcm9jZXNzfSBzY3JlZW5yZWNvcmQgcHJvY2Vzcywgd2hpY2ggY2FuIGJlIHRoZW4gY29udHJvbGxlZCBieSB0aGUgY2xpZW50IGNvZGVcbiAqL1xubWV0aG9kcy5zY3JlZW5yZWNvcmQgPSBmdW5jdGlvbiBzY3JlZW5yZWNvcmQgKGRlc3RpbmF0aW9uLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgY21kID0gWydzY3JlZW5yZWNvcmQnXTtcbiAgY29uc3Qge1xuICAgIHZpZGVvU2l6ZSxcbiAgICBiaXRSYXRlLFxuICAgIHRpbWVMaW1pdCxcbiAgICBidWdSZXBvcnQsXG4gIH0gPSBvcHRpb25zO1xuICBpZiAodXRpbC5oYXNWYWx1ZSh2aWRlb1NpemUpKSB7XG4gICAgY21kLnB1c2goJy0tc2l6ZScsIHZpZGVvU2l6ZSk7XG4gIH1cbiAgaWYgKHV0aWwuaGFzVmFsdWUodGltZUxpbWl0KSkge1xuICAgIGNtZC5wdXNoKCctLXRpbWUtbGltaXQnLCB0aW1lTGltaXQpO1xuICB9XG4gIGlmICh1dGlsLmhhc1ZhbHVlKGJpdFJhdGUpKSB7XG4gICAgY21kLnB1c2goJy0tYml0LXJhdGUnLCBiaXRSYXRlKTtcbiAgfVxuICBpZiAoYnVnUmVwb3J0KSB7XG4gICAgY21kLnB1c2goJy0tYnVncmVwb3J0Jyk7XG4gIH1cbiAgY21kLnB1c2goZGVzdGluYXRpb24pO1xuXG4gIGNvbnN0IGZ1bGxDbWQgPSBbXG4gICAgLi4udGhpcy5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLFxuICAgICdzaGVsbCcsXG4gICAgLi4uY21kXG4gIF07XG4gIGxvZy5kZWJ1ZyhgQnVpbGRpbmcgc2NyZWVucmVjb3JkIHByb2Nlc3Mgd2l0aCB0aGUgY29tbWFuZCBsaW5lOiBhZGIgJHt1dGlsLnF1b3RlKGZ1bGxDbWQpfWApO1xuICByZXR1cm4gbmV3IFN1YlByb2Nlc3ModGhpcy5leGVjdXRhYmxlLnBhdGgsIGZ1bGxDbWQpO1xufTtcblxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gaW5wdXQgbWV0aG9kIGNvbnRleHRcbiAqIGFuZCB0aGVuIHJlc3RvcmVzIHRoZSBJTUUgdG8gdGhlIG9yaWdpbmFsIHZhbHVlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGltZSAtIFZhbGlkIElNRSBpZGVudGlmaWVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIEZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAqIEByZXR1cm5zIHsqfSBUaGUgcmVzdWx0IG9mIHRoZSBnaXZlbiBmdW5jdGlvblxuICovXG5tZXRob2RzLnJ1bkluSW1lQ29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHJ1bkluSW1lQ29udGV4dCAoaW1lLCBmbikge1xuICBjb25zdCBvcmlnaW5hbEltZSA9IGF3YWl0IHRoaXMuZGVmYXVsdElNRSgpO1xuICBpZiAob3JpZ2luYWxJbWUgPT09IGltZSkge1xuICAgIGxvZy5kZWJ1ZyhgVGhlIG9yaWdpbmFsIElNRSBpcyB0aGUgc2FtZSBhcyAnJHtpbWV9Jy4gVGhlcmUgaXMgbm8gbmVlZCB0byByZXNldCBpdGApO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IHRoaXMuZW5hYmxlSU1FKGltZSk7XG4gICAgYXdhaXQgdGhpcy5zZXRJTUUoaW1lKTtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTU5NDNcbiAgICBhd2FpdCBCLmRlbGF5KDUwMCk7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAob3JpZ2luYWxJbWUgIT09IGltZSkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRJTUUob3JpZ2luYWxJbWUpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgdHogZGF0YWJhc2UgdGltZSB6b25lIGZvcm1hdHRlZCB0aW1lem9uZVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRaIGRhdGFiYXNlIFRpbWUgWm9uZXMgZm9ybWF0XG4gKlxuICogQHRocm93cyB7ZXJyb3J9IElmIGFueSBleGNlcHRpb24gaXMgcmVwb3J0ZWQgYnkgYWRiIHNoZWxsLlxuICovXG5tZXRob2RzLmdldFRpbWVab25lID0gYXN5bmMgZnVuY3Rpb24gZ2V0VGltZVpvbmUgKCkge1xuICBsb2cuZGVidWcoJ0dldHRpbmcgY3VycmVudCB0aW1lem9uZScpO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdwZXJzaXN0LnN5cy50aW1lem9uZScpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIHRpbWV6b25lLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIGZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGZlYXR1cmUgbmFtZXMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqIEFuIGV4YW1wbGUgYWRiIGNvbW1hbmQgb3V0cHV0OlxuICogYGBgXG4gKiBjbWRcbiAqIGxzX3YyXG4gKiBmaXhlZF9wdXNoX21rZGlyXG4gKiBzaGVsbF92MlxuICogYWJiXG4gKiBzdGF0X3YyXG4gKiBhcGV4XG4gKiBhYmJfZXhlY1xuICogcmVtb3VudF9zaGVsbFxuICogZml4ZWRfcHVzaF9zeW1saW5rX3RpbWVzdGFtcFxuICogYGBgXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIGxpc3RcbiAqL1xubWV0aG9kcy5saXN0RmVhdHVyZXMgPSBhc3luYyBmdW5jdGlvbiBsaXN0RmVhdHVyZXMgKCkge1xuICB0aGlzLl9tZW1vaXplZEZlYXR1cmVzID0gdGhpcy5fbWVtb2l6ZWRGZWF0dXJlc1xuICAgIHx8IF8ubWVtb2l6ZShhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmZWF0dXJlcyddKSwgKCkgPT4gdGhpcy5jdXJEZXZpY2VJZCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLl9tZW1vaXplZEZlYXR1cmVzKCkpXG4gICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgLm1hcCgoeCkgPT4geC50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKF8uaW5jbHVkZXMoZS5zdGRlcnIsICd1bmtub3duIGNvbW1hbmQnKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59O1xuXG4vKipcbiAqIENoZWNrcyB0aGUgc3RhdGUgb2Ygc3RyZWFtZWQgaW5zdGFsbCBmZWF0dXJlLlxuICogVGhpcyBmZWF0dXJlIGFsbG93cyB0byBzcGVlZCB1cCBhcGsgaW5zdGFsbGF0aW9uXG4gKiBzaW5jZSBpdCBkb2VzIG5vdCByZXF1aXJlIHRoZSBvcmlnaW5hbCBhcGsgdG8gYmUgcHVzaGVkIHRvXG4gKiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgZmlyc3QsIHdoaWNoIGFsc28gc2F2ZXMgc3BhY2UuXG4gKiBBbHRob3VnaCwgaXQgaXMgcmVxdWlyZWQgdGhhdCBib3RoIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICogYW5kIHRoZSBhZGIgc2VydmVyIGhhdmUgdGhlIG1lbnRpb25lZCBmdW5jdGlvbmFsaXR5LlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hb3NwLW1pcnJvci9wbGF0Zm9ybV9zeXN0ZW1fY29yZS9ibG9iL21hc3Rlci9hZGIvY2xpZW50L2FkYl9pbnN0YWxsLmNwcFxuICogZm9yIG1vcmUgZGV0YWlsc1xuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IGJvdGggYWRiIGFuZCB0aGVcbiAqIGRldmljZSB1bmRlciB0ZXN0XG4gKi9cbm1ldGhvZHMuaXNTdHJlYW1lZEluc3RhbGxTdXBwb3J0ZWQgPSBhc3luYyBmdW5jdGlvbiBpc1N0cmVhbWVkSW5zdGFsbFN1cHBvcnRlZCAoKSB7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO1xuICBwcm90by5faGVscE91dHB1dCA9IHByb3RvLl9oZWxwT3V0cHV0IHx8IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2hlbHAnXSk7XG4gIHJldHVybiBwcm90by5faGVscE91dHB1dC5pbmNsdWRlcygnLS1zdHJlYW1pbmcnKVxuICAgICYmIChhd2FpdCB0aGlzLmxpc3RGZWF0dXJlcygpKS5pbmNsdWRlcygnY21kJyk7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGluY3JlbWVudGFsIGluc3RhbGwgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgQURCLlxuICogUmVhZCBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9wcmV2aWV3L2ZlYXR1cmVzI2luY3JlbWVudGFsXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIGl0LlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IGJvdGggYWRiIGFuZCB0aGVcbiAqIGRldmljZSB1bmRlciB0ZXN0XG4gKi9cbm1ldGhvZHMuaXNJbmNyZW1lbnRhbEluc3RhbGxTdXBwb3J0ZWQgPSBhc3luYyBmdW5jdGlvbiBpc0luY3JlbWVudGFsSW5zdGFsbFN1cHBvcnRlZCAoKSB7XG4gIGNvbnN0IHtiaW5hcnl9ID0gYXdhaXQgdGhpcy5nZXRWZXJzaW9uKCk7XG4gIGlmICghYmluYXJ5KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB1dGlsLmNvbXBhcmVWZXJzaW9ucyhiaW5hcnkudmVyc2lvbiwgJz49JywgJzMwLjAuMScpXG4gICAgJiYgKGF3YWl0IHRoaXMubGlzdEZlYXR1cmVzKCkpLmluY2x1ZGVzKCdhYmJfZXhlYycpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgcGFja2FnZXMgZnJvbSBEb3plIHdoaXRlbGlzdCBvbiBBbmRyb2lkIDgrXG4gKlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBsaXN0IG9mIHdoaXRlbGlzdGVkIHBhY2thZ2VzLiBBbiBleGFtcGxlIG91dHB1dDpcbiAqIHN5c3RlbSxjb20uYW5kcm9pZC5zaGVsbCwyMDAwXG4gKiBzeXN0ZW0sY29tLmdvb2dsZS5hbmRyb2lkLmNlbGxicm9hZGNhc3RyZWNlaXZlciwxMDE0M1xuICogdXNlcixpby5hcHBpdW0uc2V0dGluZ3MsMTAxNTdcbiAqL1xubWV0aG9kcy5nZXREZXZpY2VJZGxlV2hpdGVsaXN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlSWRsZVdoaXRlbGlzdCAoKSB7XG4gIGlmIChhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgIC8vIERvemUgbW9kZSBoYXMgb25seSBiZWVuIGFkZGVkIHNpbmNlIEFuZHJvaWQgNlxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGxvZy5pbmZvKCdMaXN0aW5nIHBhY2thZ2VzIGluIERvemUgd2hpdGVsaXN0Jyk7XG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ2RldmljZWlkbGUnLCAnd2hpdGVsaXN0J10pO1xuICByZXR1cm4gXy50cmltKG91dHB1dCkuc3BsaXQoL1xcbi8pXG4gICAgLm1hcCgobGluZSkgPT4gXy50cmltKGxpbmUpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59O1xuXG4vKipcbiAqIEFkZHMgYW4gZXhpc3RpbmcgcGFja2FnZShzKSBpbnRvIHRoZSBEb3plIHdoaXRlbGlzdCBvbiBBbmRyb2lkIDgrXG4gKlxuICogQHBhcmFtICB7Li4uc3RyaW5nfSBwYWNrYWdlcyBPbmUgb3IgbW9yZSBwYWNrYWdlcyB0byBhZGQuIElmIHRoZSBwYWNrYWdlXG4gKiBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgd2hpdGVsaXN0IHRoZW4gaXQgaXMgb25seSBnb2luZyB0byBiZSBhZGRlZCBvbmNlLlxuICogSWYgdGhlIHBhY2thZ2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpcyBub3QgaW5zdGFsbGVkL25vdCBrbm93biB0aGVuIGFuIGVycm9yXG4gKiB3aWxsIGJlIHRocm93bi5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIGNvbW1hbmQgdG8gYWRkIHBhY2thZ2UocykgaGFzIGJlZW4gZXhlY3V0ZWRcbiAqL1xubWV0aG9kcy5hZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QgPSBhc3luYyBmdW5jdGlvbiBhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QgKC4uLnBhY2thZ2VzKSB7XG4gIGlmIChfLmlzRW1wdHkocGFja2FnZXMpIHx8IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgLy8gRG96ZSBtb2RlIGhhcyBvbmx5IGJlZW4gYWRkZWQgc2luY2UgQW5kcm9pZCA2XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbG9nLmluZm8oYEFkZGluZyAke3V0aWwucGx1cmFsaXplKCdwYWNrYWdlJywgcGFja2FnZXMubGVuZ3RoKX0gJHtKU09OLnN0cmluZ2lmeShwYWNrYWdlcyl9IHRvIERvemUgd2hpdGVsaXN0YCk7XG4gIGF3YWl0IHRoaXMuc2hlbGxDaHVua3MoKHBrZykgPT4gWydkdW1wc3lzJywgJ2RldmljZWlkbGUnLCAnd2hpdGVsaXN0JywgYCske3BrZ31gXSwgcGFja2FnZXMpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1ldGhvZHM7XG4iXSwiZmlsZSI6ImxpYi90b29scy9hZGItY29tbWFuZHMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==