appium 2.0.0-beta.4 → 2.0.0-beta.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/README.md +10 -11
  2. package/build/lib/appium.d.ts +204 -0
  3. package/build/lib/appium.d.ts.map +1 -0
  4. package/build/lib/appium.js +256 -131
  5. package/build/lib/cli/args.d.ts +17 -0
  6. package/build/lib/cli/args.d.ts.map +1 -0
  7. package/build/lib/cli/args.js +96 -282
  8. package/build/lib/cli/driver-command.d.ts +37 -0
  9. package/build/lib/cli/driver-command.d.ts.map +1 -0
  10. package/build/lib/cli/driver-command.js +27 -18
  11. package/build/lib/cli/extension-command.d.ts +376 -0
  12. package/build/lib/cli/extension-command.d.ts.map +1 -0
  13. package/build/lib/cli/extension-command.js +287 -156
  14. package/build/lib/cli/extension.d.ts +22 -0
  15. package/build/lib/cli/extension.d.ts.map +1 -0
  16. package/build/lib/cli/extension.js +31 -17
  17. package/build/lib/cli/parser.d.ts +84 -0
  18. package/build/lib/cli/parser.d.ts.map +1 -0
  19. package/build/lib/cli/parser.js +164 -94
  20. package/build/lib/cli/plugin-command.d.ts +34 -0
  21. package/build/lib/cli/plugin-command.d.ts.map +1 -0
  22. package/build/lib/cli/plugin-command.js +26 -19
  23. package/build/lib/cli/utils.d.ts +29 -0
  24. package/build/lib/cli/utils.d.ts.map +1 -0
  25. package/build/lib/cli/utils.js +27 -3
  26. package/build/lib/config-file.d.ts +100 -0
  27. package/build/lib/config-file.d.ts.map +1 -0
  28. package/build/lib/config-file.js +136 -0
  29. package/build/lib/config.d.ts +49 -0
  30. package/build/lib/config.d.ts.map +1 -0
  31. package/build/lib/config.js +119 -96
  32. package/build/lib/constants.d.ts +48 -0
  33. package/build/lib/constants.d.ts.map +1 -0
  34. package/build/lib/constants.js +60 -0
  35. package/build/lib/extension/driver-config.d.ts +81 -0
  36. package/build/lib/extension/driver-config.d.ts.map +1 -0
  37. package/build/lib/extension/driver-config.js +177 -0
  38. package/build/lib/extension/extension-config.d.ts +242 -0
  39. package/build/lib/extension/extension-config.d.ts.map +1 -0
  40. package/build/lib/extension/extension-config.js +436 -0
  41. package/build/lib/extension/index.d.ts +48 -0
  42. package/build/lib/extension/index.d.ts.map +1 -0
  43. package/build/lib/extension/index.js +75 -0
  44. package/build/lib/extension/manifest.d.ts +174 -0
  45. package/build/lib/extension/manifest.d.ts.map +1 -0
  46. package/build/lib/extension/manifest.js +256 -0
  47. package/build/lib/extension/package-changed.d.ts +11 -0
  48. package/build/lib/extension/package-changed.d.ts.map +1 -0
  49. package/build/lib/extension/package-changed.js +66 -0
  50. package/build/lib/extension/plugin-config.d.ts +57 -0
  51. package/build/lib/extension/plugin-config.d.ts.map +1 -0
  52. package/build/lib/extension/plugin-config.js +78 -0
  53. package/build/lib/grid-register.d.ts +10 -0
  54. package/build/lib/grid-register.d.ts.map +1 -0
  55. package/build/lib/grid-register.js +21 -25
  56. package/build/lib/logger.d.ts +3 -0
  57. package/build/lib/logger.d.ts.map +1 -0
  58. package/build/lib/logger.js +4 -6
  59. package/build/lib/logsink.d.ts +4 -0
  60. package/build/lib/logsink.d.ts.map +1 -0
  61. package/build/lib/logsink.js +14 -17
  62. package/build/lib/main.d.ts +55 -0
  63. package/build/lib/main.d.ts.map +1 -0
  64. package/build/lib/main.js +183 -91
  65. package/build/lib/schema/arg-spec.d.ts +143 -0
  66. package/build/lib/schema/arg-spec.d.ts.map +1 -0
  67. package/build/lib/schema/arg-spec.js +119 -0
  68. package/build/lib/schema/cli-args.d.ts +19 -0
  69. package/build/lib/schema/cli-args.d.ts.map +1 -0
  70. package/build/lib/schema/cli-args.js +178 -0
  71. package/build/lib/schema/cli-transformers.d.ts +5 -0
  72. package/build/lib/schema/cli-transformers.d.ts.map +1 -0
  73. package/build/lib/schema/cli-transformers.js +74 -0
  74. package/build/lib/schema/index.d.ts +3 -0
  75. package/build/lib/schema/index.d.ts.map +1 -0
  76. package/build/lib/schema/index.js +34 -0
  77. package/build/lib/schema/keywords.d.ts +24 -0
  78. package/build/lib/schema/keywords.d.ts.map +1 -0
  79. package/build/lib/schema/keywords.js +70 -0
  80. package/build/lib/schema/schema.d.ts +259 -0
  81. package/build/lib/schema/schema.d.ts.map +1 -0
  82. package/build/lib/schema/schema.js +450 -0
  83. package/build/lib/utils.d.ts +66 -0
  84. package/build/lib/utils.d.ts.map +1 -0
  85. package/build/lib/utils.js +35 -139
  86. package/build/tsconfig.tsbuildinfo +1 -0
  87. package/build/types/appium-manifest.d.ts +59 -0
  88. package/build/types/appium-manifest.d.ts.map +1 -0
  89. package/build/types/cli.d.ts +123 -0
  90. package/build/types/cli.d.ts.map +1 -0
  91. package/build/types/extension-manifest.d.ts +55 -0
  92. package/build/types/extension-manifest.d.ts.map +1 -0
  93. package/build/types/index.d.ts +16 -0
  94. package/build/types/index.d.ts.map +1 -0
  95. package/driver.d.ts +1 -0
  96. package/driver.js +14 -0
  97. package/index.js +11 -0
  98. package/lib/appium.js +520 -186
  99. package/lib/cli/args.js +267 -422
  100. package/lib/cli/driver-command.js +58 -23
  101. package/lib/cli/extension-command.js +613 -260
  102. package/lib/cli/extension.js +47 -17
  103. package/lib/cli/parser.js +263 -83
  104. package/lib/cli/plugin-command.js +48 -20
  105. package/lib/cli/utils.js +24 -10
  106. package/lib/config-file.js +219 -0
  107. package/lib/config.js +243 -110
  108. package/lib/constants.js +69 -0
  109. package/lib/extension/driver-config.js +249 -0
  110. package/lib/extension/extension-config.js +677 -0
  111. package/lib/extension/index.js +116 -0
  112. package/lib/extension/manifest.js +475 -0
  113. package/lib/extension/package-changed.js +64 -0
  114. package/lib/extension/plugin-config.js +113 -0
  115. package/lib/grid-register.js +49 -35
  116. package/lib/logger.js +1 -2
  117. package/lib/logsink.js +38 -33
  118. package/lib/main.js +308 -100
  119. package/lib/schema/arg-spec.js +229 -0
  120. package/lib/schema/cli-args.js +238 -0
  121. package/lib/schema/cli-transformers.js +115 -0
  122. package/lib/schema/index.js +2 -0
  123. package/lib/schema/keywords.js +136 -0
  124. package/lib/schema/schema.js +717 -0
  125. package/lib/utils.js +121 -140
  126. package/package.json +85 -85
  127. package/plugin.d.ts +1 -0
  128. package/plugin.js +13 -0
  129. package/scripts/autoinstall-extensions.js +185 -0
  130. package/support.d.ts +1 -0
  131. package/support.js +13 -0
  132. package/test.d.ts +7 -0
  133. package/test.js +13 -0
  134. package/types/appium-manifest.ts +73 -0
  135. package/types/cli.ts +150 -0
  136. package/types/extension-manifest.ts +64 -0
  137. package/types/index.ts +21 -0
  138. package/CHANGELOG.md +0 -3515
  139. package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
  140. package/build/lib/cli/npm.js +0 -206
  141. package/build/lib/cli/parser-helpers.js +0 -82
  142. package/build/lib/driver-config.js +0 -77
  143. package/build/lib/drivers.js +0 -96
  144. package/build/lib/extension-config.js +0 -253
  145. package/build/lib/plugin-config.js +0 -59
  146. package/build/lib/plugins.js +0 -14
  147. package/lib/cli/npm.js +0 -183
  148. package/lib/cli/parser-helpers.js +0 -79
  149. package/lib/driver-config.js +0 -46
  150. package/lib/drivers.js +0 -81
  151. package/lib/extension-config.js +0 -209
  152. package/lib/plugin-config.js +0 -34
  153. package/lib/plugins.js +0 -10
package/build/lib/main.js CHANGED
@@ -1,14 +1,38 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
3
 
4
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
5
-
6
4
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
7
5
 
8
6
  Object.defineProperty(exports, "__esModule", {
9
7
  value: true
10
8
  });
9
+ Object.defineProperty(exports, "finalizeSchema", {
10
+ enumerable: true,
11
+ get: function () {
12
+ return _schema.finalizeSchema;
13
+ }
14
+ });
15
+ Object.defineProperty(exports, "getSchema", {
16
+ enumerable: true,
17
+ get: function () {
18
+ return _schema.getSchema;
19
+ }
20
+ });
21
+ exports.init = init;
11
22
  exports.main = main;
23
+ Object.defineProperty(exports, "readConfigFile", {
24
+ enumerable: true,
25
+ get: function () {
26
+ return _configFile.readConfigFile;
27
+ }
28
+ });
29
+ exports.resolveAppiumHome = void 0;
30
+ Object.defineProperty(exports, "validate", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _schema.validate;
34
+ }
35
+ });
12
36
 
13
37
  require("source-map-support/register");
14
38
 
@@ -16,57 +40,55 @@ var _logsink = require("./logsink");
16
40
 
17
41
  var _logger = _interopRequireDefault(require("./logger"));
18
42
 
19
- var _lodash = _interopRequireDefault(require("lodash"));
43
+ var _baseDriver = require("@appium/base-driver");
20
44
 
21
- var _appiumBaseDriver = require("appium-base-driver");
45
+ var _support = require("@appium/support");
22
46
 
23
47
  var _asyncbox = require("asyncbox");
24
48
 
25
- var _parser = _interopRequireWildcard(require("./cli/parser"));
49
+ var _lodash = _interopRequireDefault(require("lodash"));
50
+
51
+ var _appium = require("./appium");
26
52
 
27
- var _args = require("./cli/args");
53
+ var _extension = require("./cli/extension");
28
54
 
29
- var _appiumSupport = require("appium-support");
55
+ var _parser = require("./cli/parser");
30
56
 
31
57
  var _config = require("./config");
32
58
 
33
- var _driverConfig = _interopRequireDefault(require("./driver-config"));
59
+ var _configFile = require("./config-file");
34
60
 
35
- var _pluginConfig = _interopRequireDefault(require("./plugin-config"));
61
+ var _extension2 = require("./extension");
36
62
 
37
- var _extensionConfig = require("./extension-config");
38
-
39
- var _extension = require("./cli/extension");
40
-
41
- var _appium = require("./appium");
63
+ var _constants = require("./constants");
42
64
 
43
65
  var _gridRegister = _interopRequireDefault(require("./grid-register"));
44
66
 
67
+ var _schema = require("./schema/schema");
68
+
45
69
  var _utils = require("./utils");
46
70
 
