appium 2.0.0-beta.18 → 2.0.0-beta.21

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 (54) hide show
  1. package/build/lib/appium-config.schema.json +0 -0
  2. package/build/lib/appium.js +84 -69
  3. package/build/lib/cli/argparse-actions.js +1 -1
  4. package/build/lib/cli/args.js +87 -223
  5. package/build/lib/cli/extension-command.js +2 -2
  6. package/build/lib/cli/extension.js +14 -6
  7. package/build/lib/cli/parser.js +142 -106
  8. package/build/lib/cli/utils.js +1 -1
  9. package/build/lib/config-file.js +141 -0
  10. package/build/lib/config.js +42 -64
  11. package/build/lib/driver-config.js +41 -20
  12. package/build/lib/drivers.js +1 -1
  13. package/build/lib/ext-config-io.js +165 -0
  14. package/build/lib/extension-config.js +110 -60
  15. package/build/lib/grid-register.js +19 -21
  16. package/build/lib/logsink.js +1 -1
  17. package/build/lib/main.js +135 -72
  18. package/build/lib/plugin-config.js +17 -8
  19. package/build/lib/schema/appium-config-schema.js +252 -0
  20. package/build/lib/schema/arg-spec.js +120 -0
  21. package/build/lib/schema/cli-args.js +173 -0
  22. package/build/lib/schema/cli-transformers.js +76 -0
  23. package/build/lib/schema/index.js +36 -0
  24. package/build/lib/schema/keywords.js +62 -0
  25. package/build/lib/schema/schema.js +357 -0
  26. package/build/lib/utils.js +26 -35
  27. package/lib/appium-config.schema.json +277 -0
  28. package/lib/appium.js +99 -75
  29. package/lib/cli/args.js +138 -335
  30. package/lib/cli/extension-command.js +7 -6
  31. package/lib/cli/extension.js +12 -4
  32. package/lib/cli/parser.js +248 -96
  33. package/lib/config-file.js +227 -0
  34. package/lib/config.js +71 -61
  35. package/lib/driver-config.js +66 -11
  36. package/lib/ext-config-io.js +287 -0
  37. package/lib/extension-config.js +209 -66
  38. package/lib/grid-register.js +24 -21
  39. package/lib/main.js +139 -68
  40. package/lib/plugin-config.js +32 -2
  41. package/lib/schema/appium-config-schema.js +286 -0
  42. package/lib/schema/arg-spec.js +218 -0
  43. package/lib/schema/cli-args.js +273 -0
  44. package/lib/schema/cli-transformers.js +123 -0
  45. package/lib/schema/index.js +2 -0
  46. package/lib/schema/keywords.js +119 -0
  47. package/lib/schema/schema.js +577 -0
  48. package/lib/utils.js +29 -52
  49. package/package.json +17 -11
  50. package/types/appium-config.d.ts +197 -0
  51. package/types/types.d.ts +201 -0
  52. package/LICENSE +0 -201
  53. package/build/lib/cli/parser-helpers.js +0 -106
  54. package/lib/cli/parser-helpers.js +0 -106
package/build/lib/main.js CHANGED
@@ -6,39 +6,70 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
6
6
  Object.defineProperty(exports, "__esModule", {
7
7
  value: true
8
8
  });
9
+ Object.defineProperty(exports, "APPIUM_HOME", {
10
+ enumerable: true,
11
+ get: function () {
12
+ return _extensionConfig.APPIUM_HOME;
13
+ }
14
+ });
15
+ Object.defineProperty(exports, "finalizeSchema", {
16
+ enumerable: true,
17
+ get: function () {
18
+ return _schema.finalizeSchema;
19
+ }
20
+ });
21
+ Object.defineProperty(exports, "getSchema", {
22
+ enumerable: true,
23
+ get: function () {
24
+ return _schema.getSchema;
25
+ }
26
+ });
27
+ exports.init = init;
9
28
  exports.main = main;
29
+ Object.defineProperty(exports, "readConfigFile", {
30
+ enumerable: true,
31
+ get: function () {
32
+ return _configFile.readConfigFile;
33
+ }
34
+ });
35
+ Object.defineProperty(exports, "validate", {
36
+ enumerable: true,
37
+ get: function () {
38
+ return _schema.validate;
39
+ }
40
+ });
10
41
 
11
42
  require("source-map-support/register");
12
43
 
13
- var _logsink = require("./logsink");
14
-
15
- var _logger = _interopRequireDefault(require("./logger"));
16
-
17
- var _lodash = _interopRequireDefault(require("lodash"));
18
-
19
44
  var _baseDriver = require("@appium/base-driver");
20
45
 
46
+ var _support = require("@appium/support");
47
+
21
48
  var _asyncbox = require("asyncbox");
22
49
 
23
- var _parser = _interopRequireWildcard(require("./cli/parser"));
50
+ var _lodash = _interopRequireDefault(require("lodash"));
51
+
52
+ var _appium = require("./appium");
24
53
 
25
54
  var _args = require("./cli/args");
26
55
 
27
- var _support = require("@appium/support");
56
+ var _extension = require("./cli/extension");
28
57
 
29
- var _config = require("./config");
58
+ var _parser = _interopRequireWildcard(require("./cli/parser"));
30
59
 
31
- var _driverConfig = _interopRequireDefault(require("./driver-config"));
60
+ var _config = require("./config");
32
61
 
33
- var _pluginConfig = _interopRequireDefault(require("./plugin-config"));
62
+ var _configFile = require("./config-file");
34
63
 
35
64
  var _extensionConfig = require("./extension-config");
36
65
 
37
- var _extension = require("./cli/extension");
66
+ var _gridRegister = _interopRequireDefault(require("./grid-register"));
38
67
 
39
- var _appium = require("./appium");
68
+ var _logger = _interopRequireDefault(require("./logger"));
40
69
 
41
- var _gridRegister = _interopRequireDefault(require("./grid-register"));
70
+ var _logsink = require("./logsink");
71
+
72
+ var _schema = require("./schema/schema");
42
73
 
43
74
  var _utils = require("./utils");
44
75
 
@@ -46,13 +77,7 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
46
77
 
47
78
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
48
79
 