47
- async function preflightChecks({
48
- parser,
49
- args,
50
- driverConfig,
51
- pluginConfig,
52
- throwInsteadOfExit = false
53
- }) {
71
+ const {
72
+ resolveAppiumHome
73
+ } = _support.env;
74
+ exports.resolveAppiumHome = resolveAppiumHome;
75
+
76
+ async function preflightChecks(args, throwInsteadOfExit = false) {
54
77
  try {
55
78
  (0, _config.checkNodeOk)();
79
+ await (0, _config.checkNpmOk)();
56
80
 
57
81
  if (args.longStacktrace) {
58
82
  require('longjohn').async_trace_limit = -1;
59
83
  }
60
84
 
61
- if (args.showConfig) {
62
- await (0, _config.showConfig)();
85
+ if (args.showBuildInfo) {
86
+ await (0, _config.showBuildInfo)();
63
87
  process.exit(0);
64
88
  }
65
89
 
66
90
  (0, _config.warnNodeDeprecations)();
67
- (0, _config.validateServerArgs)(parser, args);
68
- await driverConfig.read();
69
- await pluginConfig.read();
91
+ (0, _schema.validate)(args);
70
92
 
71
93
  if (args.tmpDir) {
72
94
  await (0, _config.validateTmpDir)(args.tmpDir);
@@ -85,16 +107,16 @@ async function preflightChecks({
85
107
  function logNonDefaultArgsWarning(args) {
86
108
  _logger.default.info('Non-default server args:');
87
109
 
88
- (0, _utils.inspectObject)(args);
110
+ (0, _utils.inspect)(args);
89
111
  }
90
112
 
91
113
  function logDefaultCapabilitiesWarning(caps) {
92
114
  _logger.default.info('Default capabilities, which will be added to each request ' + 'unless overridden by desired capabilities:');
93
115
 
94
- (0, _utils.inspectObject)(caps);
116
+ (0, _utils.inspect)(caps);
95
117
  }
96
118
 
97
- async function logStartupInfo(parser, args) {
119
+ async function logStartupInfo(args) {
98
120
  let welcome = `Welcome to Appium v${_config.APPIUM_VER}`;
99
121
  let appiumRev = await (0, _config.getGitRev)();
100
122
 
@@ -104,7 +126,7 @@ async function logStartupInfo(parser, args) {
104
126
 
105
127
  _logger.default.info(welcome);
106
128
 
107
- let showArgs = (0, _config.getNonDefaultArgs)(parser, args);
129
+ let showArgs = (0, _config.getNonDefaultServerArgs)(args);
108
130
 
109
131
  if (_lodash.default.size(showArgs)) {
110
132
  logNonDefaultArgsWarning(showArgs);
@@ -121,88 +143,160 @@ function logServerPort(address, port) {
121
143
  _logger.default.info(logMessage);
122
144
  }
123
145
 
124
- async function main(args = null) {
125
- let parser = (0, _parser.default)();
146
+ function getServerUpdaters(driverClasses, pluginClasses) {
147
+ return _lodash.default.compact(_lodash.default.map([...driverClasses.keys(), ...pluginClasses.keys()], 'updateServer'));
148
+ }
149
+
150
+ function getExtraMethodMap(driverClasses, pluginClasses) {
151
+ return [...driverClasses.keys(), ...pluginClasses.keys()].reduce((map, klass) => ({ ...map,
152
+ ...(klass.newMethodMap ?? {})
153
+ }), {});
154
+ }
155
+
156
+ function areServerCommandArgs(args) {
157
+ return args.subcommand === _constants.SERVER_SUBCOMMAND;
158
+ }
159
+
160
+ async function init(args) {
161
+ const appiumHome = (args === null || args === void 0 ? void 0 : args.appiumHome) ?? (await resolveAppiumHome());
162
+ const {
163
+ driverConfig,
164
+ pluginConfig
165
+ } = await (0, _extension2.loadExtensions)(appiumHome);
166
+ const parser = (0, _parser.getParser)();
126
167
  let throwInsteadOfExit = false;
168
+ let preConfigArgs;
127
169
 
128
170
  if (args) {
129
- args = Object.assign({}, (0, _parser.getDefaultServerArgs)(), args);
130
-
131
171
  if (args.throwInsteadOfExit) {
132
172
  throwInsteadOfExit = true;
133
173
  delete args.throwInsteadOfExit;
134
174
  }
175
+
176
+ preConfigArgs = { ...args,
177
+ subcommand: args.subcommand ?? _constants.SERVER_SUBCOMMAND
178
+ };
135
179
  } else {
136
- args = parser.parseArgs();
180
+ preConfigArgs = parser.parseArgs();
137
181
  }
138
182
 
139
- await (0, _logsink.init)(args);
183
+ const configResult = await (0, _configFile.readConfigFile)(preConfigArgs.configFile);
140
184
 
141
- if (args.subcommand === _extensionConfig.DRIVER_TYPE || args.subcommand === _extensionConfig.PLUGIN_TYPE) {
142
- await (0, _extension.runExtensionCommand)(args, args.subcommand);
143
- process.exit();
185
+ if (!_lodash.default.isEmpty(configResult.errors)) {
186
+ throw new Error(`Errors in config file ${configResult.filepath}:\n ${configResult.reason ?? configResult.errors}`);
144
187
  }
145
188
 
146
- if (args.logFilters) {
147
- const {
148
- issues,
149
- rules
150
- } = await _appiumSupport.logger.loadSecureValuesPreprocessingRules(args.logFilters);
189
+ if (areServerCommandArgs(preConfigArgs)) {
190
+ var _configResult$config;
191
+
192
+ const defaults = (0, _schema.getDefaultsForSchema)(false);
193
+
194
+ const serverArgs = _lodash.default.defaultsDeep(preConfigArgs, (_configResult$config = configResult.config) === null || _configResult$config === void 0 ? void 0 : _configResult$config.server, defaults);
151
195
 
152
- if (!_lodash.default.isEmpty(issues)) {
153
- throw new Error(`The log filtering rules config '${args.logFilters}' has issues: ` + JSON.stringify(issues, null, 2));
196
+ if (preConfigArgs.showConfig) {
197
+ (0, _config.showConfig)((0, _config.getNonDefaultServerArgs)(preConfigArgs), configResult, defaults, serverArgs);
198
+ return {};
154
199
  }
155
200
 
156
- if (_lodash.default.isEmpty(rules)) {
157
- _logger.default.warn(`Found no log filtering rules in '${args.logFilters}'. Is that expected?`);
158
- } else {
159
- _logger.default.info(`Loaded ${_appiumSupport.util.pluralize('filtering rule', rules.length, true)} from '${args.logFilters}'`);
201
+ await (0, _logsink.init)(serverArgs);
202
+
203
+ if (serverArgs.logFilters) {
204
+ const {
205
+ issues,
206
+ rules
207
+ } = await _support.logger.loadSecureValuesPreprocessingRules(serverArgs.logFilters);
208
+
209
+ if (!_lodash.default.isEmpty(issues)) {
210
+ throw new Error(`The log filtering rules config '${serverArgs.logFilters}' has issues: ` + JSON.stringify(issues, null, 2));
211
+ }
212
+
213
+ if (_lodash.default.isEmpty(rules)) {
214
+ _logger.default.warn(`Found no log filtering rules in '${serverArgs.logFilters}'. Is that expected?`);
215
+ } else {
216
+ _logger.default.info(`Loaded ${_support.util.pluralize('filtering rule', rules.length, true)} from '${serverArgs.logFilters}'`);
217
+ }
160
218
  }
219
+
220
+ const appiumDriver = new _appium.AppiumDriver(serverArgs);
221
+ appiumDriver.driverConfig = driverConfig;
222
+ await preflightChecks(serverArgs, throwInsteadOfExit);
223
+ return {
224
+ appiumDriver,
225
+ parsedArgs: serverArgs,
226
+ driverConfig,
227
+ pluginConfig
228
+ };
229
+ } else {
230
+ const extensionCommandArgs = preConfigArgs;
231
+
232
+ if (preConfigArgs.subcommand === _constants.DRIVER_TYPE) {
233
+ await (0, _extension.runExtensionCommand)(extensionCommandArgs, driverConfig);
234
+ return {};
235
+ }
236
+
237
+ if (preConfigArgs.subcommand === _constants.PLUGIN_TYPE) {
238
+ await (0, _extension.runExtensionCommand)(extensionCommandArgs, pluginConfig);
239
+ return {};
240
+ }
241
+
242
+ return {};
161
243
  }
244
+ }
162
245
 
163
- let appiumDriver = new _appium.AppiumDriver(args);
164
- const driverConfig = new _driverConfig.default(args.appiumHome);
165
- const pluginConfig = new _pluginConfig.default(args.appiumHome);
166
- appiumDriver.driverConfig = driverConfig;
167
- await preflightChecks({
168
- parser,
169
- args,
170
- driverConfig,
246
+ async function main(args) {
247
+ const {
248
+ appiumDriver,
249
+ parsedArgs,
171
250
  pluginConfig,
172
- throwInsteadOfExit
173
- });
174
- await logStartupInfo(parser, args);
175
- let routeConfiguringFunction = (0, _appiumBaseDriver.routeConfiguringFunction)(appiumDriver);
176
- const plugins = Object.keys(pluginConfig.installedExtensions).filter(pluginName => _lodash.default.includes(args.plugins, pluginName) || args.plugins.length === 1 && args.plugins[0] === _args.USE_ALL_PLUGINS).map(pluginName => {
177
- try {
178
- const PluginClass = pluginConfig.require(pluginName);
179
-
180
- return new PluginClass(pluginName);
181
- } catch (err) {
182
- _logger.default.error(`Could not load plugin '${pluginName}', so it will not be available. Error ` + `in loading the plugin was: ${err}`);
183
-
184
- return false;
185
- }
186
- }).filter(Boolean);
187
- appiumDriver.plugins = plugins;
188
- let server = await (0, _appiumBaseDriver.server)({
251
+ driverConfig
252
+ } = await init(args);
253
+
254
+ if (!appiumDriver || !parsedArgs || !pluginConfig || !driverConfig) {
255
+ return;
256
+ }
257
+
258
+ const pluginClasses = (0, _extension2.getActivePlugins)(pluginConfig, parsedArgs.usePlugins);
259
+ appiumDriver.pluginClasses = pluginClasses;
260
+ await logStartupInfo(parsedArgs);
261
+ let routeConfiguringFunction = (0, _baseDriver.routeConfiguringFunction)(appiumDriver);
262
+ const driverClasses = (0, _extension2.getActiveDrivers)(driverConfig, parsedArgs.useDrivers);
263
+ const serverUpdaters = getServerUpdaters(driverClasses, pluginClasses);
264
+ const extraMethodMap = getExtraMethodMap(driverClasses, pluginClasses);
265
+ const serverOpts = {
189
266
  routeConfiguringFunction,
190
- port: args.port,
191
- hostname: args.address,
192
- allowCors: args.allowCors,
193
- basePath: args.basePath,
194
- plugins
195
- });
196
-
197
- if (args.allowCors) {
267
+ port: parsedArgs.port,
268
+ hostname: parsedArgs.address,
269
+ allowCors: parsedArgs.allowCors,
270
+ basePath: parsedArgs.basePath,
271
+ serverUpdaters,
272
+ extraMethodMap
273
+ };
274
+
275
+ if (parsedArgs.keepAliveTimeout) {
276
+ serverOpts.keepAliveTimeout = parsedArgs.keepAliveTimeout * 1000;
277
+ }
278
+
279
+ let server;
280
+
281
+ try {
282
+ server = await (0, _baseDriver.server)(serverOpts);
283
+ } catch (err) {
284
+ _logger.default.error(`Could not configure Appium server. It's possible that a driver or plugin tried ` + `to update the server and failed. Original error: ${err.message}`);
285
+
286
+ _logger.default.debug(err.stack);
287
+
288
+ return process.exit(1);
289
+ }
290
+
291
+ if (parsedArgs.allowCors) {
198
292
  _logger.default.warn('You have enabled CORS requests from any host. Be careful not ' + 'to visit sites which could maliciously try to start Appium ' + 'sessions on your machine');
199
293
  }
200
294
 
201
295
  appiumDriver.server = server;
202
296
 
203
297
  try {
204
- if (args.nodeconfig !== null) {
205
- await (0, _gridRegister.default)(args.nodeconfig, args.address, args.port, args.basePath);
298
+ if (parsedArgs.nodeconfig) {
299
+ await (0, _gridRegister.default)(parsedArgs.nodeconfig, parsedArgs.address, parsedArgs.port, parsedArgs.basePath);
206
300
  }
207
301
  } catch (err) {
208
302
  await server.close();
@@ -228,15 +322,13 @@ async function main(args = null) {
228
322
  });
229
323
  }
230
324
 
231
- logServerPort(args.address, args.port);
325
+ logServerPort(parsedArgs.address, parsedArgs.port);
232
326
  driverConfig.print();
233
- pluginConfig.print(plugins);
327
+ pluginConfig.print([...pluginClasses.values()]);
234
328
  return server;
235
329
  }
236
330
 
237
331
  if (require.main === module) {
238
332
  (0, _asyncbox.asyncify)(main);
239
- }require('source-map-support').install();
240
-
241
-
242
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9tYWluLmpzIl0sIm5hbWVzIjpbInByZWZsaWdodENoZWNrcyIsInBhcnNlciIsImFyZ3MiLCJkcml2ZXJDb25maWciLCJwbHVnaW5Db25maWciLCJ0aHJvd0luc3RlYWRPZkV4aXQiLCJsb25nU3RhY2t0cmFjZSIsInJlcXVpcmUiLCJhc3luY190cmFjZV9saW1pdCIsInNob3dDb25maWciLCJwcm9jZXNzIiwiZXhpdCIsInJlYWQiLCJ0bXBEaXIiLCJlcnIiLCJsb2dnZXIiLCJlcnJvciIsIm1lc3NhZ2UiLCJyZWQiLCJsb2dOb25EZWZhdWx0QXJnc1dhcm5pbmciLCJpbmZvIiwibG9nRGVmYXVsdENhcGFiaWxpdGllc1dhcm5pbmciLCJjYXBzIiwibG9nU3RhcnR1cEluZm8iLCJ3ZWxjb21lIiwiQVBQSVVNX1ZFUiIsImFwcGl1bVJldiIsInNob3dBcmdzIiwiXyIsInNpemUiLCJpc0VtcHR5IiwiZGVmYXVsdENhcGFiaWxpdGllcyIsImxvZ1NlcnZlclBvcnQiLCJhZGRyZXNzIiwicG9ydCIsImxvZ01lc3NhZ2UiLCJtYWluIiwiT2JqZWN0IiwiYXNzaWduIiwicGFyc2VBcmdzIiwic3ViY29tbWFuZCIsIkRSSVZFUl9UWVBFIiwiUExVR0lOX1RZUEUiLCJsb2dGaWx0ZXJzIiwiaXNzdWVzIiwicnVsZXMiLCJsb2dGYWN0b3J5IiwibG9hZFNlY3VyZVZhbHVlc1ByZXByb2Nlc3NpbmdSdWxlcyIsIkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsIndhcm4iLCJ1dGlsIiwicGx1cmFsaXplIiwibGVuZ3RoIiwiYXBwaXVtRHJpdmVyIiwiQXBwaXVtRHJpdmVyIiwiRHJpdmVyQ29uZmlnIiwiYXBwaXVtSG9tZSIsIlBsdWdpbkNvbmZpZyIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsInBsdWdpbnMiLCJrZXlzIiwiaW5zdGFsbGVkRXh0ZW5zaW9ucyIsImZpbHRlciIsInBsdWdpbk5hbWUiLCJpbmNsdWRlcyIsIlVTRV9BTExfUExVR0lOUyIsIm1hcCIsIlBsdWdpbkNsYXNzIiwiQm9vbGVhbiIsInNlcnZlciIsImhvc3RuYW1lIiwiYWxsb3dDb3JzIiwiYmFzZVBhdGgiLCJub2RlY29uZmlnIiwiY2xvc2UiLCJzaWduYWwiLCJvbmNlIiwib25TaWduYWwiLCJkZWxldGVBbGxTZXNzaW9ucyIsImZvcmNlIiwicmVhc29uIiwiZSIsInByaW50IiwibW9kdWxlIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxlQUFlQSxlQUFmLENBQWdDO0FBQUNDLEVBQUFBLE1BQUQ7QUFBU0MsRUFBQUEsSUFBVDtBQUFlQyxFQUFBQSxZQUFmO0FBQTZCQyxFQUFBQSxZQUE3QjtBQUEyQ0MsRUFBQUEsa0JBQWtCLEdBQUc7QUFBaEUsQ0FBaEMsRUFBd0c7QUFDdEcsTUFBSTtBQUNGOztBQUNBLFFBQUlILElBQUksQ0FBQ0ksY0FBVCxFQUF5QjtBQUN2QkMsTUFBQUEsT0FBTyxDQUFDLFVBQUQsQ0FBUCxDQUFvQkMsaUJBQXBCLEdBQXdDLENBQUMsQ0FBekM7QUFDRDs7QUFDRCxRQUFJTixJQUFJLENBQUNPLFVBQVQsRUFBcUI7QUFDbkIsWUFBTSx5QkFBTjtBQUNBQyxNQUFBQSxPQUFPLENBQUNDLElBQVIsQ0FBYSxDQUFiO0FBQ0Q7O0FBQ0Q7QUFDQSxvQ0FBbUJWLE1BQW5CLEVBQTJCQyxJQUEzQjtBQUNBLFVBQU1DLFlBQVksQ0FBQ1MsSUFBYixFQUFOO0FBQ0EsVUFBTVIsWUFBWSxDQUFDUSxJQUFiLEVBQU47O0FBQ0EsUUFBSVYsSUFBSSxDQUFDVyxNQUFULEVBQWlCO0FBQ2YsWUFBTSw0QkFBZVgsSUFBSSxDQUFDVyxNQUFwQixDQUFOO0FBQ0Q7QUFDRixHQWhCRCxDQWdCRSxPQUFPQyxHQUFQLEVBQVk7QUFDWkMsb0JBQU9DLEtBQVAsQ0FBYUYsR0FBRyxDQUFD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akQsSUFBVDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuLy8gdHJhbnNwaWxlOm1haW5cblxuaW1wb3J0IHsgaW5pdCBhcyBsb2dzaW5rSW5pdCB9IGZyb20gJy4vbG9nc2luayc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJzsgLy8gbG9nZ2VyIG5lZWRzIHRvIHJlbWFpbiBmaXJzdCBvZiBpbXBvcnRzXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgc2VydmVyIGFzIGJhc2VTZXJ2ZXIsIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiBhcyBtYWtlUm91dGVyIH0gZnJvbSAnYXBwaXVtLWJhc2UtZHJpdmVyJztcbmltcG9ydCB7IGFzeW5jaWZ5IH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBnZXRQYXJzZXIsIGdldERlZmF1bHRTZXJ2ZXJBcmdzIH0gZnJvbSAnLi9jbGkvcGFyc2VyJztcbmltcG9ydCB7IFVTRV9BTExfUExVR0lOUyB9IGZyb20gJy4vY2xpL2FyZ3MnO1xuaW1wb3J0IHsgbG9nZ2VyIGFzIGxvZ0ZhY3RvcnksIHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQge1xuICBzaG93Q29uZmlnLCBjaGVja05vZGVPaywgdmFsaWRhdGVTZXJ2ZXJBcmdzLFxuICB3YXJuTm9kZURlcHJlY2F0aW9ucywgdmFsaWRhdGVUbXBEaXIsIGdldE5vbkRlZmF1bHRBcmdzLFxuICBnZXRHaXRSZXYsIEFQUElVTV9WRVJcbn0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IERyaXZlckNvbmZpZyBmcm9tICcuL2RyaXZlci1jb25maWcnO1xuaW1wb3J0IFBsdWdpbkNvbmZpZyBmcm9tICcuL3BsdWdpbi1jb25maWcnO1xuaW1wb3J0IHsgRFJJVkVSX1RZUEUsIFBMVUdJTl9UWVBFIH0gZnJvbSAnLi9leHRlbnNpb24tY29uZmlnJztcbmltcG9ydCB7IHJ1bkV4dGVuc2lvbkNvbW1hbmQgfSBmcm9tICcuL2NsaS9leHRlbnNpb24nO1xuaW1wb3J0IHsgQXBwaXVtRHJpdmVyIH0gZnJvbSAnLi9hcHBpdW0nO1xuaW1wb3J0IHJlZ2lzdGVyTm9kZSBmcm9tICcuL2dyaWQtcmVnaXN0ZXInO1xuaW1wb3J0IHsgaW5zcGVjdE9iamVjdCB9IGZyb20gJy4vdXRpbHMnO1xuXG5cbmFzeW5jIGZ1bmN0aW9uIHByZWZsaWdodENoZWNrcyAoe3BhcnNlciwgYXJncywgZHJpdmVyQ29uZmlnLCBwbHVnaW5Db25maWcsIHRocm93SW5zdGVhZE9mRXhpdCA9IGZhbHNlfSkge1xuICB0cnkge1xuICAgIGNoZWNrTm9kZU9rKCk7XG4gICAgaWYgKGFyZ3MubG9uZ1N0YWNrdHJhY2UpIHtcbiAgICAgIHJlcXVpcmUoJ2xvbmdqb2huJykuYXN5bmNfdHJhY2VfbGltaXQgPSAtMTtcbiAgICB9XG4gICAgaWYgKGFyZ3Muc2hvd0NvbmZpZykge1xuICAgICAgYXdhaXQgc2hvd0NvbmZpZygpO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cbiAgICB3YXJuTm9kZURlcHJlY2F0aW9ucygpO1xuICAgIHZhbGlkYXRlU2VydmVyQXJncyhwYXJzZXIsIGFyZ3MpO1xuICAgIGF3YWl0IGRyaXZlckNvbmZpZy5yZWFkKCk7XG4gICAgYXdhaXQgcGx1Z2luQ29uZmlnLnJlYWQoKTtcbiAgICBpZiAoYXJncy50bXBEaXIpIHtcbiAgICAgIGF3YWl0IHZhbGlkYXRlVG1wRGlyKGFyZ3MudG1wRGlyKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5lcnJvcihlcnIubWVzc2FnZS5yZWQpO1xuICAgIGlmICh0aHJvd0luc3RlYWRPZkV4aXQpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbG9nTm9uRGVmYXVsdEFyZ3NXYXJuaW5nIChhcmdzKSB7XG4gIGxvZ2dlci5pbmZvKCdOb24tZGVmYXVsdCBzZXJ2ZXIgYXJnczonKTtcbiAgaW5zcGVjdE9iamVjdChhcmdzKTtcbn1cblxuZnVuY3Rpb24gbG9nRGVmYXVsdENhcGFiaWxpdGllc1dhcm5pbmcgKGNhcHMpIHtcbiAgbG9nZ2VyLmluZm8oJ0RlZmF1bHQgY2FwYWJpbGl0aWVzLCB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIGVhY2ggcmVxdWVzdCAnICtcbiAgICAgICAgICAgICAgJ3VubGVzcyBvdmVycmlkZGVuIGJ5IGRlc2lyZWQgY2FwYWJpbGl0aWVzOicpO1xuICBpbnNwZWN0T2JqZWN0KGNhcHMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2dTdGFydHVwSW5mbyAocGFyc2VyLCBhcmdzKSB7XG4gIGxldCB3ZWxjb21lID0gYFdlbGNvbWUgdG8gQXBwaXVtIHYke0FQUElVTV9WRVJ9YDtcbiAgbGV0IGFwcGl1bVJldiA9IGF3YWl0IGdldEdpdFJldigpO1xuICBpZiAoYXBwaXVtUmV2KSB7XG4gICAgd2VsY29tZSArPSBgIChSRVYgJHthcHBpdW1SZXZ9KWA7XG4gIH1cbiAgbG9nZ2VyLmluZm8od2VsY29tZSk7XG5cbiAgbGV0IHNob3dBcmdzID0gZ2V0Tm9uRGVmYXVsdEFyZ3MocGFyc2VyLCBhcmdzKTtcbiAgaWYgKF8uc2l6ZShzaG93QXJncykpIHtcbiAgICBsb2dOb25EZWZhdWx0QXJnc1dhcm5pbmcoc2hvd0FyZ3MpO1xuICB9XG4gIGlmICghXy5pc0VtcHR5KGFyZ3MuZGVmYXVsdENhcGFiaWxpdGllcykpIHtcbiAgICBsb2dEZWZhdWx0Q2FwYWJpbGl0aWVzV2FybmluZyhhcmdzLmRlZmF1bHRDYXBhYmlsaXRpZXMpO1xuICB9XG4gIC8vIFRPRE86IGJyaW5nIGJhY2sgbG9nbGV2ZWwgcmVwb3J0aW5nIGJlbG93IG9uY2UgbG9nZ2VyIGlzIGZsdXNoZWQgb3V0XG4gIC8vIGxvZ2dlci5pbmZvKCdDb25zb2xlIExvZ0xldmVsOiAnICsgbG9nZ2VyLnRyYW5zcG9ydHMuY29uc29sZS5sZXZlbCk7XG4gIC8vIGlmIChsb2dnZXIudHJhbnNwb3J0cy5maWxlKSB7XG4gIC8vICAgbG9nZ2VyLmluZm8oJ0ZpbGUgTG9nTGV2ZWw6ICcgKyBsb2dnZXIudHJhbnNwb3J0cy5maWxlLmxldmVsKTtcbiAgLy8gfVxufVxuXG5mdW5jdGlvbiBsb2dTZXJ2ZXJQb3J0IChhZGRyZXNzLCBwb3J0KSB7XG4gIGxldCBsb2dNZXNzYWdlID0gYEFwcGl1bSBSRVNUIGh0dHAgaW50ZXJmYWNlIGxpc3RlbmVyIHN0YXJ0ZWQgb24gYCArXG4gICAgICAgICAgICAgICAgICAgYCR7YWRkcmVzc306JHtwb3J0fWA7XG4gIGxvZ2dlci5pbmZvKGxvZ01lc3NhZ2UpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtYWluIChhcmdzID0gbnVsbCkge1xuICBsZXQgcGFyc2VyID0gZ2V0UGFyc2VyKCk7XG4gIGxldCB0aHJvd0luc3RlYWRPZkV4aXQgPSBmYWxzZTtcbiAgaWYgKGFyZ3MpIHtcbiAgICAvLyBhIGNvbnRhaW5pbmcgcGFja2FnZSBwYXNzZWQgaW4gdGhlaXIgb3duIGFyZ3MsIGxldCdzIGZpbGwgdGhlbSBvdXRcbiAgICAvLyB3aXRoIGRlZmF1bHRzXG4gICAgYXJncyA9IE9iamVjdC5hc3NpZ24oe30sIGdldERlZmF1bHRTZXJ2ZXJBcmdzKCksIGFyZ3MpO1xuXG4gICAgLy8gaWYgd2UgaGF2ZSBhIGNvbnRhaW5pbmcgcGFja2FnZSBpbnN0ZWFkIG9mIHJ1bm5pbmcgYXMgYSBDTEkgcHJvY2VzcyxcbiAgICAvLyB0aGF0IHBhY2thZ2UgbWlnaHQgbm90IGFwcHJlY2lhdGUgdXMgY2FsbGluZyAncHJvY2Vzcy5leGl0JyB3aWxseS1cbiAgICAvLyBuaWxseSwgc28gZ2l2ZSBpdCB0aGUgb3B0aW9uIHRvIGhhdmUgdXMgdGhyb3cgaW5zdGVhZCBvZiBleGl0XG4gICAgaWYgKGFyZ3MudGhyb3dJbnN0ZWFkT2ZFeGl0KSB7XG4gICAgICB0aHJvd0luc3RlYWRPZkV4aXQgPSB0cnVlO1xuICAgICAgLy8gYnV0IHJlbW92ZSBpdCBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgc2VydmVyIGFyZyBwZXIgc2VcbiAgICAgIGRlbGV0ZSBhcmdzLnRocm93SW5zdGVhZE9mRXhpdDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gb3RoZXJ3aXNlIHBhcnNlIGZyb20gQ0xJXG4gICAgYXJncyA9IHBhcnNlci5wYXJzZUFyZ3MoKTtcbiAgfVxuICBhd2FpdCBsb2dzaW5rSW5pdChhcmdzKTtcblxuICAvLyBpZiB0aGUgdXNlciBoYXMgcmVxdWVzdGVkIHRoZSAnZHJpdmVyJyBDTEksIGRvbid0IHJ1biB0aGUgbm9ybWFsIHNlcnZlcixcbiAgLy8gYnV0IGluc3RlYWQgcGFzcyBjb250cm9sIHRvIHRoZSBkcml2ZXIgQ0xJXG4gIGlmIChhcmdzLnN1YmNvbW1hbmQgPT09IERSSVZFUl9UWVBFIHx8IGFyZ3Muc3ViY29tbWFuZCA9PT0gUExVR0lOX1RZUEUpIHtcbiAgICBhd2FpdCBydW5FeHRlbnNpb25Db21tYW5kKGFyZ3MsIGFyZ3Muc3ViY29tbWFuZCk7XG4gICAgcHJvY2Vzcy5leGl0KCk7XG4gIH1cblxuICBpZiAoYXJncy5sb2dGaWx0ZXJzKSB7XG4gICAgY29uc3Qge2lzc3VlcywgcnVsZXN9ID0gYXdhaXQgbG9nRmFjdG9yeS5sb2FkU2VjdXJlVmFsdWVzUHJlcHJvY2Vzc2luZ1J1bGVzKGFyZ3MubG9nRmlsdGVycyk7XG4gICAgaWYgKCFfLmlzRW1wdHkoaXNzdWVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgbG9nIGZpbHRlcmluZyBydWxlcyBjb25maWcgJyR7YXJncy5sb2dGaWx0ZXJzfScgaGFzIGlzc3VlczogYCArXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGlzc3VlcywgbnVsbCwgMikpO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KHJ1bGVzKSkge1xuICAgICAgbG9nZ2VyLndhcm4oYEZvdW5kIG5vIGxvZyBmaWx0ZXJpbmcgcnVsZXMgaW4gJyR7YXJncy5sb2dGaWx0ZXJzfScuIElzIHRoYXQgZXhwZWN0ZWQ/YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBMb2FkZWQgJHt1dGlsLnBsdXJhbGl6ZSgnZmlsdGVyaW5nIHJ1bGUnLCBydWxlcy5sZW5ndGgsIHRydWUpfSBmcm9tICcke2FyZ3MubG9nRmlsdGVyc30nYCk7XG4gICAgfVxuICB9XG5cbiAgbGV0IGFwcGl1bURyaXZlciA9IG5ldyBBcHBpdW1Ecml2ZXIoYXJncyk7XG4gIGNvbnN0IGRyaXZlckNvbmZpZyA9IG5ldyBEcml2ZXJDb25maWcoYXJncy5hcHBpdW1Ib21lKTtcbiAgY29uc3QgcGx1Z2luQ29uZmlnID0gbmV3IFBsdWdpbkNvbmZpZyhhcmdzLmFwcGl1bUhvbWUpO1xuICBhcHBpdW1Ecml2ZXIuZHJpdmVyQ29uZmlnID0gZHJpdmVyQ29uZmlnO1xuICBhd2FpdCBwcmVmbGlnaHRDaGVja3Moe3BhcnNlciwgYXJncywgZHJpdmVyQ29uZmlnLCBwbHVnaW5Db25maWcsIHRocm93SW5zdGVhZE9mRXhpdH0pO1xuICBhd2FpdCBsb2dTdGFydHVwSW5mbyhwYXJzZXIsIGFyZ3MpO1xuICBsZXQgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uID0gbWFrZVJvdXRlcihhcHBpdW1Ecml2ZXIpO1xuXG4gIC8vIGZpbmQgYW55IHBsdWdpbiBuYW1lIHdoaWNoIGhhcyBiZWVuIGluc3RhbGxlZCwgYW5kIHdoaWNoIGhhcyBiZWVuIHJlcXVlc3RlZCBmb3IgYWN0aXZhdGlvbiBieVxuICAvLyB1c2luZyB0aGUgLS1wbHVnaW5zIGZsYWcsIGFuZCB0dXJuIGVhY2ggb25lIGludG8gYW4gaW5zdGFudGlhdGVkIHBsdWdpbiBvYmplY3QsIHNvIHdlIGNhbiBzZW5kXG4gIC8vIHRoZW0gYXMgb2JqZWN0cyB0byB0aGUgc2VydmVyIGluaXQuIHdlIGFsc28gd2FudCB0byBzZW5kL2Fzc2lnbiB0aGVtIHRvIHRoZSB1bWJyZWxsYSBkcml2ZXIgc29cbiAgLy8gaXQgY2FuIHVzZSB0aGVtIHRvIHdyYXAgY29tbWFuZCBleGVjdXRpb25cbiAgY29uc3QgcGx1Z2lucyA9IE9iamVjdC5rZXlzKHBsdWdpbkNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zKS5maWx0ZXIoKHBsdWdpbk5hbWUpID0+XG4gICAgXy5pbmNsdWRlcyhhcmdzLnBsdWdpbnMsIHBsdWdpbk5hbWUpIHx8XG4gICAgKGFyZ3MucGx1Z2lucy5sZW5ndGggPT09IDEgJiYgYXJncy5wbHVnaW5zWzBdID09PSBVU0VfQUxMX1BMVUdJTlMpXG4gICkubWFwKChwbHVnaW5OYW1lKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFBsdWdpbkNsYXNzID0gcGx1Z2luQ29uZmlnLnJlcXVpcmUocGx1Z2luTmFtZSk7XG4gICAgICByZXR1cm4gbmV3IFBsdWdpbkNsYXNzKHBsdWdpbk5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBDb3VsZCBub3QgbG9hZCBwbHVnaW4gJyR7cGx1Z2luTmFtZX0nLCBzbyBpdCB3aWxsIG5vdCBiZSBhdmFpbGFibGUuIEVycm9yIGAgK1xuICAgICAgICAgICAgICAgICAgIGBpbiBsb2FkaW5nIHRoZSBwbHVnaW4gd2FzOiAke2Vycn1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pLmZpbHRlcihCb29sZWFuKTtcbiAgYXBwaXVtRHJpdmVyLnBsdWdpbnMgPSBwbHVnaW5zO1xuXG4gIGxldCBzZXJ2ZXIgPSBhd2FpdCBiYXNlU2VydmVyKHtcbiAgICByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24sXG4gICAgcG9ydDogYXJncy5wb3J0LFxuICAgIGhvc3RuYW1lOiBhcmdzLmFkZHJlc3MsXG4gICAgYWxsb3dDb3JzOiBhcmdzLmFsbG93Q29ycyxcbiAgICBiYXNlUGF0aDogYXJncy5iYXNlUGF0aCxcbiAgICBwbHVnaW5zLFxuICB9KTtcbiAgaWYgKGFyZ3MuYWxsb3dDb3JzKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1lvdSBoYXZlIGVuYWJsZWQgQ09SUyByZXF1ZXN0cyBmcm9tIGFueSBob3N0LiBCZSBjYXJlZnVsIG5vdCAnICtcbiAgICAgICAgICAgICAgICAndG8gdmlzaXQgc2l0ZXMgd2hpY2ggY291bGQgbWFsaWNpb3VzbHkgdHJ5IHRvIHN0YXJ0IEFwcGl1bSAnICtcbiAgICAgICAgICAgICAgICAnc2Vzc2lvbnMgb24geW91ciBtYWNoaW5lJyk7XG4gIH1cbiAgYXBwaXVtRHJpdmVyLnNlcnZlciA9IHNlcnZlcjtcbiAgdHJ5IHtcbiAgICAvLyBUT0RPIHByZWxhdW5jaCBpZiBhcmdzLmxhdW5jaCBpcyBzZXRcbiAgICAvLyBUT0RPOiBzdGFydEFsZXJ0U29ja2V0KHNlcnZlciwgYXBwaXVtU2VydmVyKTtcblxuICAgIC8vIGNvbmZpZ3VyZSBhcyBub2RlIG9uIGdyaWQsIGlmIG5lY2Vzc2FyeVxuICAgIGlmIChhcmdzLm5vZGVjb25maWcgIT09IG51bGwpIHtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyTm9kZShhcmdzLm5vZGVjb25maWcsIGFyZ3MuYWRkcmVzcywgYXJncy5wb3J0LCBhcmdzLmJhc2VQYXRoKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGF3YWl0IHNlcnZlci5jbG9zZSgpO1xuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nXSkge1xuICAgIHByb2Nlc3Mub25jZShzaWduYWwsIGFzeW5jIGZ1bmN0aW9uIG9uU2lnbmFsICgpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBSZWNlaXZlZCAke3NpZ25hbH0gLSBzaHV0dGluZyBkb3duYCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBhcHBpdW1Ecml2ZXIuZGVsZXRlQWxsU2Vzc2lvbnMoe1xuICAgICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICAgIHJlYXNvbjogYFRoZSBwcm9jZXNzIGhhcyByZWNlaXZlZCAke3NpZ25hbH0gc2lnbmFsYCxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHNlcnZlci5jbG9zZSgpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGUpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBsb2dTZXJ2ZXJQb3J0KGFyZ3MuYWRkcmVzcywgYXJncy5wb3J0KTtcbiAgZHJpdmVyQ29uZmlnLnByaW50KCk7XG4gIHBsdWdpbkNvbmZpZy5wcmludChwbHVnaW5zKTtcblxuICByZXR1cm4gc2VydmVyO1xufVxuXG5pZiAocmVxdWlyZS5tYWluID09PSBtb2R1bGUpIHtcbiAgYXN5bmNpZnkobWFpbik7XG59XG5cbmV4cG9ydCB7IG1haW4gfTtcbiJdLCJmaWxlIjoibGliL21haW4uanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
333
+ }
334
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXNvbHZlQXBwaXVtSG9tZSIsImVudiIsInByZWZsaWdodENoZWNrcyIsImFyZ3MiLCJ0aHJvd0luc3RlYWRPZkV4aXQiLCJjaGVja05vZGVPayIsImNoZWNrTnBtT2siLCJsb25nU3RhY2t0cmFjZSIsInJlcXVpcmUiLCJhc3luY190cmFjZV9saW1pdCIsInNob3dCdWlsZEluZm8iLCJwcm9jZXNzIiwiZXhpdCIsIndhcm5Ob2RlRGVwcmVjYXRpb25zIiwidmFsaWRhdGUiLCJ0bXBEaXIiLCJ2YWxpZGF0ZVRtcERpciIsImVyciIsImxvZ2dlciIsImVycm9yIiwibWVzc2FnZSIsInJlZCIsImxvZ05vbkRlZmF1bHRBcmdzV2FybmluZyIsImluZm8iLCJpbnNwZWN0IiwibG9nRGVmYXVsdENhcGFiaWxpdGllc1dhcm5pbmciLCJjYXBzIiwibG9nU3RhcnR1cEluZm8iLCJ3ZWxjb21lIiwiQVBQSVVNX1ZFUiIsImFwcGl1bVJldiIsImdldEdpdFJldiIsInNob3dBcmdzIiwiZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MiLCJfIiwic2l6ZSIsImlzRW1wdHkiLCJkZWZhdWx0Q2FwYWJpbGl0aWVzIiwibG9nU2VydmVyUG9ydCIsImFkZHJlc3MiLCJwb3J0IiwibG9nTWVzc2FnZSIsImdldFNlcnZlclVwZGF0ZXJzIiwiZHJpdmVyQ2xhc3NlcyIsInBsdWdpbkNsYXNzZXMiLCJjb21wYWN0IiwibWFwIiwia2V5cyIsImdldEV4dHJhTWV0aG9kTWFwIiwicmVkdWNlIiwia2xhc3MiLCJuZXdNZXRob2RNYXAiLCJhcmVTZXJ2ZXJDb21tYW5kQXJncyIsInN1YmNvbW1hbmQiLCJTRVJWRVJfU1VCQ09NTUFORCIsImluaXQiLCJhcHBpdW1Ib21lIiwiZHJpdmVyQ29uZmlnIiwicGx1Z2luQ29uZmlnIiwibG9hZEV4dGVuc2lvbnMiLCJwYXJzZXIiLCJnZXRQYXJzZXIiLCJwcmVDb25maWdBcmdzIiwicGFyc2VBcmdzIiwiY29uZmlnUmVzdWx0IiwicmVhZENvbmZpZ0ZpbGUiLCJjb25maWdGaWxlIiwiZXJyb3JzIiwiRXJyb3IiLCJmaWxlcGF0aCIsInJlYXNvbiIsImRlZmF1bHRzIiwiZ2V0RGVmYXVsdHNGb3JTY2hlbWEiLCJzZXJ2ZXJBcmdzIiwiZGVmYXVsdHNEZWVwIiwiY29uZmlnIiwic2VydmVyIiwic2hvd0NvbmZpZyIsImxvZ3NpbmtJbml0IiwibG9nRmlsdGVycyIsImlzc3VlcyIsInJ1bGVzIiwibG9nRmFjdG9yeSIsImxvYWRTZWN1cmVWYWx1ZXNQcmVwcm9jZXNzaW5nUnVsZXMiLCJKU09OIiwic3RyaW5naWZ5Iiwid2FybiIsInV0aWwiLCJwbHVyYWxpemUiLCJsZW5ndGgiLCJhcHBpdW1Ecml2ZXIiLCJBcHBpdW1Ecml2ZXIiLCJwYXJzZWRBcmdzIiwiZXh0ZW5zaW9uQ29tbWFuZEFyZ3MiLCJEUklWRVJfVFlQRSIsInJ1bkV4dGVuc2lvbkNvbW1hbmQiLCJQTFVHSU5fVFlQRSIsIm1haW4iLCJnZXRBY3RpdmVQbHVnaW5zIiwidXNlUGx1Z2lucyIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsIm1ha2VSb3V0ZXIiLCJnZXRBY3RpdmVEcml2ZXJzIiwidXNlRHJpdmVycyIsInNlcnZlclVwZGF0ZXJzIiwiZXh0cmFNZXRob2RNYXAiLCJzZXJ2ZXJPcHRzIiwiaG9zdG5hbWUiLCJhbGxvd0NvcnMiLCJiYXNlUGF0aCIsImtlZXBBbGl2ZVRpbWVvdXQiLCJiYXNlU2VydmVyIiwiZGVidWciLCJzdGFjayIsIm5vZGVjb25maWciLCJyZWdpc3Rlck5vZGUiLCJjbG9zZSIsInNpZ25hbCIsIm9uY2UiLCJvblNpZ25hbCIsImRlbGV0ZUFsbFNlc3Npb25zIiwiZm9yY2UiLCJlIiwicHJpbnQiLCJ2YWx1ZXMiLCJtb2R1bGUiLCJhc3luY2lmeSJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9tYWluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IHtpbml0IGFzIGxvZ3NpbmtJbml0fSBmcm9tICcuL2xvZ3NpbmsnOyAvLyB0aGlzIGltcG9ydCBuZWVkcyB0byBjb21lIGZpcnN0IHNpbmNlIGl0IHNldHMgdXAgZ2xvYmFsIG5wbWxvZ1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7IC8vIGxvZ2dlciBuZWVkcyB0byByZW1haW4gc2Vjb25kXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQge3JvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiBhcyBtYWtlUm91dGVyLCBzZXJ2ZXIgYXMgYmFzZVNlcnZlcn0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQge2xvZ2dlciBhcyBsb2dGYWN0b3J5LCB1dGlsLCBlbnZ9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQge2FzeW5jaWZ5fSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtBcHBpdW1Ecml2ZXJ9IGZyb20gJy4vYXBwaXVtJztcbmltcG9ydCB7cnVuRXh0ZW5zaW9uQ29tbWFuZH0gZnJvbSAnLi9jbGkvZXh0ZW5zaW9uJztcbmltcG9ydCB7Z2V0UGFyc2VyfSBmcm9tICcuL2NsaS9wYXJzZXInO1xuaW1wb3J0IHtcbiAgQVBQSVVNX1ZFUixcbiAgY2hlY2tOb2RlT2ssXG4gIGdldEdpdFJldixcbiAgZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MsXG4gIHNob3dDb25maWcsXG4gIHNob3dCdWlsZEluZm8sXG4gIHZhbGlkYXRlVG1wRGlyLFxuICB3YXJuTm9kZURlcHJlY2F0aW9ucyxcbiAgY2hlY2tOcG1Payxcbn0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHtyZWFkQ29uZmlnRmlsZX0gZnJvbSAnLi9jb25maWctZmlsZSc7XG5pbXBvcnQge2xvYWRFeHRlbnNpb25zLCBnZXRBY3RpdmVQbHVnaW5zLCBnZXRBY3RpdmVEcml2ZXJzfSBmcm9tICcuL2V4dGVuc2lvbic7XG5pbXBvcnQge0RSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRSwgU0VSVkVSX1NVQkNPTU1BTkR9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCByZWdpc3Rlck5vZGUgZnJvbSAnLi9ncmlkLXJlZ2lzdGVyJztcbmltcG9ydCB7Z2V0RGVmYXVsdHNGb3JTY2hlbWEsIHZhbGlkYXRlfSBmcm9tICcuL3NjaGVtYS9zY2hlbWEnO1xuaW1wb3J0IHtpbnNwZWN0fSBmcm9tICcuL3V0aWxzJztcblxuY29uc3Qge3Jlc29sdmVBcHBpdW1Ib21lfSA9IGVudjtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtQYXJzZWRBcmdzfSBhcmdzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aHJvd0luc3RlYWRPZkV4aXRdXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByZWZsaWdodENoZWNrcyhhcmdzLCB0aHJvd0luc3RlYWRPZkV4aXQgPSBmYWxzZSkge1xuICB0cnkge1xuICAgIGNoZWNrTm9kZU9rKCk7XG4gICAgYXdhaXQgY2hlY2tOcG1PaygpO1xuICAgIGlmIChhcmdzLmxvbmdTdGFja3RyYWNlKSB7XG4gICAgICByZXF1aXJlKCdsb25nam9obicpLmFzeW5jX3RyYWNlX2xpbWl0ID0gLTE7XG4gICAgfVxuICAgIGlmIChhcmdzLnNob3dCdWlsZEluZm8pIHtcbiAgICAgIGF3YWl0IHNob3dCdWlsZEluZm8oKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG4gICAgd2Fybk5vZGVEZXByZWNhdGlvbnMoKTtcblxuICAgIHZhbGlkYXRlKGFyZ3MpO1xuXG4gICAgaWYgKGFyZ3MudG1wRGlyKSB7XG4gICAgICBhd2FpdCB2YWxpZGF0ZVRtcERpcihhcmdzLnRtcERpcik7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZXJyb3IoZXJyLm1lc3NhZ2UucmVkKTtcbiAgICBpZiAodGhyb3dJbnN0ZWFkT2ZFeGl0KSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtBcmdzfSBhcmdzXG4gKi9cbmZ1bmN0aW9uIGxvZ05vbkRlZmF1bHRBcmdzV2FybmluZyhhcmdzKSB7XG4gIGxvZ2dlci5pbmZvKCdOb24tZGVmYXVsdCBzZXJ2ZXIgYXJnczonKTtcbiAgaW5zcGVjdChhcmdzKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0FyZ3NbJ2RlZmF1bHRDYXBhYmlsaXRpZXMnXX0gY2Fwc1xuICovXG5mdW5jdGlvbiBsb2dEZWZhdWx0Q2FwYWJpbGl0aWVzV2FybmluZyhjYXBzKSB7XG4gIGxvZ2dlci5pbmZvKFxuICAgICdEZWZhdWx0IGNhcGFiaWxpdGllcywgd2hpY2ggd2lsbCBiZSBhZGRlZCB0byBlYWNoIHJlcXVlc3QgJyArXG4gICAgICAndW5sZXNzIG92ZXJyaWRkZW4gYnkgZGVzaXJlZCBjYXBhYmlsaXRpZXM6J1xuICApO1xuICBpbnNwZWN0KGNhcHMpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UGFyc2VkQXJnc30gYXJnc1xuICovXG5hc3luYyBmdW5jdGlvbiBsb2dTdGFydHVwSW5mbyhhcmdzKSB7XG4gIGxldCB3ZWxjb21lID0gYFdlbGNvbWUgdG8gQXBwaXVtIHYke0FQUElVTV9WRVJ9YDtcbiAgbGV0IGFwcGl1bVJldiA9IGF3YWl0IGdldEdpdFJldigpO1xuICBpZiAoYXBwaXVtUmV2KSB7XG4gICAgd2VsY29tZSArPSBgIChSRVYgJHthcHBpdW1SZXZ9KWA7XG4gIH1cbiAgbG9nZ2VyLmluZm8od2VsY29tZSk7XG5cbiAgbGV0IHNob3dBcmdzID0gZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MoYXJncyk7XG4gIGlmIChfLnNpemUoc2hvd0FyZ3MpKSB7XG4gICAgbG9nTm9uRGVmYXVsdEFyZ3NXYXJuaW5nKHNob3dBcmdzKTtcbiAgfVxuICBpZiAoIV8uaXNFbXB0eShhcmdzLmRlZmF1bHRDYXBhYmlsaXRpZXMpKSB7XG4gICAgbG9nRGVmYXVsdENhcGFiaWxpdGllc1dhcm5pbmcoYXJncy5kZWZhdWx0Q2FwYWJpbGl0aWVzKTtcbiAgfVxuICAvLyBUT0RPOiBicmluZyBiYWNrIGxvZ2xldmVsIHJlcG9ydGluZyBiZWxvdyBvbmNlIGxvZ2dlciBpcyBmbHVzaGVkIG91dFxuICAvLyBsb2dnZXIuaW5mbygnQ29uc29sZSBMb2dMZXZlbDogJyArIGxvZ2dlci50cmFuc3BvcnRzLmNvbnNvbGUubGV2ZWwpO1xuICAvLyBpZiAobG9nZ2VyLnRyYW5zcG9ydHMuZmlsZSkge1xuICAvLyAgIGxvZ2dlci5pbmZvKCdGaWxlIExvZ0xldmVsOiAnICsgbG9nZ2VyLnRyYW5zcG9ydHMuZmlsZS5sZXZlbCk7XG4gIC8vIH1cbn1cblxuLyoqXG4gKiBMb2dzIHRoZSBhZGRyZXNzIGFuZCBwb3J0IHRoZSBzZXJ2ZXIgaXMgbGlzdGVuaW5nIG9uXG4gKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyAtIEFkZHJlc3NcbiAqIEBwYXJhbSB7bnVtYmVyfSBwb3J0IC0gUG9ydFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGxvZ1NlcnZlclBvcnQoYWRkcmVzcywgcG9ydCkge1xuICBsZXQgbG9nTWVzc2FnZSA9IGBBcHBpdW0gUkVTVCBodHRwIGludGVyZmFjZSBsaXN0ZW5lciBzdGFydGVkIG9uIGAgKyBgJHthZGRyZXNzfToke3BvcnR9YDtcbiAgbG9nZ2VyLmluZm8obG9nTWVzc2FnZSk7XG59XG5cbi8qKlxuICogR2V0cyBhIGxpc3Qgb2YgYHVwZGF0ZVNlcnZlcmAgZnVuY3Rpb25zIGZyb20gYWxsIGV4dGVuc2lvbnNcbiAqIEBwYXJhbSB7RHJpdmVyTmFtZU1hcH0gZHJpdmVyQ2xhc3Nlc1xuICogQHBhcmFtIHtQbHVnaW5OYW1lTWFwfSBwbHVnaW5DbGFzc2VzXG4gKiBAcmV0dXJucyB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuVXBkYXRlU2VydmVyQ2FsbGJhY2tbXX1cbiAqL1xuZnVuY3Rpb24gZ2V0U2VydmVyVXBkYXRlcnMoZHJpdmVyQ2xhc3NlcywgcGx1Z2luQ2xhc3Nlcykge1xuICByZXR1cm4gXy5jb21wYWN0KF8ubWFwKFsuLi5kcml2ZXJDbGFzc2VzLmtleXMoKSwgLi4ucGx1Z2luQ2xhc3Nlcy5rZXlzKCldLCAndXBkYXRlU2VydmVyJykpO1xufVxuXG4vKipcbiAqIE1ha2VzIGEgYmlnIGBNZXRob2RNYXBgIGZyb20gYWxsIHRoZSBsaXR0bGUgYE1ldGhvZE1hcGBzIGluIHRoZSBleHRlbnNpb25zXG4gKiBAcGFyYW0ge0RyaXZlck5hbWVNYXB9IGRyaXZlckNsYXNzZXNcbiAqIEBwYXJhbSB7UGx1Z2luTmFtZU1hcH0gcGx1Z2luQ2xhc3Nlc1xuICogQHJldHVybnMge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLk1ldGhvZE1hcH1cbiAqL1xuZnVuY3Rpb24gZ2V0RXh0cmFNZXRob2RNYXAoZHJpdmVyQ2xhc3NlcywgcGx1Z2luQ2xhc3Nlcykge1xuICByZXR1cm4gWy4uLmRyaXZlckNsYXNzZXMua2V5cygpLCAuLi5wbHVnaW5DbGFzc2VzLmtleXMoKV0ucmVkdWNlKFxuICAgIChtYXAsIGtsYXNzKSA9PiAoe1xuICAgICAgLi4ubWFwLFxuICAgICAgLi4uKGtsYXNzLm5ld01ldGhvZE1hcCA/PyB7fSksXG4gICAgfSksXG4gICAge31cbiAgKTtcbn1cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9V2l0aFNlcnZlclN1YmNvbW1hbmRdXG4gKiBAcGFyYW0ge0FyZ3M8VD59IGFyZ3NcbiAqIEByZXR1cm5zIHthcmdzIGlzIEFyZ3M8V2l0aFNlcnZlclN1YmNvbW1hbmQ+fVxuICovXG5mdW5jdGlvbiBhcmVTZXJ2ZXJDb21tYW5kQXJncyhhcmdzKSB7XG4gIHJldHVybiBhcmdzLnN1YmNvbW1hbmQgPT09IFNFUlZFUl9TVUJDT01NQU5EO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIEFwcGl1bSwgYnV0IGRvZXMgbm90IHN0YXJ0IHRoZSBzZXJ2ZXIuXG4gKlxuICogVXNlIHRoaXMgdG8gZ2V0IGF0IHRoZSBjb25maWd1cmF0aW9uIHNjaGVtYS5cbiAqXG4gKiBJZiBgYXJnc2AgY29udGFpbnMgYSBub24tZW1wdHkgYHN1YmNvbW1hbmRgIHdoaWNoIGlzIG5vdCBgc2VydmVyYCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhbiBlbXB0eSBvYmplY3QuXG4gKlxuICogQHRlbXBsYXRlIFtUPVdpdGhTZXJ2ZXJTdWJjb21tYW5kXVxuICogQHBhcmFtIHtBcmdzPFQ+fSBbYXJnc10gLSBQYXJ0aWFsIGFyZ3MgKHByb2dhbW1hdGljIHVzYWdlIG9ubHkpXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2ZXJJbml0UmVzdWx0IHwgRXh0Q29tbWFuZEluaXRSZXN1bHQ+fVxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7aW5pdCwgZ2V0U2NoZW1hfSBmcm9tICdhcHBpdW0nO1xuICogY29uc3Qgb3B0aW9ucyA9IHt9OyAvLyBjb25maWcgb2JqZWN0XG4gKiBhd2FpdCBpbml0KG9wdGlvbnMpO1xuICogY29uc3Qgc2NoZW1hID0gZ2V0U2NoZW1hKCk7IC8vIGVudGlyZSBjb25maWcgc2NoZW1hIGluY2x1ZGluZyBwbHVnaW5zIGFuZCBkcml2ZXJzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXQoYXJncykge1xuICBjb25zdCBhcHBpdW1Ib21lID0gYXJncz8uYXBwaXVtSG9tZSA/PyAoYXdhaXQgcmVzb2x2ZUFwcGl1bUhvbWUoKSk7XG5cbiAgY29uc3Qge2RyaXZlckNvbmZpZywgcGx1Z2luQ29uZmlnfSA9IGF3YWl0IGxvYWRFeHRlbnNpb25zKGFwcGl1bUhvbWUpO1xuXG4gIGNvbnN0IHBhcnNlciA9IGdldFBhcnNlcigpO1xuICBsZXQgdGhyb3dJbnN0ZWFkT2ZFeGl0ID0gZmFsc2U7XG4gIC8qKiBAdHlwZSB7QXJnczxUPn0gKi9cbiAgbGV0IHByZUNvbmZpZ0FyZ3M7XG5cbiAgaWYgKGFyZ3MpIHtcbiAgICAvLyBpZiB3ZSBoYXZlIGEgY29udGFpbmluZyBwYWNrYWdlIGluc3RlYWQgb2YgcnVubmluZyBhcyBhIENMSSBwcm9jZXNzLFxuICAgIC8vIHRoYXQgcGFja2FnZSBtaWdodCBub3QgYXBwcmVjaWF0ZSB1cyBjYWxsaW5nICdwcm9jZXNzLmV4aXQnIHdpbGx5LVxuICAgIC8vIG5pbGx5LCBzbyBnaXZlIGl0IHRoZSBvcHRpb24gdG8gaGF2ZSB1cyB0aHJvdyBpbnN0ZWFkIG9mIGV4aXRcbiAgICBpZiAoYXJncy50aHJvd0luc3RlYWRPZkV4aXQpIHtcbiAgICAgIHRocm93SW5zdGVhZE9mRXhpdCA9IHRydWU7XG4gICAgICAvLyBidXQgcmVtb3ZlIGl0IHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBzZXJ2ZXIgYXJnIHBlciBzZVxuICAgICAgZGVsZXRlIGFyZ3MudGhyb3dJbnN0ZWFkT2ZFeGl0O1xuICAgIH1cbiAgICBwcmVDb25maWdBcmdzID0gey4uLmFyZ3MsIHN1YmNvbW1hbmQ6IGFyZ3Muc3ViY29tbWFuZCA/PyBTRVJWRVJfU1VCQ09NTUFORH07XG4gIH0gZWxzZSB7XG4gICAgLy8gb3RoZXJ3aXNlIHBhcnNlIGZyb20gQ0xJXG4gICAgcHJlQ29uZmlnQXJncyA9IC8qKiBAdHlwZSB7QXJnczxUPn0gKi8gKHBhcnNlci5wYXJzZUFyZ3MoKSk7XG4gIH1cblxuICBjb25zdCBjb25maWdSZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZShwcmVDb25maWdBcmdzLmNvbmZpZ0ZpbGUpO1xuXG4gIGlmICghXy5pc0VtcHR5KGNvbmZpZ1Jlc3VsdC5lcnJvcnMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEVycm9ycyBpbiBjb25maWcgZmlsZSAke2NvbmZpZ1Jlc3VsdC5maWxlcGF0aH06XFxuICR7XG4gICAgICAgIGNvbmZpZ1Jlc3VsdC5yZWFzb24gPz8gY29uZmlnUmVzdWx0LmVycm9yc1xuICAgICAgfWBcbiAgICApO1xuICB9XG5cbiAgLy8gbWVyZ2UgY29uZmlnIGFuZCBhcHBseSBkZWZhdWx0cy5cbiAgLy8gdGhlIG9yZGVyIG9mIHByZWNlbmRlY2UgaXM6XG4gIC8vIDEuIGNvbW1hbmQgbGluZSBhcmdzXG4gIC8vIDIuIGNvbmZpZyBmaWxlXG4gIC8vIDMuIGRlZmF1bHRzIGZyb20gY29uZmlnIGZpbGUuXG4gIGlmIChhcmVTZXJ2ZXJDb21tYW5kQXJncyhwcmVDb25maWdBcmdzKSkge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZ2V0RGVmYXVsdHNGb3JTY2hlbWEoZmFsc2UpO1xuXG4gICAgLyoqIEB0eXBlIHtQYXJzZWRBcmdzfSAqL1xuICAgIGNvbnN0IHNlcnZlckFyZ3MgPSBfLmRlZmF1bHRzRGVlcChwcmVDb25maWdBcmdzLCBjb25maWdSZXN1bHQuY29uZmlnPy5zZXJ2ZXIsIGRlZmF1bHRzKTtcblxuICAgIGlmIChwcmVDb25maWdBcmdzLnNob3dDb25maWcpIHtcbiAgICAgIHNob3dDb25maWcoZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MocHJlQ29uZmlnQXJncyksIGNvbmZpZ1Jlc3VsdCwgZGVmYXVsdHMsIHNlcnZlckFyZ3MpO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGF3YWl0IGxvZ3NpbmtJbml0KHNlcnZlckFyZ3MpO1xuXG4gICAgaWYgKHNlcnZlckFyZ3MubG9nRmlsdGVycykge1xuICAgICAgY29uc3Qge2lzc3VlcywgcnVsZXN9ID0gYXdhaXQgbG9nRmFjdG9yeS5sb2FkU2VjdXJlVmFsdWVzUHJlcHJvY2Vzc2luZ1J1bGVzKFxuICAgICAgICBzZXJ2ZXJBcmdzLmxvZ0ZpbHRlcnNcbiAgICAgICk7XG4gICAgICBpZiAoIV8uaXNFbXB0eShpc3N1ZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIGxvZyBmaWx0ZXJpbmcgcnVsZXMgY29uZmlnICcke3NlcnZlckFyZ3MubG9nRmlsdGVyc30nIGhhcyBpc3N1ZXM6IGAgK1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoaXNzdWVzLCBudWxsLCAyKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNFbXB0eShydWxlcykpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYEZvdW5kIG5vIGxvZyBmaWx0ZXJpbmcgcnVsZXMgaW4gJyR7c2VydmVyQXJncy5sb2dGaWx0ZXJzfScuIElzIHRoYXQgZXhwZWN0ZWQ/YFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgYExvYWRlZCAke3V0aWwucGx1cmFsaXplKCdmaWx0ZXJpbmcgcnVsZScsIHJ1bGVzLmxlbmd0aCwgdHJ1ZSl9IGZyb20gJyR7XG4gICAgICAgICAgICBzZXJ2ZXJBcmdzLmxvZ0ZpbHRlcnNcbiAgICAgICAgICB9J2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhcHBpdW1Ecml2ZXIgPSBuZXcgQXBwaXVtRHJpdmVyKHNlcnZlckFyZ3MpO1xuICAgIC8vIHNldCB0aGUgY29uZmlnIG9uIHRoZSB1bWJyZWxsYSBkcml2ZXIgc28gaXQgY2FuIG1hdGNoIGRyaXZlcnMgdG8gY2Fwc1xuICAgIGFwcGl1bURyaXZlci5kcml2ZXJDb25maWcgPSBkcml2ZXJDb25maWc7XG4gICAgYXdhaXQgcHJlZmxpZ2h0Q2hlY2tzKHNlcnZlckFyZ3MsIHRocm93SW5zdGVhZE9mRXhpdCk7XG5cbiAgICByZXR1cm4gLyoqIEB0eXBlIHtTZXJ2ZXJJbml0UmVzdWx0fSAqLyAoe1xuICAgICAgYXBwaXVtRHJpdmVyLFxuICAgICAgcGFyc2VkQXJnczogc2VydmVyQXJncyxcbiAgICAgIGRyaXZlckNvbmZpZyxcbiAgICAgIHBsdWdpbkNvbmZpZyxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBleHRlbnNpb25Db21tYW5kQXJncyA9IC8qKiBAdHlwZSB7QXJnczxpbXBvcnQoJ2FwcGl1bS90eXBlcycpLldpdGhFeHRTdWJjb21tYW5kPn0gKi8gKFxuICAgICAgcHJlQ29uZmlnQXJnc1xuICAgICk7XG4gICAgLy8gaWYgdGhlIHVzZXIgaGFzIHJlcXVlc3RlZCB0aGUgJ2RyaXZlcicgQ0xJLCBkb24ndCBydW4gdGhlIG5vcm1hbCBzZXJ2ZXIsXG4gICAgLy8gYnV0IGluc3RlYWQgcGFzcyBjb250cm9sIHRvIHRoZSBkcml2ZXIgQ0xJXG4gICAgaWYgKHByZUNvbmZpZ0FyZ3Muc3ViY29tbWFuZCA9PT0gRFJJVkVSX1RZUEUpIHtcbiAgICAgIGF3YWl0IHJ1bkV4dGVuc2lvbkNvbW1hbmQoZXh0ZW5zaW9uQ29tbWFuZEFyZ3MsIGRyaXZlckNvbmZpZyk7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGlmIChwcmVDb25maWdBcmdzLnN1YmNvbW1hbmQgPT09IFBMVUdJTl9UWVBFKSB7XG4gICAgICBhd2FpdCBydW5FeHRlbnNpb25Db21tYW5kKGV4dGVuc2lvbkNvbW1hbmRBcmdzLCBwbHVnaW5Db25maWcpO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB7fTsgLy8gc2hvdWxkIG5ldmVyIGhhcHBlblxuICB9XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgQXBwaXVtJ3MgY29uZmlnLiAgU3RhcnRzIHNlcnZlciBpZiBhcHByb3ByaWF0ZSBhbmQgcmVzb2x2ZXMgdGhlXG4gKiBzZXJ2ZXIgaW5zdGFuY2UgaWYgc287IG90aGVyd2lzZSByZXNvbHZlcyB3LyBgdW5kZWZpbmVkYC5cbiAqIEB0ZW1wbGF0ZSBbVD1XaXRoU2VydmVyU3ViY29tbWFuZF1cbiAqIEBwYXJhbSB7QXJnczxUPn0gW2FyZ3NdIC0gQXJndW1lbnRzIGZyb20gQ0xJIG9yIG90aGVyd2lzZVxuICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQXBwaXVtU2VydmVyfHVuZGVmaW5lZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG1haW4oYXJncykge1xuICBjb25zdCB7YXBwaXVtRHJpdmVyLCBwYXJzZWRBcmdzLCBwbHVnaW5Db25maWcsIGRyaXZlckNvbmZpZ30gPSAvKiogQHR5cGUge1NlcnZlckluaXRSZXN1bHR9ICovIChcbiAgICBhd2FpdCBpbml0KGFyZ3MpXG4gICk7XG5cbiAgaWYgKCFhcHBpdW1Ecml2ZXIgfHwgIXBhcnNlZEFyZ3MgfHwgIXBsdWdpbkNvbmZpZyB8fCAhZHJpdmVyQ29uZmlnKSB7XG4gICAgLy8gaWYgdGhpcyBicmFuY2ggaXMgdGFrZW4sIHdlJ3ZlIHJ1biBhIGRpZmZlcmVudCBzdWJjb21tYW5kLCBzbyB0aGVyZSdzIG5vdGhpbmdcbiAgICAvLyBsZWZ0IHRvIGRvIGhlcmUuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGx1Z2luQ2xhc3NlcyA9IGdldEFjdGl2ZVBsdWdpbnMocGx1Z2luQ29uZmlnLCBwYXJzZWRBcmdzLnVzZVBsdWdpbnMpO1xuICAvLyBzZXQgdGhlIGFjdGl2ZSBwbHVnaW5zIG9uIHRoZSB1bWJyZWxsYSBkcml2ZXIgc28gaXQgY2FuIHVzZSB0aGVtIGZvciBjb21tYW5kc1xuICBhcHBpdW1Ecml2ZXIucGx1Z2luQ2xhc3NlcyA9IHBsdWdpbkNsYXNzZXM7XG5cbiAgYXdhaXQgbG9nU3RhcnR1cEluZm8ocGFyc2VkQXJncyk7XG4gIGxldCByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24gPSBtYWtlUm91dGVyKGFwcGl1bURyaXZlcik7XG5cbiAgY29uc3QgZHJpdmVyQ2xhc3NlcyA9IGdldEFjdGl2ZURyaXZlcnMoZHJpdmVyQ29uZmlnLCBwYXJzZWRBcmdzLnVzZURyaXZlcnMpO1xuICBjb25zdCBzZXJ2ZXJVcGRhdGVycyA9IGdldFNlcnZlclVwZGF0ZXJzKGRyaXZlckNsYXNzZXMsIHBsdWdpbkNsYXNzZXMpO1xuICBjb25zdCBleHRyYU1ldGhvZE1hcCA9IGdldEV4dHJhTWV0aG9kTWFwKGRyaXZlckNsYXNzZXMsIHBsdWdpbkNsYXNzZXMpO1xuXG4gIGNvbnN0IHNlcnZlck9wdHMgPSB7XG4gICAgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uLFxuICAgIHBvcnQ6IHBhcnNlZEFyZ3MucG9ydCxcbiAgICBob3N0bmFtZTogcGFyc2VkQXJncy5hZGRyZXNzLFxuICAgIGFsbG93Q29yczogcGFyc2VkQXJncy5hbGxvd0NvcnMsXG4gICAgYmFzZVBhdGg6IHBhcnNlZEFyZ3MuYmFzZVBhdGgsXG4gICAgc2VydmVyVXBkYXRlcnMsXG4gICAgZXh0cmFNZXRob2RNYXAsXG4gIH07XG4gIGlmIChwYXJzZWRBcmdzLmtlZXBBbGl2ZVRpbWVvdXQpIHtcbiAgICBzZXJ2ZXJPcHRzLmtlZXBBbGl2ZVRpbWVvdXQgPSBwYXJzZWRBcmdzLmtlZXBBbGl2ZVRpbWVvdXQgKiAxMDAwO1xuICB9XG4gIGxldCBzZXJ2ZXI7XG4gIHRyeSB7XG4gICAgc2VydmVyID0gYXdhaXQgYmFzZVNlcnZlcihzZXJ2ZXJPcHRzKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmVycm9yKFxuICAgICAgYENvdWxkIG5vdCBjb25maWd1cmUgQXBwaXVtIHNlcnZlci4gSXQncyBwb3NzaWJsZSB0aGF0IGEgZHJpdmVyIG9yIHBsdWdpbiB0cmllZCBgICtcbiAgICAgICAgYHRvIHVwZGF0ZSB0aGUgc2VydmVyIGFuZCBmYWlsZWQuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWBcbiAgICApO1xuICAgIGxvZ2dlci5kZWJ1ZyhlcnIuc3RhY2spO1xuICAgIHJldHVybiBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAocGFyc2VkQXJncy5hbGxvd0NvcnMpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdZb3UgaGF2ZSBlbmFibGVkIENPUlMgcmVxdWVzdHMgZnJvbSBhbnkgaG9zdC4gQmUgY2FyZWZ1bCBub3QgJyArXG4gICAgICAgICd0byB2aXNpdCBzaXRlcyB3aGljaCBjb3VsZCBtYWxpY2lvdXNseSB0cnkgdG8gc3RhcnQgQXBwaXVtICcgK1xuICAgICAgICAnc2Vzc2lvbnMgb24geW91ciBtYWNoaW5lJ1xuICAgICk7XG4gIH1cbiAgYXBwaXVtRHJpdmVyLnNlcnZlciA9IHNlcnZlcjtcbiAgdHJ5IHtcbiAgICAvLyBjb25maWd1cmUgYXMgbm9kZSBvbiBncmlkLCBpZiBuZWNlc3NhcnlcbiAgICAvLyBmYWxzeSB2YWx1ZXMgc2hvdWxkIG5vdCBjYXVzZSB0aGlzIHRvIHJ1blxuICAgIGlmIChwYXJzZWRBcmdzLm5vZGVjb25maWcpIHtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyTm9kZShcbiAgICAgICAgcGFyc2VkQXJncy5ub2RlY29uZmlnLFxuICAgICAgICBwYXJzZWRBcmdzLmFkZHJlc3MsXG4gICAgICAgIHBhcnNlZEFyZ3MucG9ydCxcbiAgICAgICAgcGFyc2VkQXJncy5iYXNlUGF0aFxuICAgICAgKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGF3YWl0IHNlcnZlci5jbG9zZSgpO1xuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nXSkge1xuICAgIHByb2Nlc3Mub25jZShzaWduYWwsIGFzeW5jIGZ1bmN0aW9uIG9uU2lnbmFsKCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFJlY2VpdmVkICR7c2lnbmFsfSAtIHNodXR0aW5nIGRvd25gKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGFwcGl1bURyaXZlci5kZWxldGVBbGxTZXNzaW9ucyh7XG4gICAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgICAgcmVhc29uOiBgVGhlIHByb2Nlc3MgaGFzIHJlY2VpdmVkICR7c2lnbmFsfSBzaWduYWxgLFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgc2VydmVyLmNsb3NlKCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oZSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGxvZ1NlcnZlclBvcnQocGFyc2VkQXJncy5hZGRyZXNzLCBwYXJzZWRBcmdzLnBvcnQpO1xuICBkcml2ZXJDb25maWcucHJpbnQoKTtcbiAgcGx1Z2luQ29uZmlnLnByaW50KFsuLi5wbHVnaW5DbGFzc2VzLnZhbHVlcygpXSk7XG5cbiAgcmV0dXJuIHNlcnZlcjtcbn1cblxuLy8gTk9URTogdGhpcyBpcyBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0IGZvciBhbnkgc2NyaXB0cyByZWZlcmVuY2luZyBgbWFpbi5qc2AgZGlyZWN0bHlcbi8vIChtb3JlIHNwZWNpZmljYWxseSwgYGJ1aWxkL2xpYi9tYWluLmpzYClcbi8vIHRoZSBleGVjdXRhYmxlIGlzIG5vdyBgLi4vaW5kZXguanNgLCBzbyB0aGF0IG1vZHVsZSB3aWxsIHR5cGljYWxseSBiZSBgcmVxdWlyZS5tYWluYC5cbmlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuICBhc3luY2lmeShtYWluKTtcbn1cblxuLy8gZXZlcnl0aGluZyBiZWxvdyBoZXJlIGlzIGludGVuZGVkIHRvIGJlIGEgcHVibGljIEFQSS5cbmV4cG9ydCB7cmVhZENvbmZpZ0ZpbGV9IGZyb20gJy4vY29uZmlnLWZpbGUnO1xuZXhwb3J0IHtmaW5hbGl6ZVNjaGVtYSwgZ2V0U2NoZW1hLCB2YWxpZGF0ZX0gZnJvbSAnLi9zY2hlbWEvc2NoZW1hJztcbmV4cG9ydCB7bWFpbiwgaW5pdCwgcmVzb2x2ZUFwcGl1bUhvbWV9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJUeXBlfSBEcml2ZXJUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuUGx1Z2luVHlwZX0gUGx1Z2luVHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlckNsYXNzfSBEcml2ZXJDbGFzc1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlBsdWdpbkNsYXNzfSBQbHVnaW5DbGFzc1xuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuV2l0aFNlcnZlclN1YmNvbW1hbmR9IFdpdGhTZXJ2ZXJTdWJjb21tYW5kXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuL2V4dGVuc2lvbicpLkRyaXZlck5hbWVNYXB9IERyaXZlck5hbWVNYXBcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4vZXh0ZW5zaW9uJykuUGx1Z2luTmFtZU1hcH0gUGx1Z2luTmFtZU1hcFxuICovXG5cbi8qKlxuICogTGl0ZXJhbGx5IGFuIGVtcHR5IG9iamVjdFxuICogQHR5cGVkZWYgeyB7fSB9IEV4dENvbW1hbmRJbml0UmVzdWx0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZXJ2ZXJJbml0RGF0YVxuICogQHByb3BlcnR5IHtpbXBvcnQoJy4vYXBwaXVtJykuQXBwaXVtRHJpdmVyfSBhcHBpdW1Ecml2ZXIgLSBUaGUgQXBwaXVtIGRyaXZlclxuICogQHByb3BlcnR5IHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLlBhcnNlZEFyZ3N9IHBhcnNlZEFyZ3MgLSBUaGUgcGFyc2VkIGFyZ3VtZW50c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1NlcnZlckluaXREYXRhICYgaW1wb3J0KCcuL2V4dGVuc2lvbicpLkV4dGVuc2lvbkNvbmZpZ3N9IFNlcnZlckluaXRSZXN1bHRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVD1XaXRoU2VydmVyU3ViY29tbWFuZF1cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkFyZ3M8VD59IEFyZ3NcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVD1XaXRoU2VydmVyU3ViY29tbWFuZF1cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLlBhcnNlZEFyZ3M8VD59IFBhcnNlZEFyZ3NcbiAqL1xuIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFXQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNO0VBQUNBO0FBQUQsSUFBc0JDLFlBQTVCOzs7QUFPQSxlQUFlQyxlQUFmLENBQStCQyxJQUEvQixFQUFxQ0Msa0JBQWtCLEdBQUcsS0FBMUQsRUFBaUU7RUFD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
@@ -0,0 +1,143 @@
1
+ /**
2
+ * The original ID of the Appium config schema.
3
+ * We use this in the CLI to convert it to `argparse` options.
4
+ */
5
+ export const APPIUM_CONFIG_SCHEMA_ID: "appium.json";
6
+ /**
7
+ * The schema prop containing server-related options. Everything in here
8
+ * is "native" to Appium.
9
+ * Used by {@link flattenSchema} for transforming the schema into CLI args.
10
+ */
11
+ export const SERVER_PROP_NAME: "server";
12
+ /**
13
+ * An `ArgSpec` is a class representing metadata about an argument (or config
14
+ * option) used for cross-referencing.
15
+ *
16
+ * This class has no instance methods, and is basically just a read-only "struct".
17
+ * @template D
18
+ */
19
+ export class ArgSpec<D> {
20
+ /**
21
+ * Return the schema ID (`$id`) for the **argument** given the parameters.
22
+ *
23
+ * If you need the "root" or "base" schema ID, use {@link ArgSpec.toSchemaBaseRef} instead.
24
+ * @param {string} name - Argument name
25
+ * @param {ExtensionType} [extType] - Extension type
26
+ * @param {string} [extName] - Extension name
27
+ * @returns {string} Schema ID
28
+ */
29
+ static toSchemaRef(name: string, extType?: import("@appium/types").ExtensionType | undefined, extName?: string | undefined): string;
30
+ /**
31
+ * Return the schema ID for an extension or the base schema ID.
32
+ * @param {ExtensionType} [extType] - Extension type
33
+ * @param {string} [extName] - Extension name
34
+ */
35
+ static toSchemaBaseRef(extType?: import("@appium/types").ExtensionType | undefined, extName?: string | undefined): string;
36
+ /**
37
+ * Return the unique ID for the argument given the parameters.
38
+ * @param {string} name - Argument name
39
+ * @param {ExtensionType} [extType] - Extension type
40
+ * @param {string} [extName] - Extension name
41
+ * @returns {string} Unique ID
42
+ */
43
+ static toArg(name: string, extType?: import("@appium/types").ExtensionType | undefined, extName?: string | undefined): string;
44
+ /**
45
+ * Normalizes a raw extension name (not including the type).
46
+ * @param {string} extName - Extension name
47
+ * @returns {string} Normalized extension name
48
+ */
49
+ static toNormalizedExtName(extName: string): string;
50
+ /**
51
+ * When given the root ID of a schema for an extension (`<extType>-<normalizedExtName>.json`) Returns an object containing the extension type and the _normalized_ extension name.
52
+ * @param {string} schemaId - Root schema ID
53
+ * @returns { {extType?: ExtensionType, normalizedExtName?: string} }
54
+ */
55
+ static extensionInfoFromRootSchemaId(schemaId: string): {
56
+ extType?: ExtensionType;
57
+ normalizedExtName?: string;
58
+ };
59
+ /**
60
+ * Creates an `ArgSpec`
61
+ *
62
+ * @param {string} name - The canonical name of the argument. Corresponds to a key in a schema's
63
+ * `properties` property.
64
+ * @template D
65
+ * @param {ArgSpecOptions<D>} [opts] - Options
66
+ * @returns {Readonly<ArgSpec>}
67
+ */
68
+ static create<D_1>(name: string, opts?: ArgSpecOptions<D_1> | undefined): Readonly<ArgSpec<any>>;
69
+ /**
70
+ * Builds some computed fields and assigns them to the instance.
71
+ *
72
+ * Undefined properties are not assigned.
73
+ *
74
+ * The _constructor_ is private. Use {@link ArgSpec.create} instead.
75
+ * @private
76
+ * @param {string} name
77
+ * @param {ArgSpecOptions<D>} [opts]
78
+ */
79
+ private constructor();
80
+ /**
81
+ * The canonical name of the argument. Corresponds to key in schema's `properties` prop.
82
+ * @type {string}
83
+ */
84
+ name: string;
85
+ /**
86
+ * The `ExtensionType` of the argument. This will be set if the arg came from an extension;
87
+ * otherwise it will be `undefined`.
88
+ * @type {ExtensionType|undefined}
89
+ */
90
+ extType: ExtensionType | undefined;
91
+ /**
92
+ * The name of the extension, if this argument came from an extension.
93
+ *
94
+ * Otherwise `undefined`.
95
+ * @type {string|undefined}
96
+ */
97
+ extName: string | undefined;
98
+ /**
99
+ * The schema ID (`$id`) for the argument. This is automatically determined, and any user-provided `$id`s will be overwritten.
100
+ *
101
+ * @type {string}
102
+ */
103
+ ref: string;
104
+ /**
105
+ * The CLI argument, sans leading dashes.
106
+ * @type {string}
107
+ */
108
+ arg: string;
109
+ /**
110
+ * The desired keypath for the argument after arguments have been parsed.
111
+ *
112
+ * Typically this is camelCased. If the arg came from an extension, it will be prefixed with
113
+ * `<extType>.<extName>.`
114
+ * @type {string}
115
+ */
116
+ dest: string;
117
+ /**
118
+ * The same as {@link ArgSpec.dest} but without the leading `<extType>.<extName>.` prefix.
119
+ */
120
+ rawDest: string;
121
+ /**
122
+ * Whatever the default value of this argument is, as specified by the
123
+ * `default` property of the schema.
124
+ * @type {D|undefined}
125
+ */
126
+ defaultValue: D | undefined;
127
+ /**
128
+ * String representation, useful for debugging
129
+ * @returns {string}
130
+ */
131
+ toString(): string;
132
+ }
133
+ /**
134
+ * Options for {@link ArgSpec.create }
135
+ */
136
+ export type ArgSpecOptions<D> = {
137
+ extName?: string | undefined;
138
+ extType?: import("@appium/types").ExtensionType | undefined;
139
+ dest?: string | undefined;
140
+ defaultValue?: D | undefined;
141
+ };
142
+ export type ExtensionType = import('@appium/types').ExtensionType;
143
+ //# sourceMappingURL=arg-spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arg-spec.d.ts","sourceRoot":"","sources":["../../../lib/schema/arg-spec.js"],"names":[],"mappings":"AAEA;;;GAGG;AACH,oDAAqD;AAErD;;;;GAIG;AACH,wCAAyC;AAYzC;;;;;;GAMG;AACH;IAyFE;;;;;;;;OAQG;IACH,yBALW,MAAM,8FAGJ,MAAM,CAQlB;IAED;;;;OAIG;IACH,0HAKC;IAED;;;;;;OAMG;IACH,mBALW,MAAM,8FAGJ,MAAM,CAQlB;IAED;;;;OAIG;IACH,oCAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;OAIG;IACH,+CAHW,MAAM,GACH;QAAC,OAAO,CAAC,EAAE,aAAa,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAC,CAUlE;IAED;;;;;;;;OAQG;IACH,yBANW,MAAM,2CAIJ,sBAAiB,CAI7B;IAhHD;;;;;;;;;OASG;IACH,sBAqBC;IAtFD;;;OAGG;IACH,MAFU,MAAM,CAEX;IAEL;;;;OAIG;IACH,SAFU,aAAa,GAAC,SAAS,CAEzB;IAER;;;;;OAKG;IACH,SAFU,MAAM,GAAC,SAAS,CAElB;IAER;;;;OAIG;IACH,KAFU,MAAM,CAEZ;IAEJ;;;OAGG;IACH,KAFU,MAAM,CAEZ;IAEJ;;;;;;OAMG;IACH,MAFU,MAAM,CAEX;IAEL;;OAEG;IACH,gBAAQ;IAER;;;;OAIG;IACH,cAFU,CAAC,GAAC,SAAS,CAER;IAoHb;;;OAGG;IAEH,YAHa,MAAM,CASlB;CACF;;;;;;;;;;4BAaY,OAAO,eAAe,EAAE,aAAa"}