49
- async function preflightChecks({
50
- parser,
51
- args,
52
- driverConfig,
53
- pluginConfig,
54
- throwInsteadOfExit = false
55
- }) {
80
+ async function preflightChecks(args, throwInsteadOfExit = false) {
56
81
  try {
57
82
  (0, _config.checkNodeOk)();
58
83
 
@@ -66,9 +91,7 @@ async function preflightChecks({
66
91
  }
67
92
 
68
93
  (0, _config.warnNodeDeprecations)();
69
- (0, _config.validateServerArgs)(parser, args);
70
- await driverConfig.read();
71
- await pluginConfig.read();
94
+ (0, _schema.validate)(args);
72
95
 
73
96
  if (args.tmpDir) {
74
97
  await (0, _config.validateTmpDir)(args.tmpDir);
@@ -106,7 +129,7 @@ async function logStartupInfo(parser, args) {
106
129
 
107
130
  _logger.default.info(welcome);
108
131
 
109
- let showArgs = (0, _config.getNonDefaultArgs)(parser, args);
132
+ let showArgs = (0, _config.getNonDefaultServerArgs)(parser, args);
110
133
 
111
134
  if (_lodash.default.size(showArgs)) {
112
135
  logNonDefaultArgsWarning(showArgs);
@@ -124,7 +147,7 @@ function logServerPort(address, port) {
124
147
  }
125
148
 
126
149
  function getActivePlugins(args, pluginConfig) {
127
- return 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 => {
150
+ return _lodash.default.compact(Object.keys(pluginConfig.installedExtensions).filter(pluginName => _lodash.default.includes(args.usePlugins, pluginName) || args.usePlugins.length === 1 && args.usePlugins[0] === _args.USE_ALL_PLUGINS).map(pluginName => {
128
151
  try {
129
152
  _logger.default.info(`Attempting to load plugin ${pluginName}...`);
130
153
 
@@ -136,14 +159,12 @@ function getActivePlugins(args, pluginConfig) {
136
159
  _logger.default.error(`Could not load plugin '${pluginName}', so it will not be available. Error ` + `in loading the plugin was: ${err.message}`);
137
160
 
138
161
  _logger.default.debug(err.stack);
139
-
140
- return false;
141
162
  }
142
- }).filter(Boolean);
163
+ }));
143
164
  }
144
165
 
145
166
  function getActiveDrivers(args, driverConfig) {
146
- return Object.keys(driverConfig.installedExtensions).filter(driverName => _lodash.default.includes(args.drivers, driverName) || args.drivers.length === 0).map(driverName => {
167
+ return _lodash.default.compact(Object.keys(driverConfig.installedExtensions).filter(driverName => _lodash.default.includes(args.useDrivers, driverName) || args.useDrivers.length === 0).map(driverName => {
147
168
  try {
148
169
  _logger.default.info(`Attempting to load driver ${driverName}...`);
149
170
 
@@ -152,10 +173,8 @@ function getActiveDrivers(args, driverConfig) {
152
173
  _logger.default.error(`Could not load driver '${driverName}', so it will not be available. Error ` + `in loading the driver was: ${err.message}`);
153
174
 
154
175
  _logger.default.debug(err.stack);
155
-
156
- return false;
157
176
  }
158
- }).filter(Boolean);
177
+ }));
159
178
  }
160
179
 
161
180
  function getServerUpdaters(driverClasses, pluginClasses) {
@@ -168,75 +187,116 @@ function getExtraMethodMap(driverClasses, pluginClasses) {
168
187
  }), {});
169
188
  }
170
189
 
171
- async function main(args = null) {
172
- let parser = (0, _parser.default)();
190
+ async function init(args) {
191
+ var _configResult$config2;
192
+
193
+ const parser = await (0, _parser.default)();
173
194
  let throwInsteadOfExit = false;
195
+ let parsedArgs;
174
196
 
175
197
  if (args) {
176
- args = Object.assign({}, (0, _parser.getDefaultServerArgs)(), args);
198
+ var _args$subcommand;
177
199
 
178
200
  if (args.throwInsteadOfExit) {
179
201
  throwInsteadOfExit = true;
180
202
  delete args.throwInsteadOfExit;
181
203
  }
204
+
205
+ parsedArgs = { ...args,
206
+ subcommand: (_args$subcommand = args.subcommand) !== null && _args$subcommand !== void 0 ? _args$subcommand : _parser.SERVER_SUBCOMMAND
207
+ };
182
208
  } else {
183
- args = parser.parse_args();
209
+ parsedArgs = parser.parseArgs();
210
+ }
211
+
212
+ const configResult = await (0, _configFile.readConfigFile)(parsedArgs.configFile);
213
+
214
+ if (!_lodash.default.isEmpty(configResult.errors)) {
215
+ var _configResult$reason;
216
+
217
+ throw new Error(`Errors in config file ${configResult.filepath}:\n ${(_configResult$reason = configResult.reason) !== null && _configResult$reason !== void 0 ? _configResult$reason : configResult.errors}`);
218
+ }
219
+
220
+ if (parsedArgs.subcommand === _parser.SERVER_SUBCOMMAND) {
221
+ var _configResult$config;
222
+
223
+ parsedArgs = _lodash.default.defaultsDeep(parsedArgs, (_configResult$config = configResult.config) === null || _configResult$config === void 0 ? void 0 : _configResult$config.server, (0, _schema.getDefaultsFromSchema)());
184
224
  }
185
225
 
186
- await (0, _logsink.init)(args);
226
+ parsedArgs = _lodash.default.defaultsDeep(parsedArgs, (_configResult$config2 = configResult.config) !== null && _configResult$config2 !== void 0 ? _configResult$config2 : {});
227
+ await (0, _logsink.init)(parsedArgs);
228
+
229
+ if (parsedArgs.subcommand === _extensionConfig.DRIVER_TYPE) {
230
+ await (0, _extension.runExtensionCommand)(parsedArgs, parsedArgs.subcommand, _args.driverConfig);
231
+ return {
232
+ parser
233
+ };
234
+ }
187
235
 
188
- if (args.subcommand === _extensionConfig.DRIVER_TYPE || args.subcommand === _extensionConfig.PLUGIN_TYPE) {
189
- await (0, _extension.runExtensionCommand)(args, args.subcommand);
190
- process.exit();
236
+ if (parsedArgs.subcommand === _extensionConfig.PLUGIN_TYPE) {
237
+ await (0, _extension.runExtensionCommand)(parsedArgs, parsedArgs.subcommand, _args.pluginConfig);
238
+ return {
239
+ parser
240
+ };
191
241
  }
192
242
 
193
- if (args.logFilters) {
243
+ if (parsedArgs.logFilters) {
194
244
  const {
195
245
  issues,
196
246
  rules
197
- } = await _support.logger.loadSecureValuesPreprocessingRules(args.logFilters);
247
+ } = await _support.logger.loadSecureValuesPreprocessingRules(parsedArgs.logFilters);
198
248
 
199
249
  if (!_lodash.default.isEmpty(issues)) {
200
- throw new Error(`The log filtering rules config '${args.logFilters}' has issues: ` + JSON.stringify(issues, null, 2));
250
+ throw new Error(`The log filtering rules config '${parsedArgs.logFilters}' has issues: ` + JSON.stringify(issues, null, 2));
201
251
  }
202
252
 
203
253
  if (_lodash.default.isEmpty(rules)) {
204
- _logger.default.warn(`Found no log filtering rules in '${args.logFilters}'. Is that expected?`);
254
+ _logger.default.warn(`Found no log filtering rules in '${parsedArgs.logFilters}'. Is that expected?`);
205
255
  } else {
206
- _logger.default.info(`Loaded ${_support.util.pluralize('filtering rule', rules.length, true)} from '${args.logFilters}'`);
256
+ _logger.default.info(`Loaded ${_support.util.pluralize('filtering rule', rules.length, true)} from '${parsedArgs.logFilters}'`);
207
257
  }
208
258
  }
209
259
 
210
- let appiumDriver = new _appium.AppiumDriver(args);
211
- const driverConfig = new _driverConfig.default(args.appiumHome);
212
- appiumDriver.driverConfig = driverConfig;
213
- const pluginConfig = new _pluginConfig.default(args.appiumHome);
214
- await preflightChecks({
260
+ const appiumDriver = new _appium.AppiumDriver(parsedArgs);
261
+ appiumDriver.driverConfig = _args.driverConfig;
262
+ await preflightChecks(parsedArgs, throwInsteadOfExit);
263
+ return {
264
+ parser,
265
+ appiumDriver,
266
+ parsedArgs
267
+ };
268
+ }
269
+
270
+ async function main(args) {
271
+ const {
215
272
  parser,
216
- args,
217
- driverConfig,
218
- pluginConfig,
219
- throwInsteadOfExit
220
- });
221
- const pluginClasses = getActivePlugins(args, pluginConfig);
273
+ appiumDriver,
274
+ parsedArgs
275
+ } = await init(args);
276
+
277
+ if (!appiumDriver || !parsedArgs) {
278
+ return;
279
+ }
280
+
281
+ const pluginClasses = getActivePlugins(parsedArgs, _args.pluginConfig);
222
282
  appiumDriver.pluginClasses = pluginClasses;
223
- await logStartupInfo(parser, args);
283
+ await logStartupInfo(parser, parsedArgs);
224
284
  let routeConfiguringFunction = (0, _baseDriver.routeConfiguringFunction)(appiumDriver);
225
- const driverClasses = getActiveDrivers(args, driverConfig);
285
+ const driverClasses = getActiveDrivers(parsedArgs, _args.driverConfig);
226
286
  const serverUpdaters = getServerUpdaters(driverClasses, pluginClasses);
227
287
  const extraMethodMap = getExtraMethodMap(driverClasses, pluginClasses);
228
288
  const serverOpts = {
229
289
  routeConfiguringFunction,
230
- port: args.port,
231
- hostname: args.address,
232
- allowCors: args.allowCors,
233
- basePath: args.basePath,
290
+ port: parsedArgs.port,
291
+ hostname: parsedArgs.address,
292
+ allowCors: parsedArgs.allowCors,
293
+ basePath: parsedArgs.basePath,
234
294
  serverUpdaters,
235
295
  extraMethodMap
236
296
  };
237
297
 
238
- if (args.keepAliveTimeout) {
239
- serverOpts.keepAliveTimeout = args.keepAliveTimeout * 1000;
298
+ if (parsedArgs.keepAliveTimeout) {
299
+ serverOpts.keepAliveTimeout = parsedArgs.keepAliveTimeout * 1000;
240
300
  }
241
301
 
242
302
  let server;
@@ -251,15 +311,15 @@ async function main(args = null) {
251
311
  return process.exit(1);
252
312
  }
253
313
 
254
- if (args.allowCors) {
314
+ if (parsedArgs.allowCors) {
255
315
  _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');
256
316
  }
257
317
 
258
318
  appiumDriver.server = server;
259
319
 
260
320
  try {
261
- if (args.nodeconfig !== null) {
262
- await (0, _gridRegister.default)(args.nodeconfig, args.address, args.port, args.basePath);
321
+ if (parsedArgs.nodeconfig) {
322
+ await (0, _gridRegister.default)(parsedArgs.nodeconfig, parsedArgs.address, parsedArgs.port, parsedArgs.basePath);
263
323
  }
264
324
  } catch (err) {
265
325
  await server.close();
@@ -285,9 +345,12 @@ async function main(args = null) {
285
345
  });
286
346
  }
287
347
 
288
- logServerPort(args.address, args.port);
289
- driverConfig.print();
290
- pluginConfig.print(pluginClasses.map(p => p.pluginName));
348
+ logServerPort(parsedArgs.address, parsedArgs.port);
349
+
350
+ _args.driverConfig.print();
351
+
352
+ _args.pluginConfig.print(pluginClasses.map(p => p.pluginName));
353
+
291
354
  return server;
292
355
  }
293
356
 
@@ -296,4 +359,4 @@ if (require.main === module) {
296
359
  }require('source-map-support').install();
297
360
 
298
361
 
299
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9tYWluLmpzIl0sIm5hbWVzIjpbInByZWZsaWdodENoZWNrcyIsInBhcnNlciIsImFyZ3MiLCJkcml2ZXJDb25maWciLCJwbHVnaW5Db25maWciLCJ0aHJvd0luc3RlYWRPZkV4aXQiLCJsb25nU3RhY2t0cmFjZSIsInJlcXVpcmUiLCJhc3luY190cmFjZV9saW1pdCIsInNob3dDb25maWciLCJwcm9jZXNzIiwiZXhpdCIsInJlYWQiLCJ0bXBEaXIiLCJlcnIiLCJsb2dnZXIiLCJlcnJvciIsIm1lc3NhZ2UiLCJyZWQiLCJsb2dOb25EZWZhdWx0QXJnc1dhcm5pbmciLCJpbmZvIiwibG9nRGVmYXVsdENhcGFiaWxpdGllc1dhcm5pbmciLCJjYXBzIiwibG9nU3RhcnR1cEluZm8iLCJ3ZWxjb21lIiwiQVBQSVVNX1ZFUiIsImFwcGl1bVJldiIsInNob3dBcmdzIiwiXyIsInNpemUiLCJpc0VtcHR5IiwiZGVmYXVsdENhcGFiaWxpdGllcyIsImxvZ1NlcnZlclBvcnQiLCJhZGRyZXNzIiwicG9ydCIsImxvZ01lc3NhZ2UiLCJnZXRBY3RpdmVQbHVnaW5zIiwiT2JqZWN0Iiwia2V5cyIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJmaWx0ZXIiLCJwbHVnaW5OYW1lIiwiaW5jbHVkZXMiLCJwbHVnaW5zIiwibGVuZ3RoIiwiVVNFX0FMTF9QTFVHSU5TIiwibWFwIiwiUGx1Z2luQ2xhc3MiLCJkZWJ1ZyIsInN0YWNrIiwiQm9vbGVhbiIsImdldEFjdGl2ZURyaXZlcnMiLCJkcml2ZXJOYW1lIiwiZHJpdmVycyIsImdldFNlcnZlclVwZGF0ZXJzIiwiZHJpdmVyQ2xhc3NlcyIsInBsdWdpbkNsYXNzZXMiLCJrbGFzcyIsInVwZGF0ZVNlcnZlciIsImdldEV4dHJhTWV0aG9kTWFwIiwicmVkdWNlIiwibmV3TWV0aG9kTWFwIiwibWFpbiIsImFzc2lnbiIsInBhcnNlX2FyZ3MiLCJzdWJjb21tYW5kIiwiRFJJVkVSX1RZUEUiLCJQTFVHSU5fVFlQRSIsImxvZ0ZpbHRlcnMiLCJpc3N1ZXMiLCJydWxlcyIsImxvZ0ZhY3RvcnkiLCJsb2FkU2VjdXJlVmFsdWVzUHJlcHJvY2Vzc2luZ1J1bGVzIiwiRXJyb3IiLCJKU09OIiwic3RyaW5naWZ5Iiwid2FybiIsInV0aWwiLCJwbHVyYWxpemUiLCJhcHBpdW1Ecml2ZXIiLCJBcHBpdW1Ecml2ZXIiLCJEcml2ZXJDb25maWciLCJhcHBpdW1Ib21lIiwiUGx1Z2luQ29uZmlnIiwicm91dGVDb25maWd1cmluZ0Z1bmN0aW9uIiwic2VydmVyVXBkYXRlcnMiLCJleHRyYU1ldGhvZE1hcCIsInNlcnZlck9wdHMiLCJob3N0bmFtZSIsImFsbG93Q29ycyIsImJhc2VQYXRoIiwia2VlcEFsaXZlVGltZW91dCIsInNlcnZlciIsIm5vZGVjb25maWciLCJjbG9zZSIsInNpZ25hbCIsIm9uY2UiLCJvblNpZ25hbCIsImRlbGV0ZUFsbFNlc3Npb25zIiwiZm9yY2UiLCJyZWFzb24iLCJlIiwicHJpbnQiLCJwIiwibW9kdWxlIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBS0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7OztBQUdBLGVBQWVBLGVBQWYsQ0FBZ0M7QUFBQ0MsRUFBQUEsTUFBRDtBQUFTQyxFQUFBQSxJQUFUO0FBQWVDLEVBQUFBLFlBQWY7QUFBNkJDLEVBQUFBLFlBQTdCO0FBQTJDQyxFQUFBQSxrQkFBa0IsR0FBRztBQUFoRSxDQUFoQyxFQUF3RztBQUN0RyxNQUFJO0FBQ0Y7O0FBQ0EsUUFBSUgsSUFBSSxDQUFDSSxjQUFULEVBQXlCO0FBQ3ZCQyxNQUFBQSxPQUFPLENBQUMsVUFBRCxDQUFQLENBQW9CQyxpQkFBcEIsR0FBd0MsQ0FBQyxDQUF6QztBQUNEOztBQUNELFFBQUlOLElBQUksQ0FBQ08sVUFBVCxFQUFxQjtBQUNuQixZQUFNLHlCQUFOO0FBQ0FDLE1BQUFBLE9BQU8sQ0FB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QUFjRDs7QUFFRHFCLEVBQUFBLGFBQWEsQ0FBQzlCLElBQUksQ0FBQytCLE9BQU4sRUFBZS9CLElBQUksQ0FBQ2dDLElBQXBCLENBQWI7QUFDQS9CLEVBQUFBLFlBQVksQ0FBQ21HLEtBQWI7QUFDQWxHLEVBQUFBLFlBQVksQ0FBQ2tHLEtBQWIsQ0FBbUI5QyxhQUFhLENBQUNWLEdBQWQsQ0FBbUJ5RCxDQUFELElBQU9BLENBQUMsQ0FBQzlELFVBQTNCLENBQW5CO0FBRUEsU0FBT21ELE1BQVA7QUFDRDs7QUFFRCxJQUFJckYsT0FBTyxDQUFDdUQsSUFBUixLQUFpQjBDLE1BQXJCLEVBQTZCO0FBQzNCLDBCQUFTMUMsSUFBVDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuLy8gdHJhbnNwaWxlOm1haW5cblxuaW1wb3J0IHsgaW5pdCBhcyBsb2dzaW5rSW5pdCB9IGZyb20gJy4vbG9nc2luayc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJzsgLy8gbG9nZ2VyIG5lZWRzIHRvIHJlbWFpbiBmaXJzdCBvZiBpbXBvcnRzXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgc2VydmVyIGFzIGJhc2VTZXJ2ZXIsIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiBhcyBtYWtlUm91dGVyIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyBhc3luY2lmeSB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IGRlZmF1bHQgYXMgZ2V0UGFyc2VyLCBnZXREZWZhdWx0U2VydmVyQXJncyB9IGZyb20gJy4vY2xpL3BhcnNlcic7XG5pbXBvcnQgeyBVU0VfQUxMX1BMVUdJTlMgfSBmcm9tICcuL2NsaS9hcmdzJztcbmltcG9ydCB7IGxvZ2dlciBhcyBsb2dGYWN0b3J5LCB1dGlsIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7XG4gIHNob3dDb25maWcsIGNoZWNrTm9kZU9rLCB2YWxpZGF0ZVNlcnZlckFyZ3MsXG4gIHdhcm5Ob2RlRGVwcmVjYXRpb25zLCB2YWxpZGF0ZVRtcERpciwgZ2V0Tm9uRGVmYXVsdEFyZ3MsXG4gIGdldEdpdFJldiwgQVBQSVVNX1ZFUlxufSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgRHJpdmVyQ29uZmlnIGZyb20gJy4vZHJpdmVyLWNvbmZpZyc7XG5pbXBvcnQgUGx1Z2luQ29uZmlnIGZyb20gJy4vcGx1Z2luLWNvbmZpZyc7XG5pbXBvcnQgeyBEUklWRVJfVFlQRSwgUExVR0lOX1RZUEUgfSBmcm9tICcuL2V4dGVuc2lvbi1jb25maWcnO1xuaW1wb3J0IHsgcnVuRXh0ZW5zaW9uQ29tbWFuZCB9IGZyb20gJy4vY2xpL2V4dGVuc2lvbic7XG5pbXBvcnQgeyBBcHBpdW1Ecml2ZXIgfSBmcm9tICcuL2FwcGl1bSc7XG5pbXBvcnQgcmVnaXN0ZXJOb2RlIGZyb20gJy4vZ3JpZC1yZWdpc3Rlcic7XG5pbXBvcnQgeyBpbnNwZWN0T2JqZWN0IH0gZnJvbSAnLi91dGlscyc7XG5cblxuYXN5bmMgZnVuY3Rpb24gcHJlZmxpZ2h0Q2hlY2tzICh7cGFyc2VyLCBhcmdzLCBkcml2ZXJDb25maWcsIHBsdWdpbkNvbmZpZywgdGhyb3dJbnN0ZWFkT2ZFeGl0ID0gZmFsc2V9KSB7XG4gIHRyeSB7XG4gICAgY2hlY2tOb2RlT2soKTtcbiAgICBpZiAoYXJncy5sb25nU3RhY2t0cmFjZSkge1xuICAgICAgcmVxdWlyZSgnbG9uZ2pvaG4nKS5hc3luY190cmFjZV9saW1pdCA9IC0xO1xuICAgIH1cbiAgICBpZiAoYXJncy5zaG93Q29uZmlnKSB7XG4gICAgICBhd2FpdCBzaG93Q29uZmlnKCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuICAgIHdhcm5Ob2RlRGVwcmVjYXRpb25zKCk7XG4gICAgdmFsaWRhdGVTZXJ2ZXJBcmdzKHBhcnNlciwgYXJncyk7XG4gICAgYXdhaXQgZHJpdmVyQ29uZmlnLnJlYWQoKTtcbiAgICBhd2FpdCBwbHVnaW5Db25maWcucmVhZCgpO1xuICAgIGlmIChhcmdzLnRtcERpcikge1xuICAgICAgYXdhaXQgdmFsaWRhdGVUbXBEaXIoYXJncy50bXBEaXIpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmVycm9yKGVyci5tZXNzYWdlLnJlZCk7XG4gICAgaWYgKHRocm93SW5zdGVhZE9mRXhpdCkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsb2dOb25EZWZhdWx0QXJnc1dhcm5pbmcgKGFyZ3MpIHtcbiAgbG9nZ2VyLmluZm8oJ05vbi1kZWZhdWx0IHNlcnZlciBhcmdzOicpO1xuICBpbnNwZWN0T2JqZWN0KGFyZ3MpO1xufVxuXG5mdW5jdGlvbiBsb2dEZWZhdWx0Q2FwYWJpbGl0aWVzV2FybmluZyAoY2Fwcykge1xuICBsb2dnZXIuaW5mbygnRGVmYXVsdCBjYXBhYmlsaXRpZXMsIHdoaWNoIHdpbGwgYmUgYWRkZWQgdG8gZWFjaCByZXF1ZXN0ICcgK1xuICAgICAgICAgICAgICAndW5sZXNzIG92ZXJyaWRkZW4gYnkgZGVzaXJlZCBjYXBhYmlsaXRpZXM6Jyk7XG4gIGluc3BlY3RPYmplY3QoY2Fwcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvZ1N0YXJ0dXBJbmZvIChwYXJzZXIsIGFyZ3MpIHtcbiAgbGV0IHdlbGNvbWUgPSBgV2VsY29tZSB0byBBcHBpdW0gdiR7QVBQSVVNX1ZFUn1gO1xuICBsZXQgYXBwaXVtUmV2ID0gYXdhaXQgZ2V0R2l0UmV2KCk7XG4gIGlmIChhcHBpdW1SZXYpIHtcbiAgICB3ZWxjb21lICs9IGAgKFJFViAke2FwcGl1bVJldn0pYDtcbiAgfVxuICBsb2dnZXIuaW5mbyh3ZWxjb21lKTtcblxuICBsZXQgc2hvd0FyZ3MgPSBnZXROb25EZWZhdWx0QXJncyhwYXJzZXIsIGFyZ3MpO1xuICBpZiAoXy5zaXplKHNob3dBcmdzKSkge1xuICAgIGxvZ05vbkRlZmF1bHRBcmdzV2FybmluZyhzaG93QXJncyk7XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkoYXJncy5kZWZhdWx0Q2FwYWJpbGl0aWVzKSkge1xuICAgIGxvZ0RlZmF1bHRDYXBhYmlsaXRpZXNXYXJuaW5nKGFyZ3MuZGVmYXVsdENhcGFiaWxpdGllcyk7XG4gIH1cbiAgLy8gVE9ETzogYnJpbmcgYmFjayBsb2dsZXZlbCByZXBvcnRpbmcgYmVsb3cgb25jZSBsb2dnZXIgaXMgZmx1c2hlZCBvdXRcbiAgLy8gbG9nZ2VyLmluZm8oJ0NvbnNvbGUgTG9nTGV2ZWw6ICcgKyBsb2dnZXIudHJhbnNwb3J0cy5jb25zb2xlLmxldmVsKTtcbiAgLy8gaWYgKGxvZ2dlci50cmFuc3BvcnRzLmZpbGUpIHtcbiAgLy8gICBsb2dnZXIuaW5mbygnRmlsZSBMb2dMZXZlbDogJyArIGxvZ2dlci50cmFuc3BvcnRzLmZpbGUubGV2ZWwpO1xuICAvLyB9XG59XG5cbmZ1bmN0aW9uIGxvZ1NlcnZlclBvcnQgKGFkZHJlc3MsIHBvcnQpIHtcbiAgbGV0IGxvZ01lc3NhZ2UgPSBgQXBwaXVtIFJFU1QgaHR0cCBpbnRlcmZhY2UgbGlzdGVuZXIgc3RhcnRlZCBvbiBgICtcbiAgICAgICAgICAgICAgICAgICBgJHthZGRyZXNzfToke3BvcnR9YDtcbiAgbG9nZ2VyLmluZm8obG9nTWVzc2FnZSk7XG59XG5cbi8qKlxuICogRmluZCBhbnkgcGx1Z2luIG5hbWUgd2hpY2ggaGFzIGJlZW4gaW5zdGFsbGVkLCBhbmQgd2hpY2ggaGFzIGJlZW4gcmVxdWVzdGVkIGZvciBhY3RpdmF0aW9uIGJ5XG4gKiB1c2luZyB0aGUgLS1wbHVnaW5zIGZsYWcsIGFuZCB0dXJuIGVhY2ggb25lIGludG8gaXRzIGNsYXNzLCBzbyB3ZSBjYW4gc2VuZCB0aGVtIGFzIG9iamVjdHMgdG9cbiAqIHRoZSBzZXJ2ZXIgaW5pdC4gV2UgYWxzbyB3YW50IHRvIHNlbmQvYXNzaWduIHRoZW0gdG8gdGhlIHVtYnJlbGxhIGRyaXZlciBzbyBpdCBjYW4gdXNlIHRoZW0gdG9cbiAqIHdyYXAgY29tbWFuZCBleGVjdXRpb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncyAtIGFyZ3BhcnNlciBwYXJzZWQgZGljdFxuICogQHBhcmFtIHtQbHVnaW5Db25maWd9IHBsdWdpbkNvbmZpZyAtIGEgcGx1Z2luIGV4dGVuc2lvbiBjb25maWdcbiAqL1xuZnVuY3Rpb24gZ2V0QWN0aXZlUGx1Z2lucyAoYXJncywgcGx1Z2luQ29uZmlnKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhwbHVnaW5Db25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucykuZmlsdGVyKChwbHVnaW5OYW1lKSA9PlxuICAgIF8uaW5jbHVkZXMoYXJncy5wbHVnaW5zLCBwbHVnaW5OYW1lKSB8fFxuICAgIChhcmdzLnBsdWdpbnMubGVuZ3RoID09PSAxICYmIGFyZ3MucGx1Z2luc1swXSA9PT0gVVNFX0FMTF9QTFVHSU5TKVxuICApLm1hcCgocGx1Z2luTmFtZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBsb2dnZXIuaW5mbyhgQXR0ZW1wdGluZyB0byBsb2FkIHBsdWdpbiAke3BsdWdpbk5hbWV9Li4uYCk7XG4gICAgICBjb25zdCBQbHVnaW5DbGFzcyA9IHBsdWdpbkNvbmZpZy5yZXF1aXJlKHBsdWdpbk5hbWUpO1xuICAgICAgUGx1Z2luQ2xhc3MucGx1Z2luTmFtZSA9IHBsdWdpbk5hbWU7IC8vIHN0b3JlIHRoZSBwbHVnaW4gbmFtZSBvbiB0aGUgY2xhc3Mgc28gaXQgY2FuIGJlIHVzZWQgbGF0ZXJcbiAgICAgIHJldHVybiBQbHVnaW5DbGFzcztcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgQ291bGQgbm90IGxvYWQgcGx1Z2luICcke3BsdWdpbk5hbWV9Jywgc28gaXQgd2lsbCBub3QgYmUgYXZhaWxhYmxlLiBFcnJvciBgICtcbiAgICAgICAgICAgICAgICAgICBgaW4gbG9hZGluZyB0aGUgcGx1Z2luIHdhczogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhlcnIuc3RhY2spO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSkuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG4vKipcbiAqIEZpbmQgYW55IGRyaXZlciBuYW1lIHdoaWNoIGhhcyBiZWVuIGluc3RhbGxlZCwgYW5kIHR1cm4gZWFjaCBvbmUgaW50byBpdHMgY2xhc3MsIHNvIHdlIGNhbiBzZW5kXG4gKiB0aGVtIGFzIG9iamVjdHMgdG8gdGhlIHNlcnZlciBpbml0IGluIGNhc2UgdGhleSBuZWVkIHRvIGFkZCBtZXRob2RzL3JvdXRlcyBvciB1cGRhdGUgdGhlIHNlcnZlci5cbiAqIElmIHRoZSAtLWRyaXZlcnMgZmxhZyB3YXMgZ2l2ZW4sIHRoaXMgbWV0aG9kIG9ubHkgbG9hZHMgdGhlIGdpdmVuIGRyaXZlcnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MgLSBhcmdwYXJzZXIgcGFyc2VkIGRpY3RcbiAqIEBwYXJhbSB7RHJpdmVyQ29uZmlnfSBkcml2ZXJDb25maWcgLSBhIGRyaXZlciBleHRlbnNpb24gY29uZmlnXG4gKi9cbmZ1bmN0aW9uIGdldEFjdGl2ZURyaXZlcnMgKGFyZ3MsIGRyaXZlckNvbmZpZykge1xuICByZXR1cm4gT2JqZWN0LmtleXMoZHJpdmVyQ29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnMpLmZpbHRlcigoZHJpdmVyTmFtZSkgPT5cbiAgICBfLmluY2x1ZGVzKGFyZ3MuZHJpdmVycywgZHJpdmVyTmFtZSkgfHwgYXJncy5kcml2ZXJzLmxlbmd0aCA9PT0gMFxuICApLm1hcCgoZHJpdmVyTmFtZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBsb2dnZXIuaW5mbyhgQXR0ZW1wdGluZyB0byBsb2FkIGRyaXZlciAke2RyaXZlck5hbWV9Li4uYCk7XG4gICAgICByZXR1cm4gZHJpdmVyQ29uZmlnLnJlcXVpcmUoZHJpdmVyTmFtZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYENvdWxkIG5vdCBsb2FkIGRyaXZlciAnJHtkcml2ZXJOYW1lfScsIHNvIGl0IHdpbGwgbm90IGJlIGF2YWlsYWJsZS4gRXJyb3IgYCArXG4gICAgICAgICAgICAgICAgICAgYGluIGxvYWRpbmcgdGhlIGRyaXZlciB3YXM6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICBsb2dnZXIuZGVidWcoZXJyLnN0YWNrKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pLmZpbHRlcihCb29sZWFuKTtcbn1cblxuZnVuY3Rpb24gZ2V0U2VydmVyVXBkYXRlcnMgKGRyaXZlckNsYXNzZXMsIHBsdWdpbkNsYXNzZXMpIHtcbiAgcmV0dXJuIFsuLi5kcml2ZXJDbGFzc2VzLCAuLi5wbHVnaW5DbGFzc2VzXS5tYXAoKGtsYXNzKSA9PiBrbGFzcy51cGRhdGVTZXJ2ZXIpLmZpbHRlcihCb29sZWFuKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXh0cmFNZXRob2RNYXAgKGRyaXZlckNsYXNzZXMsIHBsdWdpbkNsYXNzZXMpIHtcbiAgcmV0dXJuIFsuLi5kcml2ZXJDbGFzc2VzLCAuLi5wbHVnaW5DbGFzc2VzXS5yZWR1Y2UoXG4gICAgKG1hcCwga2xhc3MpID0+ICh7Li4ubWFwLCAuLi5rbGFzcy5uZXdNZXRob2RNYXB9KSxcbiAgICB7fVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtYWluIChhcmdzID0gbnVsbCkge1xuICBsZXQgcGFyc2VyID0gZ2V0UGFyc2VyKCk7XG4gIGxldCB0aHJvd0luc3RlYWRPZkV4aXQgPSBmYWxzZTtcbiAgaWYgKGFyZ3MpIHtcbiAgICAvLyBhIGNvbnRhaW5pbmcgcGFja2FnZSBwYXNzZWQgaW4gdGhlaXIgb3duIGFyZ3MsIGxldCdzIGZpbGwgdGhlbSBvdXRcbiAgICAvLyB3aXRoIGRlZmF1bHRzXG4gICAgYXJncyA9IE9iamVjdC5hc3NpZ24oe30sIGdldERlZmF1bHRTZXJ2ZXJBcmdzKCksIGFyZ3MpO1xuXG4gICAgLy8gaWYgd2UgaGF2ZSBhIGNvbnRhaW5pbmcgcGFja2FnZSBpbnN0ZWFkIG9mIHJ1bm5pbmcgYXMgYSBDTEkgcHJvY2VzcyxcbiAgICAvLyB0aGF0IHBhY2thZ2UgbWlnaHQgbm90IGFwcHJlY2lhdGUgdXMgY2FsbGluZyAncHJvY2Vzcy5leGl0JyB3aWxseS1cbiAgICAvLyBuaWxseSwgc28gZ2l2ZSBpdCB0aGUgb3B0aW9uIHRvIGhhdmUgdXMgdGhyb3cgaW5zdGVhZCBvZiBleGl0XG4gICAgaWYgKGFyZ3MudGhyb3dJbnN0ZWFkT2ZFeGl0KSB7XG4gICAgICB0aHJvd0luc3RlYWRPZkV4aXQgPSB0cnVlO1xuICAgICAgLy8gYnV0IHJlbW92ZSBpdCBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgc2VydmVyIGFyZyBwZXIgc2VcbiAgICAgIGRlbGV0ZSBhcmdzLnRocm93SW5zdGVhZE9mRXhpdDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gb3RoZXJ3aXNlIHBhcnNlIGZyb20gQ0xJXG4gICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCk7XG4gIH1cbiAgYXdhaXQgbG9nc2lua0luaXQoYXJncyk7XG5cbiAgLy8gaWYgdGhlIHVzZXIgaGFzIHJlcXVlc3RlZCB0aGUgJ2RyaXZlcicgQ0xJLCBkb24ndCBydW4gdGhlIG5vcm1hbCBzZXJ2ZXIsXG4gIC8vIGJ1dCBpbnN0ZWFkIHBhc3MgY29udHJvbCB0byB0aGUgZHJpdmVyIENMSVxuICBpZiAoYXJncy5zdWJjb21tYW5kID09PSBEUklWRVJfVFlQRSB8fCBhcmdzLnN1YmNvbW1hbmQgPT09IFBMVUdJTl9UWVBFKSB7XG4gICAgYXdhaXQgcnVuRXh0ZW5zaW9uQ29tbWFuZChhcmdzLCBhcmdzLnN1YmNvbW1hbmQpO1xuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9XG5cbiAgaWYgKGFyZ3MubG9nRmlsdGVycykge1xuICAgIGNvbnN0IHtpc3N1ZXMsIHJ1bGVzfSA9IGF3YWl0IGxvZ0ZhY3RvcnkubG9hZFNlY3VyZVZhbHVlc1ByZXByb2Nlc3NpbmdSdWxlcyhhcmdzLmxvZ0ZpbHRlcnMpO1xuICAgIGlmICghXy5pc0VtcHR5KGlzc3VlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGxvZyBmaWx0ZXJpbmcgcnVsZXMgY29uZmlnICcke2FyZ3MubG9nRmlsdGVyc30nIGhhcyBpc3N1ZXM6IGAgK1xuICAgICAgICBKU09OLnN0cmluZ2lmeShpc3N1ZXMsIG51bGwsIDIpKTtcbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eShydWxlcykpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBGb3VuZCBubyBsb2cgZmlsdGVyaW5nIHJ1bGVzIGluICcke2FyZ3MubG9nRmlsdGVyc30nLiBJcyB0aGF0IGV4cGVjdGVkP2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuaW5mbyhgTG9hZGVkICR7dXRpbC5wbHVyYWxpemUoJ2ZpbHRlcmluZyBydWxlJywgcnVsZXMubGVuZ3RoLCB0cnVlKX0gZnJvbSAnJHthcmdzLmxvZ0ZpbHRlcnN9J2ApO1xuICAgIH1cbiAgfVxuXG4gIGxldCBhcHBpdW1Ecml2ZXIgPSBuZXcgQXBwaXVtRHJpdmVyKGFyZ3MpO1xuICBjb25zdCBkcml2ZXJDb25maWcgPSBuZXcgRHJpdmVyQ29uZmlnKGFyZ3MuYXBwaXVtSG9tZSk7XG4gIC8vIHNldCB0aGUgY29uZmlnIG9uIHRoZSB1bWJyZWxsYSBkcml2ZXIgc28gaXQgY2FuIG1hdGNoIGRyaXZlcnMgdG8gY2Fwc1xuICBhcHBpdW1Ecml2ZXIuZHJpdmVyQ29uZmlnID0gZHJpdmVyQ29uZmlnO1xuICBjb25zdCBwbHVnaW5Db25maWcgPSBuZXcgUGx1Z2luQ29uZmlnKGFyZ3MuYXBwaXVtSG9tZSk7XG4gIGF3YWl0IHByZWZsaWdodENoZWNrcyh7cGFyc2VyLCBhcmdzLCBkcml2ZXJDb25maWcsIHBsdWdpbkNvbmZpZywgdGhyb3dJbnN0ZWFkT2ZFeGl0fSk7XG4gIGNvbnN0IHBsdWdpbkNsYXNzZXMgPSBnZXRBY3RpdmVQbHVnaW5zKGFyZ3MsIHBsdWdpbkNvbmZpZyk7XG4gIC8vIHNldCB0aGUgYWN0aXZlIHBsdWdpbnMgb24gdGhlIHVtYnJlbGxhIGRyaXZlciBzbyBpdCBjYW4gdXNlIHRoZW0gZm9yIGNvbW1hbmRzXG4gIGFwcGl1bURyaXZlci5wbHVnaW5DbGFzc2VzID0gcGx1Z2luQ2xhc3NlcztcbiAgYXdhaXQgbG9nU3RhcnR1cEluZm8ocGFyc2VyLCBhcmdzKTtcbiAgbGV0IHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiA9IG1ha2VSb3V0ZXIoYXBwaXVtRHJpdmVyKTtcblxuICBjb25zdCBkcml2ZXJDbGFzc2VzID0gZ2V0QWN0aXZlRHJpdmVycyhhcmdzLCBkcml2ZXJDb25maWcpO1xuICBjb25zdCBzZXJ2ZXJVcGRhdGVycyA9IGdldFNlcnZlclVwZGF0ZXJzKGRyaXZlckNsYXNzZXMsIHBsdWdpbkNsYXNzZXMpO1xuICBjb25zdCBleHRyYU1ldGhvZE1hcCA9IGdldEV4dHJhTWV0aG9kTWFwKGRyaXZlckNsYXNzZXMsIHBsdWdpbkNsYXNzZXMpO1xuXG4gIGNvbnN0IHNlcnZlck9wdHMgPSB7XG4gICAgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uLFxuICAgIHBvcnQ6IGFyZ3MucG9ydCxcbiAgICBob3N0bmFtZTogYXJncy5hZGRyZXNzLFxuICAgIGFsbG93Q29yczogYXJncy5hbGxvd0NvcnMsXG4gICAgYmFzZVBhdGg6IGFyZ3MuYmFzZVBhdGgsXG4gICAgc2VydmVyVXBkYXRlcnMsXG4gICAgZXh0cmFNZXRob2RNYXAsXG4gIH07XG4gIGlmIChhcmdzLmtlZXBBbGl2ZVRpbWVvdXQpIHtcbiAgICBzZXJ2ZXJPcHRzLmtlZXBBbGl2ZVRpbWVvdXQgPSBhcmdzLmtlZXBBbGl2ZVRpbWVvdXQgKiAxMDAwO1xuICB9XG4gIGxldCBzZXJ2ZXI7XG4gIHRyeSB7XG4gICAgc2VydmVyID0gYXdhaXQgYmFzZVNlcnZlcihzZXJ2ZXJPcHRzKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmVycm9yKGBDb3VsZCBub3QgY29uZmlndXJlIEFwcGl1bSBzZXJ2ZXIuIEl0J3MgcG9zc2libGUgdGhhdCBhIGRyaXZlciBvciBwbHVnaW4gdHJpZWQgYCArXG4gICAgICAgICAgICAgICAgIGB0byB1cGRhdGUgdGhlIHNlcnZlciBhbmQgZmFpbGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICBsb2dnZXIuZGVidWcoZXJyLnN0YWNrKTtcbiAgICByZXR1cm4gcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKGFyZ3MuYWxsb3dDb3JzKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1lvdSBoYXZlIGVuYWJsZWQgQ09SUyByZXF1ZXN0cyBmcm9tIGFueSBob3N0LiBCZSBjYXJlZnVsIG5vdCAnICtcbiAgICAgICAgICAgICAgICAndG8gdmlzaXQgc2l0ZXMgd2hpY2ggY291bGQgbWFsaWNpb3VzbHkgdHJ5IHRvIHN0YXJ0IEFwcGl1bSAnICtcbiAgICAgICAgICAgICAgICAnc2Vzc2lvbnMgb24geW91ciBtYWNoaW5lJyk7XG4gIH1cbiAgYXBwaXVtRHJpdmVyLnNlcnZlciA9IHNlcnZlcjtcbiAgdHJ5IHtcbiAgICAvLyBjb25maWd1cmUgYXMgbm9kZSBvbiBncmlkLCBpZiBuZWNlc3NhcnlcbiAgICBpZiAoYXJncy5ub2RlY29uZmlnICE9PSBudWxsKSB7XG4gICAgICBhd2FpdCByZWdpc3Rlck5vZGUoYXJncy5ub2RlY29uZmlnLCBhcmdzLmFkZHJlc3MsIGFyZ3MucG9ydCwgYXJncy5iYXNlUGF0aCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBhd2FpdCBzZXJ2ZXIuY2xvc2UoKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJ10pIHtcbiAgICBwcm9jZXNzLm9uY2Uoc2lnbmFsLCBhc3luYyBmdW5jdGlvbiBvblNpZ25hbCAoKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgUmVjZWl2ZWQgJHtzaWduYWx9IC0gc2h1dHRpbmcgZG93bmApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgYXBwaXVtRHJpdmVyLmRlbGV0ZUFsbFNlc3Npb25zKHtcbiAgICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgICByZWFzb246IGBUaGUgcHJvY2VzcyBoYXMgcmVjZWl2ZWQgJHtzaWduYWx9IHNpZ25hbGAsXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIud2FybihlKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbG9nU2VydmVyUG9ydChhcmdzLmFkZHJlc3MsIGFyZ3MucG9ydCk7XG4gIGRyaXZlckNvbmZpZy5wcmludCgpO1xuICBwbHVnaW5Db25maWcucHJpbnQocGx1Z2luQ2xhc3Nlcy5tYXAoKHApID0+IHAucGx1Z2luTmFtZSkpO1xuXG4gIHJldHVybiBzZXJ2ZXI7XG59XG5cbmlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuICBhc3luY2lmeShtYWluKTtcbn1cblxuZXhwb3J0IHsgbWFpbiB9O1xuIl0sImZpbGUiOiJsaWIvbWFpbi5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
362
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9tYWluLmpzIl0sIm5hbWVzIjpbInByZWZsaWdodENoZWNrcyIsImFyZ3MiLCJ0aHJvd0luc3RlYWRPZkV4aXQiLCJsb25nU3RhY2t0cmFjZSIsInJlcXVpcmUiLCJhc3luY190cmFjZV9saW1pdCIsInNob3dDb25maWciLCJwcm9jZXNzIiwiZXhpdCIsInRtcERpciIsImVyciIsImxvZ2dlciIsImVycm9yIiwibWVzc2FnZSIsInJlZCIsImxvZ05vbkRlZmF1bHRBcmdzV2FybmluZyIsImluZm8iLCJsb2dEZWZhdWx0Q2FwYWJpbGl0aWVzV2FybmluZyIsImNhcHMiLCJsb2dTdGFydHVwSW5mbyIsInBhcnNlciIsIndlbGNvbWUiLCJBUFBJVU1fVkVSIiwiYXBwaXVtUmV2Iiwic2hvd0FyZ3MiLCJfIiwic2l6ZSIsImlzRW1wdHkiLCJkZWZhdWx0Q2FwYWJpbGl0aWVzIiwibG9nU2VydmVyUG9ydCIsImFkZHJlc3MiLCJwb3J0IiwibG9nTWVzc2FnZSIsImdldEFjdGl2ZVBsdWdpbnMiLCJwbHVnaW5Db25maWciLCJjb21wYWN0IiwiT2JqZWN0Iiwia2V5cyIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJmaWx0ZXIiLCJwbHVnaW5OYW1lIiwiaW5jbHVkZXMiLCJ1c2VQbHVnaW5zIiwibGVuZ3RoIiwiVVNFX0FMTF9QTFVHSU5TIiwibWFwIiwiUGx1Z2luQ2xhc3MiLCJkZWJ1ZyIsInN0YWNrIiwiZ2V0QWN0aXZlRHJpdmVycyIsImRyaXZlckNvbmZpZyIsImRyaXZlck5hbWUiLCJ1c2VEcml2ZXJzIiwiZ2V0U2VydmVyVXBkYXRlcnMiLCJkcml2ZXJDbGFzc2VzIiwicGx1Z2luQ2xhc3NlcyIsImtsYXNzIiwidXBkYXRlU2VydmVyIiwiQm9vbGVhbiIsImdldEV4dHJhTWV0aG9kTWFwIiwicmVkdWNlIiwibmV3TWV0aG9kTWFwIiwiaW5pdCIsInBhcnNlZEFyZ3MiLCJzdWJjb21tYW5kIiwiU0VSVkVSX1NVQkNPTU1BTkQiLCJwYXJzZUFyZ3MiLCJjb25maWdSZXN1bHQiLCJjb25maWdGaWxlIiwiZXJyb3JzIiwiRXJyb3IiLCJmaWxlcGF0aCIsInJlYXNvbiIsImRlZmF1bHRzRGVlcCIsImNvbmZpZyIsInNlcnZlciIsIkRSSVZFUl9UWVBFIiwiUExVR0lOX1RZUEUiLCJsb2dGaWx0ZXJzIiwiaXNzdWVzIiwicnVsZXMiLCJsb2dGYWN0b3J5IiwibG9hZFNlY3VyZVZhbHVlc1ByZXByb2Nlc3NpbmdSdWxlcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ3YXJuIiwidXRpbCIsInBsdXJhbGl6ZSIsImFwcGl1bURyaXZlciIsIkFwcGl1bURyaXZlciIsIm1haW4iLCJyb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24iLCJzZXJ2ZXJVcGRhdGVycyIsImV4dHJhTWV0aG9kTWFwIiwic2VydmVyT3B0cyIsImhvc3RuYW1lIiwiYWxsb3dDb3JzIiwiYmFzZVBhdGgiLCJrZWVwQWxpdmVUaW1lb3V0Iiwibm9kZWNvbmZpZyIsImNsb3NlIiwic2lnbmFsIiwib25jZSIsIm9uU2lnbmFsIiwiZGVsZXRlQWxsU2Vzc2lvbnMiLCJmb3JjZSIsImUiLCJwcmludCIsInAiLCJtb2R1bGUiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7OztBQU9BLGVBQWVBLGVBQWYsQ0FBZ0NDLElBQWhDLEVBQXNDQyxrQkFBa0IsR0FBRyxLQUEzRCxFQUFrRTtBQUNoRSxNQUFJO0FBQ0Y7O0FBQ0EsUUFBSUQsSUFBSSxDQUFDRSxjQUFULEVBQXlCO0FBQ3ZCQyxNQUFBQSxPQUFPLENBQUMsVUFBRCxDQUFQLENBQW9CQyxpQkFBcEIsR0FBd0MsQ0FBQyxDQUF6QztBQUNEOztBQUNELFFBQUlKLElBQUksQ0FBQ0ssVUFBVCxFQUFxQjtBQUNuQixZQUFNLHlC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RixJQUFSLEtBQWlCbUIsTUFBckIsRUFBNkI7QUFDM0IsMEJBQVNuQixJQUFUO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbi8vIHRyYW5zcGlsZTptYWluXG4vLyBAdHMtY2hlY2tcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uIGFzIG1ha2VSb3V0ZXIsIHNlcnZlciBhcyBiYXNlU2VydmVyIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyBsb2dnZXIgYXMgbG9nRmFjdG9yeSwgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBhc3luY2lmeSB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBBcHBpdW1Ecml2ZXIgfSBmcm9tICcuL2FwcGl1bSc7XG5pbXBvcnQgeyBkcml2ZXJDb25maWcsIHBsdWdpbkNvbmZpZywgVVNFX0FMTF9QTFVHSU5TIH0gZnJvbSAnLi9jbGkvYXJncyc7XG5pbXBvcnQgeyBydW5FeHRlbnNpb25Db21tYW5kIH0gZnJvbSAnLi9jbGkvZXh0ZW5zaW9uJztcbmltcG9ydCB7IGRlZmF1bHQgYXMgZ2V0UGFyc2VyLCBTRVJWRVJfU1VCQ09NTUFORCB9IGZyb20gJy4vY2xpL3BhcnNlcic7XG5pbXBvcnQgeyBBUFBJVU1fVkVSLCBjaGVja05vZGVPaywgZ2V0R2l0UmV2LCBnZXROb25EZWZhdWx0U2VydmVyQXJncywgc2hvd0NvbmZpZywgdmFsaWRhdGVUbXBEaXIsIHdhcm5Ob2RlRGVwcmVjYXRpb25zIH0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHsgcmVhZENvbmZpZ0ZpbGUgfSBmcm9tICcuL2NvbmZpZy1maWxlJztcbmltcG9ydCB7IERSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRSB9IGZyb20gJy4vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQgcmVnaXN0ZXJOb2RlIGZyb20gJy4vZ3JpZC1yZWdpc3Rlcic7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJzsgLy8gbG9nZ2VyIG5lZWRzIHRvIHJlbWFpbiBmaXJzdCBvZiBpbXBvcnRzXG5pbXBvcnQgeyBpbml0IGFzIGxvZ3NpbmtJbml0IH0gZnJvbSAnLi9sb2dzaW5rJztcbmltcG9ydCB7IGdldERlZmF1bHRzRnJvbVNjaGVtYSwgdmFsaWRhdGUgfSBmcm9tICcuL3NjaGVtYS9zY2hlbWEnO1xuaW1wb3J0IHsgaW5zcGVjdE9iamVjdCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge1BhcnNlZEFyZ3N9IGFyZ3NcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Rocm93SW5zdGVhZE9mRXhpdF1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJlZmxpZ2h0Q2hlY2tzIChhcmdzLCB0aHJvd0luc3RlYWRPZkV4aXQgPSBmYWxzZSkge1xuICB0cnkge1xuICAgIGNoZWNrTm9kZU9rKCk7XG4gICAgaWYgKGFyZ3MubG9uZ1N0YWNrdHJhY2UpIHtcbiAgICAgIHJlcXVpcmUoJ2xvbmdqb2huJykuYXN5bmNfdHJhY2VfbGltaXQgPSAtMTtcbiAgICB9XG4gICAgaWYgKGFyZ3Muc2hvd0NvbmZpZykge1xuICAgICAgYXdhaXQgc2hvd0NvbmZpZygpO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cbiAgICB3YXJuTm9kZURlcHJlY2F0aW9ucygpO1xuXG4gICAgdmFsaWRhdGUoYXJncyk7XG5cbiAgICBpZiAoYXJncy50bXBEaXIpIHtcbiAgICAgIGF3YWl0IHZhbGlkYXRlVG1wRGlyKGFyZ3MudG1wRGlyKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5lcnJvcihlcnIubWVzc2FnZS5yZWQpO1xuICAgIGlmICh0aHJvd0luc3RlYWRPZkV4aXQpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbG9nTm9uRGVmYXVsdEFyZ3NXYXJuaW5nIChhcmdzKSB7XG4gIGxvZ2dlci5pbmZvKCdOb24tZGVmYXVsdCBzZXJ2ZXIgYXJnczonKTtcbiAgaW5zcGVjdE9iamVjdChhcmdzKTtcbn1cblxuZnVuY3Rpb24gbG9nRGVmYXVsdENhcGFiaWxpdGllc1dhcm5pbmcgKGNhcHMpIHtcbiAgbG9nZ2VyLmluZm8oJ0RlZmF1bHQgY2FwYWJpbGl0aWVzLCB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIGVhY2ggcmVxdWVzdCAnICtcbiAgICAgICAgICAgICAgJ3VubGVzcyBvdmVycmlkZGVuIGJ5IGRlc2lyZWQgY2FwYWJpbGl0aWVzOicpO1xuICBpbnNwZWN0T2JqZWN0KGNhcHMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2dTdGFydHVwSW5mbyAocGFyc2VyLCBhcmdzKSB7XG4gIGxldCB3ZWxjb21lID0gYFdlbGNvbWUgdG8gQXBwaXVtIHYke0FQUElVTV9WRVJ9YDtcbiAgbGV0IGFwcGl1bVJldiA9IGF3YWl0IGdldEdpdFJldigpO1xuICBpZiAoYXBwaXVtUmV2KSB7XG4gICAgd2VsY29tZSArPSBgIChSRVYgJHthcHBpdW1SZXZ9KWA7XG4gIH1cbiAgbG9nZ2VyLmluZm8od2VsY29tZSk7XG5cbiAgbGV0IHNob3dBcmdzID0gZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MocGFyc2VyLCBhcmdzKTtcbiAgaWYgKF8uc2l6ZShzaG93QXJncykpIHtcbiAgICBsb2dOb25EZWZhdWx0QXJnc1dhcm5pbmcoc2hvd0FyZ3MpO1xuICB9XG4gIGlmICghXy5pc0VtcHR5KGFyZ3MuZGVmYXVsdENhcGFiaWxpdGllcykpIHtcbiAgICBsb2dEZWZhdWx0Q2FwYWJpbGl0aWVzV2FybmluZyhhcmdzLmRlZmF1bHRDYXBhYmlsaXRpZXMpO1xuICB9XG4gIC8vIFRPRE86IGJyaW5nIGJhY2sgbG9nbGV2ZWwgcmVwb3J0aW5nIGJlbG93IG9uY2UgbG9nZ2VyIGlzIGZsdXNoZWQgb3V0XG4gIC8vIGxvZ2dlci5pbmZvKCdDb25zb2xlIExvZ0xldmVsOiAnICsgbG9nZ2VyLnRyYW5zcG9ydHMuY29uc29sZS5sZXZlbCk7XG4gIC8vIGlmIChsb2dnZXIudHJhbnNwb3J0cy5maWxlKSB7XG4gIC8vICAgbG9nZ2VyLmluZm8oJ0ZpbGUgTG9nTGV2ZWw6ICcgKyBsb2dnZXIudHJhbnNwb3J0cy5maWxlLmxldmVsKTtcbiAgLy8gfVxufVxuXG5mdW5jdGlvbiBsb2dTZXJ2ZXJQb3J0IChhZGRyZXNzLCBwb3J0KSB7XG4gIGxldCBsb2dNZXNzYWdlID0gYEFwcGl1bSBSRVNUIGh0dHAgaW50ZXJmYWNlIGxpc3RlbmVyIHN0YXJ0ZWQgb24gYCArXG4gICAgICAgICAgICAgICAgICAgYCR7YWRkcmVzc306JHtwb3J0fWA7XG4gIGxvZ2dlci5pbmZvKGxvZ01lc3NhZ2UpO1xufVxuXG4vKipcbiAqIEZpbmQgYW55IHBsdWdpbiBuYW1lIHdoaWNoIGhhcyBiZWVuIGluc3RhbGxlZCwgYW5kIHdoaWNoIGhhcyBiZWVuIHJlcXVlc3RlZCBmb3IgYWN0aXZhdGlvbiBieVxuICogdXNpbmcgdGhlIC0tcGx1Z2lucyBmbGFnLCBhbmQgdHVybiBlYWNoIG9uZSBpbnRvIGl0cyBjbGFzcywgc28gd2UgY2FuIHNlbmQgdGhlbSBhcyBvYmplY3RzIHRvXG4gKiB0aGUgc2VydmVyIGluaXQuIFdlIGFsc28gd2FudCB0byBzZW5kL2Fzc2lnbiB0aGVtIHRvIHRoZSB1bWJyZWxsYSBkcml2ZXIgc28gaXQgY2FuIHVzZSB0aGVtIHRvXG4gKiB3cmFwIGNvbW1hbmQgZXhlY3V0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MgLSBhcmdwYXJzZXIgcGFyc2VkIGRpY3RcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3BsdWdpbi1jb25maWcnKS5kZWZhdWx0fSBwbHVnaW5Db25maWcgLSBhIHBsdWdpbiBleHRlbnNpb24gY29uZmlnXG4gKiBAcmV0dXJucyB7KHtwbHVnaW5OYW1lOiBzdHJpbmd9ICYgKCguLi5hcmdzOiBhbnlbXSkgPT4gdW5rbm93bikpW119XG4gKi9cbmZ1bmN0aW9uIGdldEFjdGl2ZVBsdWdpbnMgKGFyZ3MsIHBsdWdpbkNvbmZpZykge1xuICByZXR1cm4gXy5jb21wYWN0KE9iamVjdC5rZXlzKHBsdWdpbkNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zKS5maWx0ZXIoKHBsdWdpbk5hbWUpID0+XG4gICAgXy5pbmNsdWRlcyhhcmdzLnVzZVBsdWdpbnMsIHBsdWdpbk5hbWUpIHx8XG4gICAgKGFyZ3MudXNlUGx1Z2lucy5sZW5ndGggPT09IDEgJiYgYXJncy51c2VQbHVnaW5zWzBdID09PSBVU0VfQUxMX1BMVUdJTlMpXG4gICkubWFwKChwbHVnaW5OYW1lKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGxvZ2dlci5pbmZvKGBBdHRlbXB0aW5nIHRvIGxvYWQgcGx1Z2luICR7cGx1Z2luTmFtZX0uLi5gKTtcbiAgICAgIGNvbnN0IFBsdWdpbkNsYXNzID0gLyoqIEB0eXBlIHt7cGx1Z2luTmFtZTogc3RyaW5nfSAmICgoLi4uYXJnczogYW55W10pID0+IHVua25vd24pfSAqLyhwbHVnaW5Db25maWcucmVxdWlyZShwbHVnaW5OYW1lKSk7XG5cbiAgICAgIFBsdWdpbkNsYXNzLnBsdWdpbk5hbWUgPSBwbHVnaW5OYW1lOyAvLyBzdG9yZSB0aGUgcGx1Z2luIG5hbWUgb24gdGhlIGNsYXNzIHNvIGl0IGNhbiBiZSB1c2VkIGxhdGVyXG4gICAgICByZXR1cm4gUGx1Z2luQ2xhc3M7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYENvdWxkIG5vdCBsb2FkIHBsdWdpbiAnJHtwbHVnaW5OYW1lfScsIHNvIGl0IHdpbGwgbm90IGJlIGF2YWlsYWJsZS4gRXJyb3IgYCArXG4gICAgICAgICAgICAgICAgICAgYGluIGxvYWRpbmcgdGhlIHBsdWdpbiB3YXM6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICBsb2dnZXIuZGVidWcoZXJyLnN0YWNrKTtcbiAgICB9XG4gIH0pKTtcbn1cblxuLyoqXG4gKiBGaW5kIGFueSBkcml2ZXIgbmFtZSB3aGljaCBoYXMgYmVlbiBpbnN0YWxsZWQsIGFuZCB0dXJuIGVhY2ggb25lIGludG8gaXRzIGNsYXNzLCBzbyB3ZSBjYW4gc2VuZFxuICogdGhlbSBhcyBvYmplY3RzIHRvIHRoZSBzZXJ2ZXIgaW5pdCBpbiBjYXNlIHRoZXkgbmVlZCB0byBhZGQgbWV0aG9kcy9yb3V0ZXMgb3IgdXBkYXRlIHRoZSBzZXJ2ZXIuXG4gKiBJZiB0aGUgLS1kcml2ZXJzIGZsYWcgd2FzIGdpdmVuLCB0aGlzIG1ldGhvZCBvbmx5IGxvYWRzIHRoZSBnaXZlbiBkcml2ZXJzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzIC0gYXJncGFyc2VyIHBhcnNlZCBkaWN0XG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9kcml2ZXItY29uZmlnJykuZGVmYXVsdH0gZHJpdmVyQ29uZmlnIC0gYSBkcml2ZXIgZXh0ZW5zaW9uIGNvbmZpZ1xuICovXG5mdW5jdGlvbiBnZXRBY3RpdmVEcml2ZXJzIChhcmdzLCBkcml2ZXJDb25maWcpIHtcbiAgcmV0dXJuIF8uY29tcGFjdChPYmplY3Qua2V5cyhkcml2ZXJDb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucykuZmlsdGVyKChkcml2ZXJOYW1lKSA9PlxuICAgIF8uaW5jbHVkZXMoYXJncy51c2VEcml2ZXJzLCBkcml2ZXJOYW1lKSB8fCBhcmdzLnVzZURyaXZlcnMubGVuZ3RoID09PSAwXG4gICkubWFwKChkcml2ZXJOYW1lKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGxvZ2dlci5pbmZvKGBBdHRlbXB0aW5nIHRvIGxvYWQgZHJpdmVyICR7ZHJpdmVyTmFtZX0uLi5gKTtcbiAgICAgIHJldHVybiBkcml2ZXJDb25maWcucmVxdWlyZShkcml2ZXJOYW1lKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgQ291bGQgbm90IGxvYWQgZHJpdmVyICcke2RyaXZlck5hbWV9Jywgc28gaXQgd2lsbCBub3QgYmUgYXZhaWxhYmxlLiBFcnJvciBgICtcbiAgICAgICAgICAgICAgICAgICBgaW4gbG9hZGluZyB0aGUgZHJpdmVyIHdhczogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhlcnIuc3RhY2spO1xuICAgIH1cbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBnZXRTZXJ2ZXJVcGRhdGVycyAoZHJpdmVyQ2xhc3NlcywgcGx1Z2luQ2xhc3Nlcykge1xuICByZXR1cm4gWy4uLmRyaXZlckNsYXNzZXMsIC4uLnBsdWdpbkNsYXNzZXNdLm1hcCgoa2xhc3MpID0+IGtsYXNzLnVwZGF0ZVNlcnZlcikuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5mdW5jdGlvbiBnZXRFeHRyYU1ldGhvZE1hcCAoZHJpdmVyQ2xhc3NlcywgcGx1Z2luQ2xhc3Nlcykge1xuICByZXR1cm4gWy4uLmRyaXZlckNsYXNzZXMsIC4uLnBsdWdpbkNsYXNzZXNdLnJlZHVjZShcbiAgICAobWFwLCBrbGFzcykgPT4gKHsuLi5tYXAsIC4uLmtsYXNzLm5ld01ldGhvZE1hcH0pLFxuICAgIHt9XG4gICk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgQXBwaXVtLCBidXQgZG9lcyBub3Qgc3RhcnQgdGhlIHNlcnZlci5cbiAqXG4gKiBVc2UgdGhpcyB0byBnZXQgYXQgdGhlIGNvbmZpZ3VyYXRpb24gc2NoZW1hLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQge2luaXQsIGdldFNjaGVtYX0gZnJvbSAnYXBwaXVtJztcbiAqIGNvbnN0IG9wdGlvbnMgPSB7fTsgLy8gY29uZmlnIG9iamVjdFxuICogYXdhaXQgaW5pdChvcHRpb25zKTtcbiAqIGNvbnN0IHNjaGVtYSA9IGdldFNjaGVtYSgpOyAvLyBlbnRpcmUgY29uZmlnIHNjaGVtYSBpbmNsdWRpbmcgcGx1Z2lucyBhbmQgZHJpdmVyc1xuICogQHBhcmFtIHtQYXJzZWRBcmdzfSBbYXJnc10gLSBQYXJzZWQgYXJnc1xuICogQHJldHVybnMge1Byb21pc2U8e3BhcnNlcjogaW1wb3J0KCcuL2NsaS9wYXJzZXInKS5BcmdQYXJzZXJ9ICYgUGFydGlhbDx7YXBwaXVtRHJpdmVyOiBBcHBpdW1Ecml2ZXIsIHBhcnNlZEFyZ3M6IFBhcnNlZEFyZ3N9Pj59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXQgKGFyZ3MpIHtcbiAgY29uc3QgcGFyc2VyID0gYXdhaXQgZ2V0UGFyc2VyKCk7XG4gIGxldCB0aHJvd0luc3RlYWRPZkV4aXQgPSBmYWxzZTtcbiAgLyoqIEB0eXBlIHtQYXJzZWRBcmdzfSAqL1xuICBsZXQgcGFyc2VkQXJncztcbiAgaWYgKGFyZ3MpIHtcbiAgICAvLyBpZiB3ZSBoYXZlIGEgY29udGFpbmluZyBwYWNrYWdlIGluc3RlYWQgb2YgcnVubmluZyBhcyBhIENMSSBwcm9jZXNzLFxuICAgIC8vIHRoYXQgcGFja2FnZSBtaWdodCBub3QgYXBwcmVjaWF0ZSB1cyBjYWxsaW5nICdwcm9jZXNzLmV4aXQnIHdpbGx5LVxuICAgIC8vIG5pbGx5LCBzbyBnaXZlIGl0IHRoZSBvcHRpb24gdG8gaGF2ZSB1cyB0aHJvdyBpbnN0ZWFkIG9mIGV4aXRcbiAgICBpZiAoYXJncy50aHJvd0luc3RlYWRPZkV4aXQpIHtcbiAgICAgIHRocm93SW5zdGVhZE9mRXhpdCA9IHRydWU7XG4gICAgICAvLyBidXQgcmVtb3ZlIGl0IHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBzZXJ2ZXIgYXJnIHBlciBzZVxuICAgICAgZGVsZXRlIGFyZ3MudGhyb3dJbnN0ZWFkT2ZFeGl0O1xuICAgIH1cbiAgICBwYXJzZWRBcmdzID0gey4uLmFyZ3MsIHN1YmNvbW1hbmQ6IGFyZ3Muc3ViY29tbWFuZCA/PyBTRVJWRVJfU1VCQ09NTUFORH07XG4gIH0gZWxzZSB7XG4gICAgLy8gb3RoZXJ3aXNlIHBhcnNlIGZyb20gQ0xJXG4gICAgcGFyc2VkQXJncyA9IHBhcnNlci5wYXJzZUFyZ3MoKTtcbiAgfVxuXG4gIGNvbnN0IGNvbmZpZ1Jlc3VsdCA9IGF3YWl0IHJlYWRDb25maWdGaWxlKHBhcnNlZEFyZ3MuY29uZmlnRmlsZSk7XG5cbiAgaWYgKCFfLmlzRW1wdHkoY29uZmlnUmVzdWx0LmVycm9ycykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9ycyBpbiBjb25maWcgZmlsZSAke2NvbmZpZ1Jlc3VsdC5maWxlcGF0aH06XFxuICR7Y29uZmlnUmVzdWx0LnJlYXNvbiA/PyBjb25maWdSZXN1bHQuZXJyb3JzfWApO1xuICB9XG5cbiAgLy8gbWVyZ2UgY29uZmlnIGFuZCBhcHBseSBkZWZhdWx0cy5cbiAgLy8gdGhlIG9yZGVyIG9mIHByZWNlbmRlY2UgaXM6XG4gIC8vIDEuIGNvbW1hbmQgbGluZSBhcmdzXG4gIC8vIDIuIGNvbmZpZyBmaWxlXG4gIC8vIDMuIGRlZmF1bHRzIGZyb20gY29uZmlnIGZpbGUuXG4gIGlmIChwYXJzZWRBcmdzLnN1YmNvbW1hbmQgPT09IFNFUlZFUl9TVUJDT01NQU5EKSB7XG4gICAgcGFyc2VkQXJncyA9IF8uZGVmYXVsdHNEZWVwKFxuICAgICAgcGFyc2VkQXJncyxcbiAgICAgIGNvbmZpZ1Jlc3VsdC5jb25maWc/LnNlcnZlcixcbiAgICAgIGdldERlZmF1bHRzRnJvbVNjaGVtYSgpXG4gICAgKTtcbiAgfVxuXG4gIHBhcnNlZEFyZ3MgPSBfLmRlZmF1bHRzRGVlcChcbiAgICBwYXJzZWRBcmdzLFxuICAgIGNvbmZpZ1Jlc3VsdC5jb25maWcgPz8ge30sXG4gICk7XG5cbiAgYXdhaXQgbG9nc2lua0luaXQocGFyc2VkQXJncyk7XG5cbiAgLy8gaWYgdGhlIHVzZXIgaGFzIHJlcXVlc3RlZCB0aGUgJ2RyaXZlcicgQ0xJLCBkb24ndCBydW4gdGhlIG5vcm1hbCBzZXJ2ZXIsXG4gIC8vIGJ1dCBpbnN0ZWFkIHBhc3MgY29udHJvbCB0byB0aGUgZHJpdmVyIENMSVxuICBpZiAocGFyc2VkQXJncy5zdWJjb21tYW5kID09PSBEUklWRVJfVFlQRSkge1xuICAgIGF3YWl0IHJ1bkV4dGVuc2lvbkNvbW1hbmQocGFyc2VkQXJncywgcGFyc2VkQXJncy5zdWJjb21tYW5kLCBkcml2ZXJDb25maWcpO1xuICAgIHJldHVybiB7cGFyc2VyfTtcbiAgfVxuICBpZiAocGFyc2VkQXJncy5zdWJjb21tYW5kID09PSBQTFVHSU5fVFlQRSkge1xuICAgIGF3YWl0IHJ1bkV4dGVuc2lvbkNvbW1hbmQocGFyc2VkQXJncywgcGFyc2VkQXJncy5zdWJjb21tYW5kLCBwbHVnaW5Db25maWcpO1xuICAgIHJldHVybiB7cGFyc2VyfTtcbiAgfVxuXG4gIGlmIChwYXJzZWRBcmdzLmxvZ0ZpbHRlcnMpIHtcbiAgICBjb25zdCB7aXNzdWVzLCBydWxlc30gPSBhd2FpdCBsb2dGYWN0b3J5LmxvYWRTZWN1cmVWYWx1ZXNQcmVwcm9jZXNzaW5nUnVsZXMocGFyc2VkQXJncy5sb2dGaWx0ZXJzKTtcbiAgICBpZiAoIV8uaXNFbXB0eShpc3N1ZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBsb2cgZmlsdGVyaW5nIHJ1bGVzIGNvbmZpZyAnJHtwYXJzZWRBcmdzLmxvZ0ZpbHRlcnN9JyBoYXMgaXNzdWVzOiBgICtcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoaXNzdWVzLCBudWxsLCAyKSk7XG4gICAgfVxuICAgIGlmIChfLmlzRW1wdHkocnVsZXMpKSB7XG4gICAgICBsb2dnZXIud2FybihgRm91bmQgbm8gbG9nIGZpbHRlcmluZyBydWxlcyBpbiAnJHtwYXJzZWRBcmdzLmxvZ0ZpbHRlcnN9Jy4gSXMgdGhhdCBleHBlY3RlZD9gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmluZm8oYExvYWRlZCAke3V0aWwucGx1cmFsaXplKCdmaWx0ZXJpbmcgcnVsZScsIHJ1bGVzLmxlbmd0aCwgdHJ1ZSl9IGZyb20gJyR7cGFyc2VkQXJncy5sb2dGaWx0ZXJzfSdgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBhcHBpdW1Ecml2ZXIgPSBuZXcgQXBwaXVtRHJpdmVyKHBhcnNlZEFyZ3MpO1xuICAvLyBzZXQgdGhlIGNvbmZpZyBvbiB0aGUgdW1icmVsbGEgZHJpdmVyIHNvIGl0IGNhbiBtYXRjaCBkcml2ZXJzIHRvIGNhcHNcbiAgYXBwaXVtRHJpdmVyLmRyaXZlckNvbmZpZyA9IGRyaXZlckNvbmZpZztcbiAgYXdhaXQgcHJlZmxpZ2h0Q2hlY2tzKHBhcnNlZEFyZ3MsIHRocm93SW5zdGVhZE9mRXhpdCk7XG5cbiAgcmV0dXJuIHtwYXJzZXIsIGFwcGl1bURyaXZlciwgcGFyc2VkQXJnc307XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7UGFyc2VkQXJnc30gW2FyZ3NdXG4gKiBAcmV0dXJuc1xuICovXG5hc3luYyBmdW5jdGlvbiBtYWluIChhcmdzKSB7XG4gIGNvbnN0IHtwYXJzZXIsIGFwcGl1bURyaXZlciwgcGFyc2VkQXJnc30gPSBhd2FpdCBpbml0KGFyZ3MpO1xuXG4gIGlmICghYXBwaXVtRHJpdmVyIHx8ICFwYXJzZWRBcmdzKSB7XG4gICAgLy8gaWYgdGhpcyBicmFuY2ggaXMgdGFrZW4sIHdlJ3ZlIHJ1biBhIGRpZmZlcmVudCBzdWJjb21tYW5kLCBzbyB0aGVyZSdzIG5vdGhpbmdcbiAgICAvLyBsZWZ0IHRvIGRvIGhlcmUuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGx1Z2luQ2xhc3NlcyA9IGdldEFjdGl2ZVBsdWdpbnMocGFyc2VkQXJncywgcGx1Z2luQ29uZmlnKTtcbiAgLy8gc2V0IHRoZSBhY3RpdmUgcGx1Z2lucyBvbiB0aGUgdW1icmVsbGEgZHJpdmVyIHNvIGl0IGNhbiB1c2UgdGhlbSBmb3IgY29tbWFuZHNcbiAgYXBwaXVtRHJpdmVyLnBsdWdpbkNsYXNzZXMgPSBwbHVnaW5DbGFzc2VzO1xuXG4gIGF3YWl0IGxvZ1N0YXJ0dXBJbmZvKHBhcnNlciwgcGFyc2VkQXJncyk7XG4gIGxldCByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24gPSBtYWtlUm91dGVyKGFwcGl1bURyaXZlcik7XG5cbiAgY29uc3QgZHJpdmVyQ2xhc3NlcyA9IGdldEFjdGl2ZURyaXZlcnMocGFyc2VkQXJncywgZHJpdmVyQ29uZmlnKTtcbiAgY29uc3Qgc2VydmVyVXBkYXRlcnMgPSBnZXRTZXJ2ZXJVcGRhdGVycyhkcml2ZXJDbGFzc2VzLCBwbHVnaW5DbGFzc2VzKTtcbiAgY29uc3QgZXh0cmFNZXRob2RNYXAgPSBnZXRFeHRyYU1ldGhvZE1hcChkcml2ZXJDbGFzc2VzLCBwbHVnaW5DbGFzc2VzKTtcblxuICBjb25zdCBzZXJ2ZXJPcHRzID0ge1xuICAgIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbixcbiAgICBwb3J0OiBwYXJzZWRBcmdzLnBvcnQsXG4gICAgaG9zdG5hbWU6IHBhcnNlZEFyZ3MuYWRkcmVzcyxcbiAgICBhbGxvd0NvcnM6IHBhcnNlZEFyZ3MuYWxsb3dDb3JzLFxuICAgIGJhc2VQYXRoOiBwYXJzZWRBcmdzLmJhc2VQYXRoLFxuICAgIHNlcnZlclVwZGF0ZXJzLFxuICAgIGV4dHJhTWV0aG9kTWFwLFxuICB9O1xuICBpZiAocGFyc2VkQXJncy5rZWVwQWxpdmVUaW1lb3V0KSB7XG4gICAgc2VydmVyT3B0cy5rZWVwQWxpdmVUaW1lb3V0ID0gcGFyc2VkQXJncy5rZWVwQWxpdmVUaW1lb3V0ICogMTAwMDtcbiAgfVxuICBsZXQgc2VydmVyO1xuICB0cnkge1xuICAgIHNlcnZlciA9IGF3YWl0IGJhc2VTZXJ2ZXIoc2VydmVyT3B0cyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5lcnJvcihgQ291bGQgbm90IGNvbmZpZ3VyZSBBcHBpdW0gc2VydmVyLiBJdCdzIHBvc3NpYmxlIHRoYXQgYSBkcml2ZXIgb3IgcGx1Z2luIHRyaWVkIGAgK1xuICAgICAgICAgICAgICAgICBgdG8gdXBkYXRlIHRoZSBzZXJ2ZXIgYW5kIGZhaWxlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgbG9nZ2VyLmRlYnVnKGVyci5zdGFjayk7XG4gICAgcmV0dXJuIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChwYXJzZWRBcmdzLmFsbG93Q29ycykge1xuICAgIGxvZ2dlci53YXJuKCdZb3UgaGF2ZSBlbmFibGVkIENPUlMgcmVxdWVzdHMgZnJvbSBhbnkgaG9zdC4gQmUgY2FyZWZ1bCBub3QgJyArXG4gICAgICAgICAgICAgICAgJ3RvIHZpc2l0IHNpdGVzIHdoaWNoIGNvdWxkIG1hbGljaW91c2x5IHRyeSB0byBzdGFydCBBcHBpdW0gJyArXG4gICAgICAgICAgICAgICAgJ3Nlc3Npb25zIG9uIHlvdXIgbWFjaGluZScpO1xuICB9XG4gIC8vIEB0cy1pZ25vcmVcbiAgYXBwaXVtRHJpdmVyLnNlcnZlciA9IHNlcnZlcjtcbiAgdHJ5IHtcbiAgICAvLyBjb25maWd1cmUgYXMgbm9kZSBvbiBncmlkLCBpZiBuZWNlc3NhcnlcbiAgICAvLyBmYWxzeSB2YWx1ZXMgc2hvdWxkIG5vdCBjYXVzZSB0aGlzIHRvIHJ1blxuICAgIGlmIChwYXJzZWRBcmdzLm5vZGVjb25maWcpIHtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyTm9kZShwYXJzZWRBcmdzLm5vZGVjb25maWcsIHBhcnNlZEFyZ3MuYWRkcmVzcywgcGFyc2VkQXJncy5wb3J0LCBwYXJzZWRBcmdzLmJhc2VQYXRoKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGF3YWl0IHNlcnZlci5jbG9zZSgpO1xuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nXSkge1xuICAgIHByb2Nlc3Mub25jZShzaWduYWwsIGFzeW5jIGZ1bmN0aW9uIG9uU2lnbmFsICgpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBSZWNlaXZlZCAke3NpZ25hbH0gLSBzaHV0dGluZyBkb3duYCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBhcHBpdW1Ecml2ZXIuZGVsZXRlQWxsU2Vzc2lvbnMoe1xuICAgICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICAgIHJlYXNvbjogYFRoZSBwcm9jZXNzIGhhcyByZWNlaXZlZCAke3NpZ25hbH0gc2lnbmFsYCxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHNlcnZlci5jbG9zZSgpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGUpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBsb2dTZXJ2ZXJQb3J0KHBhcnNlZEFyZ3MuYWRkcmVzcywgcGFyc2VkQXJncy5wb3J0KTtcbiAgZHJpdmVyQ29uZmlnLnByaW50KCk7XG4gIHBsdWdpbkNvbmZpZy5wcmludChwbHVnaW5DbGFzc2VzLm1hcCgocCkgPT4gcC5wbHVnaW5OYW1lKSk7XG5cbiAgcmV0dXJuIHNlcnZlcjtcbn1cblxuaWYgKHJlcXVpcmUubWFpbiA9PT0gbW9kdWxlKSB7XG4gIGFzeW5jaWZ5KG1haW4pO1xufVxuXG4vLyBldmVyeXRoaW5nIGJlbG93IGhlcmUgaXMgaW50ZW5kZWQgdG8gYmUgYSBwdWJsaWMgQVBJLlxuZXhwb3J0IHsgbWFpbiwgaW5pdCB9O1xuZXhwb3J0IHsgQVBQSVVNX0hPTUUgfSBmcm9tICcuL2V4dGVuc2lvbi1jb25maWcnO1xuZXhwb3J0IHsgZ2V0U2NoZW1hLCB2YWxpZGF0ZSwgZmluYWxpemVTY2hlbWEgfSBmcm9tICcuL3NjaGVtYS9zY2hlbWEnO1xuZXhwb3J0IHsgcmVhZENvbmZpZ0ZpbGUgfSBmcm9tICcuL2NvbmZpZy1maWxlJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi90eXBlcy90eXBlcycpLlBhcnNlZEFyZ3N9IFBhcnNlZEFyZ3NcbiAqL1xuIl0sImZpbGUiOiJsaWIvbWFpbi5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
@@ -7,21 +7,29 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = void 0;
9
9
 
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
10
12
  require("source-map-support/register");
11
13
 
12
14
  var _lodash = _interopRequireDefault(require("lodash"));
13
15
 
14
- var _extensionConfig = _interopRequireWildcard(require("./extension-config"));
16
+ var _extensionConfig = _interopRequireDefault(require("./extension-config"));
17
+
18
+ var _extConfigIo = require("./ext-config-io");
15
19
 
16
20
  var _logger = _interopRequireDefault(require("./logger"));
17
21
 
18
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
22
+ class PluginConfig extends _extensionConfig.default {
23
+ constructor(appiumHome, logFn) {
24
+ super(appiumHome, _extConfigIo.PLUGIN_TYPE, logFn);
25
+ }
19
26
 
20
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
27
+ static getInstance(appiumHome, logFn) {
28
+ var _PluginConfig$_instan;
21
29
 
22
- class PluginConfig extends _extensionConfig.default {
23
- constructor(appiumHome, logFn = null) {
24
- super(appiumHome, _extensionConfig.PLUGIN_TYPE, logFn);
30
+ const instance = (_PluginConfig$_instan = PluginConfig._instances[appiumHome]) !== null && _PluginConfig$_instan !== void 0 ? _PluginConfig$_instan : new PluginConfig(appiumHome, logFn);
31
+ PluginConfig._instances[appiumHome] = instance;
32
+ return instance;
25
33
  }
26
34
 
27
35
  extensionDesc(pluginName, {
@@ -54,7 +62,8 @@ class PluginConfig extends _extensionConfig.default {
54
62
 
55
63
  }
56
64
 
57
- exports.default = PluginConfig;require('source-map-support').install();
65
+ exports.default = PluginConfig;
66
+ (0, _defineProperty2.default)(PluginConfig, "_instances", {});require('source-map-support').install();
58
67
 
59
68
 
60
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wbHVnaW4tY29uZmlnLmpzIl0sIm5hbWVzIjpbIlBsdWdpbkNvbmZpZyIsIkV4dGVuc2lvbkNvbmZpZyIsImNvbnN0cnVjdG9yIiwiYXBwaXVtSG9tZSIsImxvZ0ZuIiwiUExVR0lOX1RZUEUiLCJleHRlbnNpb25EZXNjIiwicGx1Z2luTmFtZSIsInZlcnNpb24iLCJwcmludCIsImFjdGl2ZU5hbWVzIiwicGx1Z2luTmFtZXMiLCJPYmplY3QiLCJrZXlzIiwiaW5zdGFsbGVkRXh0ZW5zaW9ucyIsIl8iLCJpc0VtcHR5IiwibG9nIiwiaW5mbyIsInBsdWdpbkRhdGEiLCJ0b1BhaXJzIiwiYWN0aXZlVHh0IiwiaW5jbHVkZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7OztBQUVlLE1BQU1BLFlBQU4sU0FBMkJDLHdCQUEzQixDQUEyQztBQUN4REMsRUFBQUEsV0FBVyxDQUFFQyxVQUFGLEVBQWNDLEtBQUssR0FBRyxJQUF0QixFQUE0QjtBQUNyQyxVQUFNRCxVQUFOLEVBQWtCRSw0QkFBbEIsRUFBK0JELEtBQS9CO0FBQ0Q7O0FBRURFLEVBQUFBLGFBQWEsQ0FBRUMsVUFBRixFQUFjO0FBQUNDLElBQUFBO0FBQUQsR0FBZCxFQUF5QjtBQUNwQyxXQUFRLEdBQUVELFVBQVcsSUFBR0MsT0FBUSxFQUFoQztBQUNEOztBQUVEQyxFQUFBQSxLQUFLLENBQUVDLFdBQUYsRUFBZTtBQUNsQixVQUFNQyxXQUFXLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLEtBQUtDLG1CQUFqQixDQUFwQjs7QUFFQSxRQUFJQyxnQkFBRUMsT0FBRixDQUFVTCxXQUFWLENBQUosRUFBNEI7QUFDMUJNLHNCQUFJQyxJQUFKLENBQVUsMERBQUQsR0FDQSxnREFEVDs7QUFFQTtBQUNEOztBQUVERCxvQkFBSUMsSUFBSixDQUFVLG9CQUFWOztBQUNBLFNBQUssTUFBTSxDQUFDWCxVQUFELEVBQWFZLFVBQWIsQ0FBWCxJQUF1Q0osZ0JBQUVLLE9BQUYsQ0FBVSxLQUFLTixtQkFBZixDQUF2QyxFQUE0RTtBQUMxRSxZQUFNTyxTQUFTLEdBQUdOLGdCQUFFTyxRQUFGLENBQVdaLFdBQVgsRUFBd0JILFVBQXhCLElBQXNDLFdBQXRDLEdBQW9ELEVBQXRFOztBQUNBVSxzQkFBSUMsSUFBSixDQUFVLE9BQU0sS0FBS1osYUFBTCxDQUFtQkMsVUFBbkIsRUFBK0JZLFVBQS9CLENBQTJDLEdBQUVFLFNBQVUsRUFBdkU7QUFDRDs7QUFFRCxRQUFJTixnQkFBRUMsT0FBRixDQUFVTixXQUFWLENBQUosRUFBNEI7QUFDMUJPLHNCQUFJQyxJQUFKLENBQVMsZ0ZBQVQ7QUFDRDtBQUNGOztBQTNCdUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEV4dGVuc2lvbkNvbmZpZywgeyBQTFVHSU5fVFlQRSB9IGZyb20gJy4vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luQ29uZmlnIGV4dGVuZHMgRXh0ZW5zaW9uQ29uZmlnIHtcbiAgY29uc3RydWN0b3IgKGFwcGl1bUhvbWUsIGxvZ0ZuID0gbnVsbCkge1xuICAgIHN1cGVyKGFwcGl1bUhvbWUsIFBMVUdJTl9UWVBFLCBsb2dGbik7XG4gIH1cblxuICBleHRlbnNpb25EZXNjIChwbHVnaW5OYW1lLCB7dmVyc2lvbn0pIHtcbiAgICByZXR1cm4gYCR7cGx1Z2luTmFtZX1AJHt2ZXJzaW9ufWA7XG4gIH1cblxuICBwcmludCAoYWN0aXZlTmFtZXMpIHtcbiAgICBjb25zdCBwbHVnaW5OYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucyk7XG5cbiAgICBpZiAoXy5pc0VtcHR5KHBsdWdpbk5hbWVzKSkge1xuICAgICAgbG9nLmluZm8oYE5vIHBsdWdpbnMgaGF2ZSBiZWVuIGluc3RhbGxlZC4gVXNlIHRoZSBcImFwcGl1bSBwbHVnaW5cIiBgICtcbiAgICAgICAgICAgICAgICdjb21tYW5kIHRvIGluc3RhbGwgdGhlIG9uZShzKSB5b3Ugd2FudCB0byB1c2UuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nLmluZm8oYEF2YWlsYWJsZSBwbHVnaW5zOmApO1xuICAgIGZvciAoY29uc3QgW3BsdWdpbk5hbWUsIHBsdWdpbkRhdGFdIG9mIF8udG9QYWlycyh0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnMpKSB7XG4gICAgICBjb25zdCBhY3RpdmVUeHQgPSBfLmluY2x1ZGVzKGFjdGl2ZU5hbWVzLCBwbHVnaW5OYW1lKSA/ICcgKEFDVElWRSknIDogJyc7XG4gICAgICBsb2cuaW5mbyhgICAtICR7dGhpcy5leHRlbnNpb25EZXNjKHBsdWdpbk5hbWUsIHBsdWdpbkRhdGEpfSR7YWN0aXZlVHh0fWApO1xuICAgIH1cblxuICAgIGlmIChfLmlzRW1wdHkoYWN0aXZlTmFtZXMpKSB7XG4gICAgICBsb2cuaW5mbygnTm8gcGx1Z2lucyBhY3RpdmF0ZWQuIFVzZSB0aGUgLS1wbHVnaW5zIGZsYWcgd2l0aCBuYW1lcyBvZiBwbHVnaW5zIHRvIGFjdGl2YXRlJyk7XG4gICAgfVxuICB9XG59XG4iXSwiZmlsZSI6ImxpYi9wbHVnaW4tY29uZmlnLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
69
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wbHVnaW4tY29uZmlnLmpzIl0sIm5hbWVzIjpbIlBsdWdpbkNvbmZpZyIsIkV4dGVuc2lvbkNvbmZpZyIsImNvbnN0cnVjdG9yIiwiYXBwaXVtSG9tZSIsImxvZ0ZuIiwiUExVR0lOX1RZUEUiLCJnZXRJbnN0YW5jZSIsImluc3RhbmNlIiwiX2luc3RhbmNlcyIsImV4dGVuc2lvbkRlc2MiLCJwbHVnaW5OYW1lIiwidmVyc2lvbiIsInByaW50IiwiYWN0aXZlTmFtZXMiLCJwbHVnaW5OYW1lcyIsIk9iamVjdCIsImtleXMiLCJpbnN0YWxsZWRFeHRlbnNpb25zIiwiXyIsImlzRW1wdHkiLCJsb2ciLCJpbmZvIiwicGx1Z2luRGF0YSIsInRvUGFpcnMiLCJhY3RpdmVUeHQiLCJpbmNsdWRlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUVlLE1BQU1BLFlBQU4sU0FBMkJDLHdCQUEzQixDQUEyQztBQWtCeERDLEVBQUFBLFdBQVcsQ0FBRUMsVUFBRixFQUFjQyxLQUFkLEVBQXFCO0FBQzlCLFVBQU1ELFVBQU4sRUFBa0JFLHdCQUFsQixFQUErQkQsS0FBL0I7QUFDRDs7QUFRaUIsU0FBWEUsV0FBVyxDQUFFSCxVQUFGLEVBQWNDLEtBQWQsRUFBcUI7QUFBQTs7QUFDckMsVUFBTUcsUUFBUSw0QkFBR1AsWUFBWSxDQUFDUSxVQUFiLENBQXdCTCxVQUF4QixDQUFILHlFQUEwQyxJQUFJSCxZQUFKLENBQWlCRyxVQUFqQixFQUE2QkMsS0FBN0IsQ0FBeEQ7QUFDQUosSUFBQUEsWUFBWSxDQUFDUSxVQUFiLENBQXdCTCxVQUF4QixJQUFzQ0ksUUFBdEM7QUFDQSxXQUFPQSxRQUFQO0FBQ0Q7O0FBRURFLEVBQUFBLGFBQWEsQ0FBRUMsVUFBRixFQUFjO0FBQUNDLElBQUFBO0FBQUQsR0FBZCxFQUF5QjtBQUNwQyxXQUFRLEdBQUVELFVBQVcsSUFBR0MsT0FBUSxFQUFoQztBQUNEOztBQUVEQyxFQUFBQSxLQUFLLENBQUVDLFdBQUYsRUFBZTtBQUNsQixVQUFNQyxXQUFXLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLEtBQUtDLG1CQUFqQixDQUFwQjs7QUFFQSxRQUFJQyxnQkFBRUMsT0FBRixDQUFVTCxXQUFWLENBQUosRUFBNEI7QUFDMUJNLHNCQUFJQyxJQUFKLENBQVUsMERBQUQsR0FDQSxnREFEVDs7QUFFQTtBQUNEOztBQUVERCxvQkFBSUMsSUFBSixDQUFVLG9CQUFWOztBQUNBLFNBQUssTUFBTSxDQUFDWCxVQUFELEVBQWFZLFVBQWIsQ0FBWCxJQUF1Q0osZ0JBQUVLLE9BQUYsQ0FBVSxLQUFLTixtQkFBZixDQUF2QyxFQUE0RTtBQUMxRSxZQUFNTyxTQUFTLEdBQUdOLGdCQUFFTyxRQUFGLENBQVdaLFdBQVgsRUFBd0JILFVBQXhCLElBQXNDLFdBQXRDLEdBQW9ELEVBQXRFOztBQUNBVSxzQkFBSUMsSUFBSixDQUFVLE9BQU0sS0FBS1osYUFBTCxDQUFtQkMsVUFBbkIsRUFBK0JZLFVBQS9CLENBQTJDLEdBQUVFLFNBQVUsRUFBdkU7QUFDRDs7QUFFRCxRQUFJTixnQkFBRUMsT0FBRixDQUFVTixXQUFWLENBQUosRUFBNEI7QUFDMUJPLHNCQUFJQyxJQUFKLENBQVMsZ0ZBQVQ7QUFDRDtBQUNGOztBQXhEdUQ7Ozs4QkFBckNyQixZLGdCQVFDLEUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEV4dGVuc2lvbkNvbmZpZyBmcm9tICcuL2V4dGVuc2lvbi1jb25maWcnO1xuaW1wb3J0IHsgUExVR0lOX1RZUEUgfSBmcm9tICcuL2V4dC1jb25maWctaW8nO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkNvbmZpZyBleHRlbmRzIEV4dGVuc2lvbkNvbmZpZyB7XG5cbiAgLyoqXG4gICAqIEEgbWFwcGluZyBvZiBgQVBQSVVNX0hPTUVgIHZhbHVlcyB0byB7QGxpbmsgUGx1Z2luQ29uZmlnfSBpbnN0YW5jZXMuXG4gICAqIEVhY2ggYEFQUElVTV9IT01FYCBzaG91bGQgb25seSBoYXZlIG9uZSBhc3NvY2lhdGVkIGBQbHVnaW5Db25maWdgIGluc3RhbmNlLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxQbHVnaW5Db25maWc+fVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RhdGljIF9pbnN0YW5jZXMgPSB7fTtcblxuICAvKipcbiAgICogQ2FsbCB7QGxpbmsgUGx1Z2luQ29uZmlnLmdldEluc3RhbmNlfSBpbnN0ZWFkLlxuICAgKlxuICAgKiBKdXN0IGNhbGxzIHRoZSBzdXBlcmNsYXNzJyBjb25zdHJ1Y3RvciB3aXRoIHRoZSBjb3JyZWN0IGV4dGVuc2lvbiB0eXBlXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBpdW1Ib21lIC0gYEFQUElVTV9IT01FYCBwYXRoXG4gICAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKX0gW2xvZ0ZuXSAtIE9wdGlvbmFsIGxvZ2dpbmcgZnVuY3Rpb25cbiAgICovXG4gIGNvbnN0cnVjdG9yIChhcHBpdW1Ib21lLCBsb2dGbikge1xuICAgIHN1cGVyKGFwcGl1bUhvbWUsIFBMVUdJTl9UWVBFLCBsb2dGbik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBvciBnZXRzIGFuIGluc3RhbmNlIG9mIHtAbGluayBQbHVnaW5Db25maWd9IGJhc2VkIHZhbHVlIG9mIGBhcHBpdW1Ib21lYFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwaXVtSG9tZSAtIGBBUFBJVU1fSE9NRWAgcGF0aFxuICAgKiBAcGFyYW0geyguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZH0gW2xvZ0ZuXSAtIE9wdGlvbmFsIGxvZ2dpbmcgZnVuY3Rpb25cbiAgICogQHJldHVybnMge1BsdWdpbkNvbmZpZ31cbiAgICovXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSAoYXBwaXVtSG9tZSwgbG9nRm4pIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IFBsdWdpbkNvbmZpZy5faW5zdGFuY2VzW2FwcGl1bUhvbWVdID8/IG5ldyBQbHVnaW5Db25maWcoYXBwaXVtSG9tZSwgbG9nRm4pO1xuICAgIFBsdWdpbkNvbmZpZy5faW5zdGFuY2VzW2FwcGl1bUhvbWVdID0gaW5zdGFuY2U7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgZXh0ZW5zaW9uRGVzYyAocGx1Z2luTmFtZSwge3ZlcnNpb259KSB7XG4gICAgcmV0dXJuIGAke3BsdWdpbk5hbWV9QCR7dmVyc2lvbn1gO1xuICB9XG5cbiAgcHJpbnQgKGFjdGl2ZU5hbWVzKSB7XG4gICAgY29uc3QgcGx1Z2luTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnMpO1xuXG4gICAgaWYgKF8uaXNFbXB0eShwbHVnaW5OYW1lcykpIHtcbiAgICAgIGxvZy5pbmZvKGBObyBwbHVnaW5zIGhhdmUgYmVlbiBpbnN0YWxsZWQuIFVzZSB0aGUgXCJhcHBpdW0gcGx1Z2luXCIgYCArXG4gICAgICAgICAgICAgICAnY29tbWFuZCB0byBpbnN0YWxsIHRoZSBvbmUocykgeW91IHdhbnQgdG8gdXNlLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZy5pbmZvKGBBdmFpbGFibGUgcGx1Z2luczpgKTtcbiAgICBmb3IgKGNvbnN0IFtwbHVnaW5OYW1lLCBwbHVnaW5EYXRhXSBvZiBfLnRvUGFpcnModGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKSkge1xuICAgICAgY29uc3QgYWN0aXZlVHh0ID0gXy5pbmNsdWRlcyhhY3RpdmVOYW1lcywgcGx1Z2luTmFtZSkgPyAnIChBQ1RJVkUpJyA6ICcnO1xuICAgICAgbG9nLmluZm8oYCAgLSAke3RoaXMuZXh0ZW5zaW9uRGVzYyhwbHVnaW5OYW1lLCBwbHVnaW5EYXRhKX0ke2FjdGl2ZVR4dH1gKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc0VtcHR5KGFjdGl2ZU5hbWVzKSkge1xuICAgICAgbG9nLmluZm8oJ05vIHBsdWdpbnMgYWN0aXZhdGVkLiBVc2UgdGhlIC0tcGx1Z2lucyBmbGFnIHdpdGggbmFtZXMgb2YgcGx1Z2lucyB0byBhY3RpdmF0ZScpO1xuICAgIH1cbiAgfVxufVxuIl0sImZpbGUiOiJsaWIvcGx1Z2luLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9