appium 2.0.0-beta.25 → 2.0.0-beta.26
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.
- package/build/lib/appium-config.schema.json +278 -0
- package/build/lib/appium.js +45 -66
- package/build/lib/cli/args.js +19 -39
- package/build/lib/cli/driver-command.js +5 -9
- package/build/lib/cli/extension-command.js +73 -64
- package/build/lib/cli/extension.js +10 -23
- package/build/lib/cli/parser.js +9 -19
- package/build/lib/cli/plugin-command.js +5 -9
- package/build/lib/cli/utils.js +2 -4
- package/build/lib/config-file.js +2 -4
- package/build/lib/config.js +7 -6
- package/build/lib/constants.js +60 -0
- package/build/lib/extension/driver-config.js +190 -0
- package/build/lib/extension/extension-config.js +297 -0
- package/build/lib/extension/index.js +77 -0
- package/build/lib/extension/manifest.js +246 -0
- package/build/lib/extension/package-changed.js +68 -0
- package/build/lib/extension/plugin-config.js +87 -0
- package/build/lib/grid-register.js +2 -4
- package/build/lib/logger.js +2 -4
- package/build/lib/logsink.js +2 -4
- package/build/lib/main.js +40 -68
- package/build/lib/schema/appium-config-schema.js +2 -4
- package/build/lib/schema/arg-spec.js +11 -14
- package/build/lib/schema/cli-args.js +2 -4
- package/build/lib/schema/cli-transformers.js +2 -4
- package/build/lib/schema/index.js +2 -4
- package/build/lib/schema/keywords.js +2 -4
- package/build/lib/schema/schema.js +55 -37
- package/build/lib/utils.js +1 -32
- package/lib/appium.js +50 -68
- package/lib/cli/args.js +19 -23
- package/lib/cli/driver-command.js +10 -2
- package/lib/cli/extension-command.js +216 -135
- package/lib/cli/extension.js +7 -15
- package/lib/cli/parser.js +6 -14
- package/lib/cli/plugin-command.js +1 -2
- package/lib/config-file.js +3 -3
- package/lib/config.js +5 -4
- package/lib/constants.js +79 -0
- package/lib/extension/driver-config.js +230 -0
- package/lib/extension/extension-config.js +459 -0
- package/lib/extension/index.js +103 -0
- package/lib/extension/manifest.js +590 -0
- package/lib/extension/package-changed.js +64 -0
- package/lib/extension/plugin-config.js +111 -0
- package/lib/grid-register.js +4 -4
- package/lib/main.js +51 -88
- package/lib/schema/arg-spec.js +2 -2
- package/lib/schema/cli-args.js +1 -0
- package/lib/schema/keywords.js +1 -1
- package/lib/schema/schema.js +60 -28
- package/lib/utils.js +2 -32
- package/package.json +29 -21
- package/{postinstall.js → scripts/postinstall.js} +1 -1
- package/types/types.d.ts +70 -31
- package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
- package/build/check-npm-pack-files.js +0 -23
- package/build/commands-yml/parse.js +0 -319
- package/build/commands-yml/validator.js +0 -130
- package/build/index.js +0 -19
- package/build/lib/cli/npm.js +0 -220
- package/build/lib/driver-config.js +0 -100
- package/build/lib/drivers.js +0 -100
- package/build/lib/ext-config-io.js +0 -165
- package/build/lib/extension-config.js +0 -320
- package/build/lib/plugin-config.js +0 -69
- package/build/lib/plugins.js +0 -18
- package/build/postinstall.js +0 -90
- package/build/test/cli/cli-e2e-specs.js +0 -221
- package/build/test/cli/cli-helpers.js +0 -86
- package/build/test/cli/cli-specs.js +0 -71
- package/build/test/cli/fixtures/test-driver/package.json +0 -27
- package/build/test/cli/schema-args-specs.js +0 -48
- package/build/test/cli/schema-e2e-specs.js +0 -47
- package/build/test/config-e2e-specs.js +0 -112
- package/build/test/config-file-e2e-specs.js +0 -191
- package/build/test/config-file-specs.js +0 -281
- package/build/test/config-specs.js +0 -258
- package/build/test/driver-e2e-specs.js +0 -435
- package/build/test/driver-specs.js +0 -386
- package/build/test/ext-config-io-specs.js +0 -181
- package/build/test/extension-config-specs.js +0 -365
- package/build/test/fixtures/allow-feat.txt +0 -5
- package/build/test/fixtures/caps.json +0 -3
- package/build/test/fixtures/config/allow-insecure.txt +0 -3
- package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +0 -5
- package/build/test/fixtures/config/appium.config.bad.json +0 -32
- package/build/test/fixtures/config/appium.config.ext-good.json +0 -9
- package/build/test/fixtures/config/appium.config.ext-unknown-props.json +0 -10
- package/build/test/fixtures/config/appium.config.good.js +0 -40
- package/build/test/fixtures/config/appium.config.good.json +0 -33
- package/build/test/fixtures/config/appium.config.good.yaml +0 -30
- package/build/test/fixtures/config/appium.config.invalid.json +0 -31
- package/build/test/fixtures/config/appium.config.security-array.json +0 -5
- package/build/test/fixtures/config/appium.config.security-delimited.json +0 -5
- package/build/test/fixtures/config/appium.config.security-path.json +0 -5
- package/build/test/fixtures/config/driver-fake.config.json +0 -8
- package/build/test/fixtures/config/nodeconfig.json +0 -3
- package/build/test/fixtures/config/plugin-fake.config.json +0 -0
- package/build/test/fixtures/default-args.js +0 -35
- package/build/test/fixtures/deny-feat.txt +0 -5
- package/build/test/fixtures/driver.schema.js +0 -20
- package/build/test/fixtures/extensions.yaml +0 -27
- package/build/test/fixtures/flattened-schema.js +0 -532
- package/build/test/fixtures/plugin.schema.js +0 -20
- package/build/test/fixtures/schema-with-extensions.js +0 -28
- package/build/test/grid-register-specs.js +0 -74
- package/build/test/helpers.js +0 -75
- package/build/test/logger-specs.js +0 -76
- package/build/test/npm-specs.js +0 -20
- package/build/test/parser-specs.js +0 -319
- package/build/test/plugin-e2e-specs.js +0 -316
- package/build/test/schema/arg-spec-specs.js +0 -70
- package/build/test/schema/cli-args-specs.js +0 -408
- package/build/test/schema/schema-specs.js +0 -407
- package/build/test/utils-specs.js +0 -288
- package/lib/cli/npm.js +0 -251
- package/lib/driver-config.js +0 -101
- package/lib/drivers.js +0 -84
- package/lib/ext-config-io.js +0 -287
- package/lib/extension-config.js +0 -366
- package/lib/plugin-config.js +0 -63
- package/lib/plugins.js +0 -13
|
@@ -11,17 +11,13 @@ require("source-map-support/register");
|
|
|
11
11
|
|
|
12
12
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
13
|
|
|
14
|
-
var _npm = _interopRequireDefault(require("./npm"));
|
|
15
|
-
|
|
16
|
-
var _path = _interopRequireDefault(require("path"));
|
|
17
|
-
|
|
18
14
|
var _support = require("@appium/support");
|
|
19
15
|
|
|
20
16
|
var _utils = require("./utils");
|
|
21
17
|
|
|
22
18
|
var _teen_process = require("teen_process");
|
|
23
19
|
|
|
24
|
-
var _extensionConfig = require("../extension-config");
|
|
20
|
+
var _extensionConfig = require("../extension/extension-config");
|
|
25
21
|
|
|
26
22
|
const UPDATE_ALL = 'installed';
|
|
27
23
|
|
|
@@ -30,16 +26,20 @@ class NotUpdatableError extends Error {}
|
|
|
30
26
|
class NoUpdatesAvailableError extends Error {}
|
|
31
27
|
|
|
32
28
|
class ExtensionCommand {
|
|
29
|
+
config;
|
|
30
|
+
knownExtensions;
|
|
31
|
+
isJsonOutput;
|
|
32
|
+
|
|
33
33
|
constructor({
|
|
34
34
|
config,
|
|
35
|
-
json
|
|
36
|
-
type
|
|
35
|
+
json
|
|
37
36
|
}) {
|
|
38
37
|
this.config = config;
|
|
39
|
-
this.type = type;
|
|
40
38
|
this.isJsonOutput = json;
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
get type() {
|
|
42
|
+
return this.config.extensionType;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
async execute(args) {
|
|
@@ -82,12 +82,7 @@ class ExtensionCommand {
|
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
for (const [ext, data] of _lodash.default.toPairs(exts)) {
|
|
85
|
-
|
|
86
|
-
installed,
|
|
87
|
-
installType
|
|
88
|
-
} = data;
|
|
89
|
-
|
|
90
|
-
if (!installed || installType !== _extensionConfig.INSTALL_TYPE_NPM) {
|
|
85
|
+
if (!data.installed || data.installType !== _extensionConfig.INSTALL_TYPE_NPM) {
|
|
91
86
|
continue;
|
|
92
87
|
}
|
|
93
88
|
|
|
@@ -102,35 +97,54 @@ class ExtensionCommand {
|
|
|
102
97
|
return exts;
|
|
103
98
|
}
|
|
104
99
|
|
|
105
|
-
for (const [name, {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
100
|
+
for (const [name, data] of _lodash.default.toPairs(exts)) {
|
|
101
|
+
let installTxt = ' [not installed]'.grey;
|
|
102
|
+
let updateTxt = '';
|
|
103
|
+
let upToDateTxt = '';
|
|
104
|
+
let unsafeUpdateTxt = '';
|
|
105
|
+
|
|
106
|
+
if (data.installed) {
|
|
107
|
+
const {
|
|
108
|
+
installType,
|
|
109
|
+
installSpec,
|
|
110
|
+
updateVersion,
|
|
111
|
+
unsafeUpdateVersion,
|
|
112
|
+
version,
|
|
113
|
+
upToDate
|
|
114
|
+
} = data;
|
|
115
|
+
let typeTxt;
|
|
116
|
+
|
|
117
|
+
switch (installType) {
|
|
118
|
+
case _extensionConfig.INSTALL_TYPE_GIT:
|
|
119
|
+
case _extensionConfig.INSTALL_TYPE_GITHUB:
|
|
120
|
+
typeTxt = `(cloned from ${installSpec})`.yellow;
|
|
121
|
+
break;
|
|
122
|
+
|
|
123
|
+
case _extensionConfig.INSTALL_TYPE_LOCAL:
|
|
124
|
+
typeTxt = `(linked from ${installSpec})`.magenta;
|
|
125
|
+
break;
|
|
126
|
+
|
|
127
|
+
default:
|
|
128
|
+
typeTxt = '(NPM)';
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
installTxt = `@${version.yellow} ${('[installed ' + typeTxt + ']').green}`;
|
|
132
|
+
|
|
133
|
+
if (showUpdates) {
|
|
134
|
+
if (updateVersion) {
|
|
135
|
+
updateTxt = ` [${updateVersion} available]`.magenta;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (upToDate) {
|
|
139
|
+
upToDateTxt = ` [Up to date]`.green;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (unsafeUpdateVersion) {
|
|
143
|
+
unsafeUpdateTxt = ` [${unsafeUpdateVersion} available (potentially unsafe)]`.cyan;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
128
146
|
}
|
|
129
147
|
|
|
130
|
-
const installTxt = installed ? `@${version.yellow} ${('[installed ' + typeTxt + ']').green}` : ' [not installed]'.grey;
|
|
131
|
-
const updateTxt = showUpdates && updateVersion ? ` [${updateVersion} available]`.magenta : '';
|
|
132
|
-
const upToDateTxt = showUpdates && upToDate ? ` [Up to date]`.green : '';
|
|
133
|
-
const unsafeUpdateTxt = showUpdates && unsafeUpdateVersion ? ` [${unsafeUpdateVersion} available (potentially unsafe)]`.cyan : '';
|
|
134
148
|
console.log(`- ${name.yellow}${installTxt}${updateTxt}${upToDateTxt}${unsafeUpdateTxt}`);
|
|
135
149
|
}
|
|
136
150
|
|
|
@@ -142,7 +156,6 @@ class ExtensionCommand {
|
|
|
142
156
|
installType,
|
|
143
157
|
packageName
|
|
144
158
|
}) {
|
|
145
|
-
(0, _utils.log)(this.isJsonOutput, `Attempting to find and install ${this.type} '${ext}'`);
|
|
146
159
|
let extData;
|
|
147
160
|
let installSpec = ext;
|
|
148
161
|
|
|
@@ -155,10 +168,10 @@ class ExtensionCommand {
|
|
|
155
168
|
}
|
|
156
169
|
|
|
157
170
|
if (installType === _extensionConfig.INSTALL_TYPE_LOCAL) {
|
|
158
|
-
const msg = `Linking ${this.type} from local path`;
|
|
159
|
-
const pkgJsonData = await (0, _utils.spinWith)(this.isJsonOutput, msg, async () => await
|
|
171
|
+
const msg = `Linking ${this.type} from local path into ${this.config.appiumHome}`;
|
|
172
|
+
const pkgJsonData = await (0, _utils.spinWith)(this.isJsonOutput, msg, async () => await _support.npm.linkPackage(this.config.appiumHome, installSpec));
|
|
160
173
|
extData = this.getExtensionFields(pkgJsonData);
|
|
161
|
-
|
|
174
|
+
(0, _utils.log)(this.isJsonOutput, `Successfully linked ${extData.pkgName} into ${this.config.appiumHome}`);
|
|
162
175
|
} else if (installType === _extensionConfig.INSTALL_TYPE_GITHUB) {
|
|
163
176
|
if (installSpec.split('/').length !== 2) {
|
|
164
177
|
throw new Error(`Github ${this.type} spec ${installSpec} appeared to be invalid; ` + 'it should be of the form <org>/<repo>');
|
|
@@ -234,20 +247,16 @@ class ExtensionCommand {
|
|
|
234
247
|
const msg = `Installing '${ext}'${specMsg}`;
|
|
235
248
|
|
|
236
249
|
try {
|
|
237
|
-
const pkgJsonData = await (0, _utils.spinWith)(this.isJsonOutput, msg, async () => await
|
|
238
|
-
pkgDir: _path.default.resolve(this.config.appiumHome, pkgName),
|
|
239
|
-
pkgName,
|
|
250
|
+
const pkgJsonData = await (0, _utils.spinWith)(this.isJsonOutput, msg, async () => await _support.npm.installPackage(this.config.appiumHome, pkgName, {
|
|
240
251
|
pkgVer
|
|
241
252
|
}));
|
|
242
|
-
|
|
243
|
-
extData.installPath = pkgName;
|
|
244
|
-
return extData;
|
|
253
|
+
return this.getExtensionFields(pkgJsonData);
|
|
245
254
|
} catch (err) {
|
|
246
255
|
throw new Error(`Encountered an error when installing package: ${err.message}`);
|
|
247
256
|
}
|
|
248
257
|
}
|
|
249
258
|
|
|
250
|
-
getPostInstallText() {
|
|
259
|
+
getPostInstallText(args) {
|
|
251
260
|
throw new Error('Must be implemented in final class');
|
|
252
261
|
}
|
|
253
262
|
|
|
@@ -268,7 +277,7 @@ class ExtensionCommand {
|
|
|
268
277
|
};
|
|
269
278
|
}
|
|
270
279
|
|
|
271
|
-
validateExtensionFields() {
|
|
280
|
+
validateExtensionFields(appiumPkgData) {
|
|
272
281
|
throw new Error('Must be implemented in final class');
|
|
273
282
|
}
|
|
274
283
|
|
|
@@ -279,8 +288,10 @@ class ExtensionCommand {
|
|
|
279
288
|
throw new Error(`Can't uninstall ${this.type} '${ext}'; it is not installed`);
|
|
280
289
|
}
|
|
281
290
|
|
|
291
|
+
const installPath = this.config.getInstallPath(ext);
|
|
292
|
+
|
|
282
293
|
try {
|
|
283
|
-
await _support.fs.rimraf(
|
|
294
|
+
await _support.fs.rimraf(installPath);
|
|
284
295
|
} finally {
|
|
285
296
|
await this.config.removeExtension(ext);
|
|
286
297
|
}
|
|
@@ -362,8 +373,8 @@ class ExtensionCommand {
|
|
|
362
373
|
version,
|
|
363
374
|
pkgName
|
|
364
375
|
} = this.config.installedExtensions[ext];
|
|
365
|
-
let unsafeUpdate = await
|
|
366
|
-
let safeUpdate = await
|
|
376
|
+
let unsafeUpdate = await _support.npm.getLatestVersion(this.config.appiumHome, pkgName);
|
|
377
|
+
let safeUpdate = await _support.npm.getLatestSafeUpgradeVersion(this.config.appiumHome, pkgName, version);
|
|
367
378
|
|
|
368
379
|
if (!_support.util.compareVersions(unsafeUpdate, '>', version)) {
|
|
369
380
|
unsafeUpdate = null;
|
|
@@ -409,7 +420,7 @@ class ExtensionCommand {
|
|
|
409
420
|
|
|
410
421
|
const extConfig = this.config.installedExtensions[ext];
|
|
411
422
|
|
|
412
|
-
if (!
|
|
423
|
+
if (!extConfig.scripts) {
|
|
413
424
|
throw new Error(`The ${this.type} named '${ext}' does not contain the ` + `"scripts" field underneath the "appium" field in its package.json`);
|
|
414
425
|
}
|
|
415
426
|
|
|
@@ -424,7 +435,7 @@ class ExtensionCommand {
|
|
|
424
435
|
}
|
|
425
436
|
|
|
426
437
|
const runner = new _teen_process.SubProcess(process.execPath, [extScripts[scriptName]], {
|
|
427
|
-
cwd: this.config.
|
|
438
|
+
cwd: this.config.getInstallPath(ext)
|
|
428
439
|
});
|
|
429
440
|
const output = new _utils.RingBuffer(50);
|
|
430
441
|
runner.on('stream-line', line => {
|
|
@@ -450,7 +461,5 @@ class ExtensionCommand {
|
|
|
450
461
|
|
|
451
462
|
}
|
|
452
463
|
|
|
453
|
-
exports.default = ExtensionCommand;
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQuanMiXSwibmFtZXMiOlsiVVBEQVRFX0FMTCIsIk5vdFVwZGF0YWJsZUVycm9yIiwiRXJyb3IiLCJOb1VwZGF0ZXNBdmFpbGFibGVFcnJvciIsIkV4dGVuc2lvbkNvbW1hbmQiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsImpzb24iLCJ0eXBlIiwiaXNKc29uT3V0cHV0IiwibnBtIiwiTlBNIiwiYXBwaXVtSG9tZSIsImtub3duRXh0ZW5zaW9ucyIsImV4ZWN1dGUiLCJhcmdzIiwiY21kIiwiXyIsImlzRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJleGVjdXRlQ21kIiwiYmluZCIsImxpc3QiLCJzaG93SW5zdGFsbGVkIiwic2hvd1VwZGF0ZXMiLCJsc01zZyIsImluc3RhbGxlZE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJrbm93bk5hbWVzIiwiZXh0cyIsInJlZHVjZSIsImFjYyIsIm5hbWUiLCJpbmNsdWRlcyIsImluc3RhbGxlZCIsInBrZ05hbWUiLCJleHQiLCJkYXRhIiwidG9QYWlycyIsImluc3RhbGxUeXBlIiwiSU5TVEFMTF9UWVBFX05QTSIsInVwZGF0ZXMiLCJjaGVja0ZvckV4dGVuc2lvblVwZGF0ZSIsInVwZGF0ZVZlcnNpb24iLCJzYWZlVXBkYXRlIiwidW5zYWZlVXBkYXRlVmVyc2lvbiIsInVuc2FmZVVwZGF0ZSIsInVwVG9EYXRlIiwiaW5zdGFsbFNwZWMiLCJ2ZXJzaW9uIiwidHlwZVR4dCIsIklOU1RBTExfVFlQRV9HSVQiLCJJTlNUQUxMX1RZUEVfR0lUSFVCIiwieWVsbG93IiwiSU5TVEFMTF9UWVBFX0xPQ0FMIiwibWFnZW50YSIsImluc3RhbGxUeHQiLCJncmVlbiIsImdyZXkiLCJ1cGRhdGVUeHQiLCJ1cFRvRGF0ZVR4dCIsInVuc2FmZVVwZGF0ZVR4dCIsImN5YW4iLCJjb25zb2xlIiwibG9nIiwiaW5zdGFsbCIsInBhY2thZ2VOYW1lIiwiZXh0RGF0YSIsIm1zZyIsInBrZ0pzb25EYXRhIiwibGlua1BhY2thZ2UiLCJnZXRFeHRlbnNpb25GaWVsZHMiLCJpbnN0YWxsUGF0aCIsInNwbGl0IiwibGVuZ3RoIiwiaW5zdGFsbFZpYU5wbSIsInJlcGxhY2UiLCJwa2dWZXIiLCJzcGxpdHMiLCJKU09OIiwic3RyaW5naWZ5IiwiZXh0TmFtZSIsImlzSW5zdGFsbGVkIiwiYWRkRXh0ZW5zaW9uIiwiZ2V0UG9zdEluc3RhbGxUZXh0IiwibnBtU3BlYyIsInNwZWNNc2ciLCJpbnN0YWxsUGFja2FnZSIsInBrZ0RpciIsInBhdGgiLCJyZXNvbHZlIiwiZXJyIiwibWVzc2FnZSIsImFwcGl1bSIsInZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzIiwidW5pbnN0YWxsIiwiZnMiLCJyaW1yYWYiLCJnZXRJbnN0YWxsUGF0aCIsInJlbW92ZUV4dGVuc2lvbiIsInVwZGF0ZSIsInVuc2FmZSIsInNob3VsZFVwZGF0ZUFsbCIsImV4dHNUb1VwZGF0ZSIsImVycm9ycyIsImUiLCJjdXJyZW50IiwidXBkYXRlVmVyIiwidXBkYXRlRXh0ZW5zaW9uIiwiZnJvbSIsInRvIiwicmVkIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsImdldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbiIsInV0aWwiLCJjb21wYXJlVmVyc2lvbnMiLCJydW4iLCJzY3JpcHROYW1lIiwiaGFzIiwiZXh0Q29uZmlnIiwiZXh0U2NyaXB0cyIsInNjcmlwdHMiLCJpc1BsYWluT2JqZWN0IiwicnVubmVyIiwiU3ViUHJvY2VzcyIsInByb2Nlc3MiLCJleGVjUGF0aCIsImN3ZCIsImdldEV4dGVuc2lvblJlcXVpcmVQYXRoIiwib3V0cHV0IiwiUmluZ0J1ZmZlciIsIm9uIiwibGluZSIsImVucXVldWUiLCJzdGFydCIsImpvaW4iLCJnZXRCdWZmIiwiZXJyb3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsVUFBVSxHQUFH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QUFQO0FBQVQsT0FBUDtBQUNELEtBSkQsQ0FJRSxPQUFPN0MsR0FBUCxFQUFZO0FBQ1osc0JBQUksS0FBS3BGLFlBQVQsRUFBd0Isc0NBQXFDOEcsVUFBVyxNQUFLMUIsR0FBRyxDQUFDQyxPQUFRLEVBQWxFLENBQW9FbUIsR0FBM0Y7QUFDQSxhQUFPO0FBQUMwQixRQUFBQSxLQUFLLEVBQUU5QyxHQUFHLENBQUNDLE9BQVo7QUFBcUJxQyxRQUFBQSxNQUFNLEVBQUVBLE1BQU0sQ0FBQ08sT0FBUDtBQUE3QixPQUFQO0FBQ0Q7QUFDRjs7QUFsaEJtQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cblxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBOUE0gZnJvbSAnLi9ucG0nO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBmcywgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBsb2csIHNwaW5XaXRoLCBSaW5nQnVmZmVyIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBTdWJQcm9jZXNzfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgSU5TVEFMTF9UWVBFX05QTSwgSU5TVEFMTF9UWVBFX0dJVCwgSU5TVEFMTF9UWVBFX0dJVEhVQixcbiAgICAgICAgIElOU1RBTExfVFlQRV9MT0NBTCB9IGZyb20gJy4uL2V4dGVuc2lvbi1jb25maWcnO1xuXG5jb25zdCBVUERBVEVfQUxMID0gJ2luc3RhbGxlZCc7XG5cbmNsYXNzIE5vdFVwZGF0YWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cbmNsYXNzIE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXh0ZW5zaW9uQ29tbWFuZCB7XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV4dGVuc2lvbkNvbW1hbmRDb25zdHJ1Y3RvclxuICAgKiBAcHJvcGVydHkge09iamVjdH0gY29uZmlnIC0gdGhlIERyaXZlckNvbmZpZyBvciBQbHVnaW5Db25maWcgb2JqZWN0IHVzZWQgZm9yIHRoaXMgY29tbWFuZFxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGpzb24gLSB3aGV0aGVyIHRoZSBvdXRwdXQgb2YgdGhpcyBjb21tYW5kIHNob3VsZCBiZSBKU09OIG9yIHRleHRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgLSBEUklWRVJfVFlQRSBvciBQTFVHSU5fVFlQRVxuICAgKi9cblxuICAvKipcbiAgICogQnVpbGQgYW4gRXh0ZW5zaW9uQ29tbWFuZFxuICAgKlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvbkNvbW1hbmRDb25zdHJ1Y3Rvcn0gb3B0c1xuICAgKiBAcmV0dXJuIHtFeHRlbnNpb25Db21tYW5kfVxuICAgKi9cbiAgY29uc3RydWN0b3IgKHtjb25maWcsIGpzb24sIHR5cGV9KSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLmlzSnNvbk91dHB1dCA9IGpzb247XG4gICAgdGhpcy5ucG0gPSBuZXcgTlBNKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUpO1xuICAgIHRoaXMua25vd25FeHRlbnNpb25zID0ge307IC8vIHRoaXMgbmVlZHMgdG8gYmUgb3ZlcnJpZGRlbiBpbiBmaW5hbCBjbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYSBDTEkgcGFyc2UgYW5kIHJ1biBhbiBleHRlbnNpb24gY29tbWFuZCBiYXNlZCBvbiBpdHMgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIGEga2V5L3ZhbHVlIG9iamVjdCB3aXRoIENMSSBmbGFncyBhbmQgdmFsdWVzXG4gICAqIEByZXR1cm4ge29iamVjdH0gdGhlIHJlc3VsdCBvZiB0aGUgc3BlY2lmaWMgY29tbWFuZCB3aGljaCBpcyBleGVjdXRlZFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZSAoYXJncykge1xuICAgIGNvbnN0IGNtZCA9IGFyZ3NbYCR7dGhpcy50eXBlfUNvbW1hbmRgXTtcbiAgICBpZiAoIV8uaXNGdW5jdGlvbihFeHRlbnNpb25Db21tYW5kLnByb3RvdHlwZVtjbWRdKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgaGFuZGxlICR7dGhpcy50eXBlfSBjb21tYW5kICR7Y21kfWApO1xuICAgIH1cbiAgICBjb25zdCBleGVjdXRlQ21kID0gdGhpc1tjbWRdLmJpbmQodGhpcyk7XG4gICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGVDbWQoYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gTGlzdEFyZ3NcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBzaG93SW5zdGFsbGVkIC0gd2hldGhlciBzaG91bGQgc2hvdyBvbmx5IGluc3RhbGxlZCBleHRlbnNpb25zXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc2hvd1VwZGF0ZXMgLSB3aGV0aGVyIHNob3VsZCBzaG93IGF2YWlsYWJsZSB1cGRhdGVzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBMaXN0IGV4dGVuc2lvbnNcbiAgICpcbiAgICogQHBhcmFtIHtMaXN0QXJnc30gYXJnc1xuICAgKiBAcmV0dXJuIHtvYmplY3R9IG1hcCBvZiBleHRlbnNpb24gbmFtZXMgdG8gZXh0ZW5zaW9uIGRhdGFcbiAgICovXG4gIGFzeW5jIGxpc3QgKHtzaG93SW5zdGFsbGVkLCBzaG93VXBkYXRlc30pIHtcbiAgICBjb25zdCBsc01zZyA9IGBMaXN0aW5nICR7c2hvd0luc3RhbGxlZCA/ICdpbnN0YWxsZWQnIDogJ2F2YWlsYWJsZSd9ICR7dGhpcy50eXBlfXNgO1xuICAgIGNvbnN0IGluc3RhbGxlZE5hbWVzID0gT2JqZWN0LmtleXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucyk7XG4gICAgY29uc3Qga25vd25OYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMua25vd25FeHRlbnNpb25zKTtcbiAgICBjb25zdCBleHRzID0gWy4uLmluc3RhbGxlZE5hbWVzLCAuLi5rbm93bk5hbWVzXS5yZWR1Y2UoKGFjYywgbmFtZSkgPT4ge1xuICAgICAgaWYgKCFhY2NbbmFtZV0pIHtcbiAgICAgICAgaWYgKGluc3RhbGxlZE5hbWVzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgICAgYWNjW25hbWVdID0gey4uLnRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbbmFtZV0sIGluc3RhbGxlZDogdHJ1ZX07XG4gICAgICAgIH0gZWxzZSBpZiAoIXNob3dJbnN0YWxsZWQpIHtcbiAgICAgICAgICBhY2NbbmFtZV0gPSB7cGtnTmFtZTogdGhpcy5rbm93bkV4dGVuc2lvbnNbbmFtZV0sIGluc3RhbGxlZDogZmFsc2V9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcblxuICAgIC8vIGlmIHdlIHdhbnQgdG8gc2hvdyB3aGV0aGVyIHVwZGF0ZXMgYXJlIGF2YWlsYWJsZSwgcHV0IHRoYXQgYmVoaW5kIGEgc3Bpbm5lclxuICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBsc01zZywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzaG93VXBkYXRlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtleHQsIGRhdGFdIG9mIF8udG9QYWlycyhleHRzKSkge1xuICAgICAgICBjb25zdCB7aW5zdGFsbGVkLCBpbnN0YWxsVHlwZX0gPSBkYXRhO1xuICAgICAgICBpZiAoIWluc3RhbGxlZCB8fCBpbnN0YWxsVHlwZSAhPT0gSU5TVEFMTF9UWVBFX05QTSkge1xuICAgICAgICAgIC8vIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIHVwZGF0ZXMgb24gZXh0cyB0aGF0IGFyZW4ndCBpbnN0YWxsZWRcbiAgICAgICAgICAvLyBhbHNvIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIHVwZGF0ZXMgb24gbm9uLW5wbSBleHRzXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlcyA9IGF3YWl0IHRoaXMuY2hlY2tGb3JFeHRlbnNpb25VcGRhdGUoZXh0KTtcbiAgICAgICAgZGF0YS51cGRhdGVWZXJzaW9uID0gdXBkYXRlcy5zYWZlVXBkYXRlO1xuICAgICAgICBkYXRhLnVuc2FmZVVwZGF0ZVZlcnNpb24gPSB1cGRhdGVzLnVuc2FmZVVwZGF0ZTtcbiAgICAgICAgZGF0YS51cFRvRGF0ZSA9IHVwZGF0ZXMuc2FmZVVwZGF0ZSA9PT0gbnVsbCAmJiB1cGRhdGVzLnVuc2FmZVVwZGF0ZSA9PT0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGlmIHdlJ3JlIGp1c3QgZ2V0dGluZyB0aGUgZGF0YSwgc2hvcnQgY2lyY3VpdCByZXR1cm4gaGVyZSBzaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueVxuICAgIC8vIGZvcm1hdHRpbmcgbG9naWNcbiAgICBpZiAodGhpcy5pc0pzb25PdXRwdXQpIHtcbiAgICAgIHJldHVybiBleHRzO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW1xuICAgICAgbmFtZSxcbiAgICAgIHtpbnN0YWxsVHlwZSwgaW5zdGFsbFNwZWMsIGluc3RhbGxlZCwgdXBkYXRlVmVyc2lvbiwgdW5zYWZlVXBkYXRlVmVyc2lvbiwgdmVyc2lvbiwgdXBUb0RhdGV9XG4gICAgXSBvZiBfLnRvUGFpcnMoZXh0cykpIHtcbiAgICAgIGxldCB0eXBlVHh0O1xuICAgICAgc3dpdGNoIChpbnN0YWxsVHlwZSkge1xuICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9HSVQ6XG4gICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0dJVEhVQjpcbiAgICAgICAgICB0eXBlVHh0ID0gYChjbG9uZWQgZnJvbSAke2luc3RhbGxTcGVjfSlgLnllbGxvdztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJTlNUQUxMX1RZUEVfTE9DQUw6XG4gICAgICAgICAgdHlwZVR4dCA9IGAobGlua2VkIGZyb20gJHtpbnN0YWxsU3BlY30pYC5tYWdlbnRhO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHR5cGVUeHQgPSAnKE5QTSknO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5zdGFsbFR4dCA9IGluc3RhbGxlZCA/XG4gICAgICAgIGBAJHt2ZXJzaW9uLnllbGxvd30gJHsoJ1tpbnN0YWxsZWQgJyArIHR5cGVUeHQgKyAnXScpLmdyZWVufWAgOlxuICAgICAgICAnIFtub3QgaW5zdGFsbGVkXScuZ3JleTtcbiAgICAgIGNvbnN0IHVwZGF0ZVR4dCA9IHNob3dVcGRhdGVzICYmIHVwZGF0ZVZlcnNpb24gP1xuICAgICAgICBgIFske3VwZGF0ZVZlcnNpb259IGF2YWlsYWJsZV1gLm1hZ2VudGEgOlxuICAgICAgICAnJztcbiAgICAgIGNvbnN0IHVwVG9EYXRlVHh0ID0gc2hvd1VwZGF0ZXMgJiYgdXBUb0RhdGUgP1xuICAgICAgICBgIFtVcCB0byBkYXRlXWAuZ3JlZW4gOlxuICAgICAgICAnJztcbiAgICAgIGNvbnN0IHVuc2FmZVVwZGF0ZVR4dCA9IHNob3dVcGRhdGVzICYmIHVuc2FmZVVwZGF0ZVZlcnNpb24gP1xuICAgICAgICBgIFske3Vuc2FmZVVwZGF0ZVZlcnNpb259IGF2YWlsYWJsZSAocG90ZW50aWFsbHkgdW5zYWZlKV1gLmN5YW4gOlxuICAgICAgICAnJztcblxuICAgICAgY29uc29sZS5sb2coYC0gJHtuYW1lLnllbGxvd30ke2luc3RhbGxUeHR9JHt1cGRhdGVUeHR9JHt1cFRvRGF0ZVR4dH0ke3Vuc2FmZVVwZGF0ZVR4dH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXh0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsQXJnc1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZXh0IC0gdGhlIG5hbWUgb3Igc3BlYyBvZiBhbiBleHRlbnNpb24gdG8gaW5zdGFsbFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gaW5zdGFsbFR5cGUgLSBob3cgdG8gaW5zdGFsbCB0aGlzIGV4dGVuc2lvbi4gT25lIG9mIHRoZSBJTlNUQUxMX1RZUEVTXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGFja2FnZU5hbWVdIC0gZm9yIGdpdC9naXRodWIgaW5zdGFsbHMsIHRoZSBleHRlbnNpb24gbm9kZSBwYWNrYWdlIG5hbWVcbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYW4gZXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7SW5zdGFsbEFyZ3N9IGFyZ3NcbiAgICogQHJldHVybiB7b2JqZWN0fSBtYXAgb2YgYWxsIGluc3RhbGxlZCBleHRlbnNpb24gbmFtZXMgdG8gZXh0ZW5zaW9uIGRhdGFcbiAgICovXG4gIGFzeW5jIGluc3RhbGwgKHtleHQsIGluc3RhbGxUeXBlLCBwYWNrYWdlTmFtZX0pIHtcbiAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGBBdHRlbXB0aW5nIHRvIGZpbmQgYW5kIGluc3RhbGwgJHt0aGlzLnR5cGV9ICcke2V4dH0nYCk7XG5cbiAgICBsZXQgZXh0RGF0YTtcbiAgICBsZXQgaW5zdGFsbFNwZWMgPSBleHQ7XG5cbiAgICBpZiAocGFja2FnZU5hbWUgJiYgW0lOU1RBTExfVFlQRV9MT0NBTCwgSU5TVEFMTF9UWVBFX05QTV0uaW5jbHVkZXMoaW5zdGFsbFR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFdoZW4gdXNpbmcgLS1zb3VyY2U9JHtpbnN0YWxsVHlwZX0sIGNhbm5vdCBhbHNvIHVzZSAtLXBhY2thZ2VgKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhY2thZ2VOYW1lICYmIFtJTlNUQUxMX1RZUEVfR0lULCBJTlNUQUxMX1RZUEVfR0lUSFVCXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgV2hlbiB1c2luZyAtLXNvdXJjZT0ke2luc3RhbGxUeXBlfSwgbXVzdCBhbHNvIHVzZSAtLXBhY2thZ2VgKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9MT0NBTCkge1xuICAgICAgY29uc3QgbXNnID0gYExpbmtpbmcgJHt0aGlzLnR5cGV9IGZyb20gbG9jYWwgcGF0aGA7XG4gICAgICBjb25zdCBwa2dKc29uRGF0YSA9IGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBtc2csIGFzeW5jICgpID0+IChcbiAgICAgICAgYXdhaXQgdGhpcy5ucG0ubGlua1BhY2thZ2UoaW5zdGFsbFNwZWMpKVxuICAgICAgKTtcbiAgICAgIGV4dERhdGEgPSB0aGlzLmdldEV4dGVuc2lvbkZpZWxkcyhwa2dKc29uRGF0YSk7XG4gICAgICBleHREYXRhLmluc3RhbGxQYXRoID0gZXh0RGF0YS5wa2dOYW1lO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9HSVRIVUIpIHtcbiAgICAgIGlmIChpbnN0YWxsU3BlYy5zcGxpdCgnLycpLmxlbmd0aCAhPT0gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdpdGh1YiAke3RoaXMudHlwZX0gc3BlYyAke2luc3RhbGxTcGVjfSBhcHBlYXJlZCB0byBiZSBpbnZhbGlkOyBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdpdCBzaG91bGQgYmUgb2YgdGhlIGZvcm0gPG9yZz4vPHJlcG8+Jyk7XG4gICAgICB9XG4gICAgICBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKHtleHQ6IGluc3RhbGxTcGVjLCBwa2dOYW1lOiBwYWNrYWdlTmFtZX0pO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9HSVQpIHtcbiAgICAgIC8vIGdpdCB1cmxzIGNhbiBoYXZlICcuZ2l0JyBhdCB0aGUgZW5kLCBidXQgdGhpcyBpcyBub3QgbmVjZXNzYXJ5IGFuZCB3b3VsZCBjb21wbGljYXRlIHRoZVxuICAgICAgLy8gd2F5IHdlIGRvd25sb2FkIGFuZCBuYW1lIGRpcmVjdG9yaWVzLCBzbyB3ZSBjYW4ganVzdCByZW1vdmUgaXRcbiAgICAgIGluc3RhbGxTcGVjID0gaW5zdGFsbFNwZWMucmVwbGFjZSgvXFwuZ2l0JC8sICcnKTtcbiAgICAgIGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe2V4dDogaW5zdGFsbFNwZWMsIHBrZ05hbWU6IHBhY2thZ2VOYW1lfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBlaXRoZXIgYW4gbnBtIHBhY2thZ2Ugb3IgYW4gYXBwaXVtIHZlcmlmaWVkIGV4dGVuc2lvblxuICAgICAgLy8gbmFtZS4gYm90aCBvZiB3aGljaCB3aWxsIGJlIGluc3RhbGxlZCB2aWEgbnBtLlxuICAgICAgLy8gZXh0ZW5zaW9ucyBpbnN0YWxsZWQgdmlhIG5wbSBjYW4gaW5jbHVkZSB2ZXJzaW9ucyBvciB0YWdzIGFmdGVyIHRoZSAnQCdcbiAgICAgIC8vIHNpZ24sIHNvIGNoZWNrIGZvciB0aGF0LiBXZSBhbHNvIG5lZWQgdG8gYmUgY2FyZWZ1bCB0aGF0IHBhY2thZ2UgbmFtZXMgdGhlbXNlbHZlcyBjYW5cbiAgICAgIC8vIGNvbnRhaW4gdGhlICdAJyBzeW1ib2wsIGFzIGluIGBucG0gaW5zdGFsbCBAYXBwaXVtL2Zha2UtZHJpdmVyQDEuMi4wYFxuICAgICAgbGV0IG5hbWUsIHBrZ1ZlcjtcbiAgICAgIGNvbnN0IHNwbGl0cyA9IGluc3RhbGxTcGVjLnNwbGl0KCdAJyk7XG4gICAgICBpZiAoaW5zdGFsbFNwZWNbMF0gPT09ICdAJykge1xuICAgICAgICAvLyB0aGlzIGlzIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgYW4gbnBtIG9yZyBpbmNsdWRlZCBpbiB0aGUgcGFja2FnZSBuYW1lXG4gICAgICAgIFtuYW1lLCBwa2dWZXJdID0gW2BAJHtzcGxpdHNbMV19YCwgc3BsaXRzWzJdXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRoaXMgaXMgdGhlIGNhc2Ugd2l0aG91dCBhbiBucG0gb3JnXG4gICAgICAgIFtuYW1lLCBwa2dWZXJdID0gc3BsaXRzO1xuICAgICAgfVxuICAgICAgbGV0IHBrZ05hbWU7XG5cbiAgICAgIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX05QTSkge1xuICAgICAgICAvLyBpZiB3ZSdyZSBpbnN0YWxsaW5nIGEgbmFtZWQgcGFja2FnZSBmcm9tIG5wbSwgd2UgZG9uJ3QgbmVlZCB0byBjaGVja1xuICAgICAgICAvLyBhZ2FpbnN0IHRoZSBhcHBpdW0gZXh0ZW5zaW9uIGxpc3Q7IGp1c3QgdXNlIHRoZSBpbnN0YWxsU3BlYyBhcyBpc1xuICAgICAgICBwa2dOYW1lID0gbmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHdlJ3JlIGluc3RhbGxpbmcgYSBuYW1lZCBhcHBpdW0gZHJpdmVyIChsaWtlICd4Y3VpdGVzdCcpIHdlIG5lZWQgdG9cbiAgICAgICAgLy8gZGVyZWZlcmVuY2UgdGhlIGFjdHVhbCBucG0gcGFja2FnZSAoJ2FwcGl1cG0teGN1aXRlc3QtZHJpdmVyJyksIHNvXG4gICAgICAgIC8vIGNoZWNrIGl0IGV4aXN0cyBhbmQgZ2V0IHRoZSBjb3JyZWN0IHBhY2thZ2VcbiAgICAgICAgY29uc3Qga25vd25OYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMua25vd25FeHRlbnNpb25zKTtcbiAgICAgICAgaWYgKCFfLmluY2x1ZGVzKGtub3duTmFtZXMsIG5hbWUpKSB7XG4gICAgICAgICAgY29uc3QgbXNnID0gYENvdWxkIG5vdCByZXNvbHZlICR7dGhpcy50eXBlfTsgYXJlIHlvdSBzdXJlIGl0J3MgaW4gdGhlIGxpc3QgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYG9mIHN1cHBvcnRlZCAke3RoaXMudHlwZX1zPyAke0pTT04uc3RyaW5naWZ5KGtub3duTmFtZXMpfWA7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgcGtnTmFtZSA9IHRoaXMua25vd25FeHRlbnNpb25zW25hbWVdO1xuICAgICAgICAvLyBnaXZlbiB0aGF0IHdlJ2xsIHVzZSB0aGUgaW5zdGFsbCB0eXBlIGluIHRoZSBkcml2ZXIganNvbiwgc3RvcmUgaXQgYXNcbiAgICAgICAgLy8gJ25wbScgbm93XG4gICAgICAgIGluc3RhbGxUeXBlID0gSU5TVEFMTF9UWVBFX05QTTtcbiAgICAgIH1cblxuICAgICAgZXh0RGF0YSA9IGF3YWl0IHRoaXMuaW5zdGFsbFZpYU5wbSh7ZXh0LCBwa2dOYW1lLCBwa2dWZXJ9KTtcbiAgICB9XG5cbiAgICBjb25zdCBleHROYW1lID0gZXh0RGF0YVtgJHt0aGlzLnR5cGV9TmFtZWBdO1xuICAgIGRlbGV0ZSBleHREYXRhW2Ake3RoaXMudHlwZX1OYW1lYF07XG5cbiAgICBpZiAodGhpcy5jb25maWcuaXNJbnN0YWxsZWQoZXh0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQSAke3RoaXMudHlwZX0gbmFtZWQgJyR7ZXh0TmFtZX0nIGlzIGFscmVhZHkgaW5zdGFsbGVkLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgRGlkIHlvdSBtZWFuIHRvIHVwZGF0ZT8gJ2FwcGl1bSAke3RoaXMudHlwZX0gdXBkYXRlJy4gU2VlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBpbnN0YWxsZWQgJHt0aGlzLnR5cGV9cyB3aXRoICdhcHBpdW0gJHt0aGlzLnR5cGV9IGxpc3QgLS1pbnN0YWxsZWQnLmApO1xuICAgIH1cblxuICAgIGV4dERhdGEuaW5zdGFsbFR5cGUgPSBpbnN0YWxsVHlwZTtcbiAgICBleHREYXRhLmluc3RhbGxTcGVjID0gaW5zdGFsbFNwZWM7XG4gICAgYXdhaXQgdGhpcy5jb25maWcuYWRkRXh0ZW5zaW9uKGV4dE5hbWUsIGV4dERhdGEpO1xuXG4gICAgLy8gbG9nIGluZm8gZm9yIHRoZSB1c2VyXG4gICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCB0aGlzLmdldFBvc3RJbnN0YWxsVGV4dCh7ZXh0TmFtZSwgZXh0RGF0YX0pKTtcblxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEluc3RhbGxWaWFOcG1BcmdzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHQgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byBpbnN0YWxsXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwa2dOYW1lIC0gdGhlIE5QTSBwYWNrYWdlIG5hbWUgb2YgdGhlIGV4dGVuc2lvblxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BrZ1Zlcl0gLSB0aGUgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgTlBNIHBhY2thZ2VcbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYW4gZXh0ZW5zaW9uIHZpYSBOUE1cbiAgICpcbiAgICogQHBhcmFtIHtJbnN0YWxsVmlhTnBtQXJnc30gYXJnc1xuICAgKi9cbiAgYXN5bmMgaW5zdGFsbFZpYU5wbSAoe2V4dCwgcGtnTmFtZSwgcGtnVmVyfSkge1xuICAgIGNvbnN0IG5wbVNwZWMgPSBgJHtwa2dOYW1lfSR7cGtnVmVyID8gJ0AnICsgcGtnVmVyIDogJyd9YDtcbiAgICBjb25zdCBzcGVjTXNnID0gbnBtU3BlYyA9PT0gZXh0ID8gJycgOiBgIHVzaW5nIE5QTSBpbnN0YWxsIHNwZWMgJyR7bnBtU3BlY30nYDtcbiAgICBjb25zdCBtc2cgPSBgSW5zdGFsbGluZyAnJHtleHR9JyR7c3BlY01zZ31gO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwa2dKc29uRGF0YSA9IGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBtc2csIGFzeW5jICgpID0+IChcbiAgICAgICAgYXdhaXQgdGhpcy5ucG0uaW5zdGFsbFBhY2thZ2Uoe1xuICAgICAgICAgIHBrZ0RpcjogcGF0aC5yZXNvbHZlKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUpLFxuICAgICAgICAgIHBrZ05hbWUsXG4gICAgICAgICAgcGtnVmVyXG4gICAgICAgIH0pXG4gICAgICApKTtcbiAgICAgIGNvbnN0IGV4dERhdGEgPSB0aGlzLmdldEV4dGVuc2lvbkZpZWxkcyhwa2dKc29uRGF0YSk7XG4gICAgICBleHREYXRhLmluc3RhbGxQYXRoID0gcGtnTmFtZTtcbiAgICAgIHJldHVybiBleHREYXRhO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbmNvdW50ZXJlZCBhbiBlcnJvciB3aGVuIGluc3RhbGxpbmcgcGFja2FnZTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXh0ZW5zaW9uQXJnc1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZXh0TmFtZSAtIHRoZSBuYW1lIG9mIGFuIGV4dGVuc2lvblxuICAgKiBAcHJvcGVydHkge29iamVjdH0gZXh0RGF0YSAtIHRoZSBkYXRhIGZvciBhbiBpbnN0YWxsZWQgZXh0ZW5zaW9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHRleHQgd2hpY2ggc2hvdWxkIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciBhZnRlciBhbiBleHRlbnNpb24gaGFzIGJlZW4gaW5zdGFsbGVkLiBUaGlzXG4gICAqIGlzIGRlc2lnbmVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgZHJpdmVycy9wbHVnaW5zIHdpdGggdGhlaXIgb3duIHBhcnRpY3VsYXIgdGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRlbnNpb25BcmdzfSBhcmdzXG4gICAqL1xuICBnZXRQb3N0SW5zdGFsbFRleHQgKC8qe2V4dE5hbWUsIGV4dERhdGF9Ki8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYmUgaW1wbGVtZW50ZWQgaW4gZmluYWwgY2xhc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIGFuIE5QTSBtb2R1bGUncyBwYWNrYWdlLmpzb24gYW5kIGV4dHJhY3QgQXBwaXVtIGRyaXZlciBpbmZvcm1hdGlvbiBmcm9tIGEgc3BlY2lhbFxuICAgKiAnYXBwaXVtJyBmaWVsZCBpbiB0aGUgSlNPTiBkYXRhLiBXZSBuZWVkIHRoaXMgaW5mb3JtYXRpb24gdG8gZS5nLiBkZXRlcm1pbmUgd2hpY2ggY2xhc3MgdG9cbiAgICogbG9hZCBhcyB0aGUgbWFpbiBkcml2ZXIgY2xhc3MsIG9yIHRvIGJlIGFibGUgdG8gZGV0ZWN0IGluY29tcGF0aWJpbGl0aWVzIGJldHdlZW4gZHJpdmVyIGFuZFxuICAgKiBhcHBpdW0gdmVyc2lvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwa2dKc29uRGF0YSAtIHRoZSBwYWNrYWdlLmpzb24gZGF0YSBmb3IgYSBkcml2ZXIgbW9kdWxlLCBhcyBpZiBpdCBoYWQgYmVlblxuICAgKiBzdHJhaWdodGZvcndhcmRseSAncmVxdWlyZSdkXG4gICAqL1xuICBnZXRFeHRlbnNpb25GaWVsZHMgKHBrZ0pzb25EYXRhKSB7XG4gICAgaWYgKCFwa2dKc29uRGF0YS5hcHBpdW0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW5zdGFsbGVkIGRyaXZlciBkaWQgbm90IGhhdmUgYW4gJ2FwcGl1bScgc2VjdGlvbiBpbiBpdHMgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYHBhY2thZ2UuanNvbiBmaWxlIGFzIGV4cGVjdGVkYCk7XG4gICAgfVxuICAgIGNvbnN0IHthcHBpdW0sIG5hbWUsIHZlcnNpb259ID0gcGtnSnNvbkRhdGE7XG4gICAgdGhpcy52YWxpZGF0ZUV4dGVuc2lvbkZpZWxkcyhhcHBpdW0pO1xuXG4gICAgcmV0dXJuIHsuLi5hcHBpdW0sIHBrZ05hbWU6IG5hbWUsIHZlcnNpb259O1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBhbnkgcGFja2FnZS5qc29uIGZpZWxkcyB3aGljaCBhIHBhcnRpY3VsYXIgdHlwZSBvZiBleHRlbnNpb24gcmVxdWlyZXMsIHZhbGlkYXRlIHRoZVxuICAgKiBwcmVzZW5jZSBhbmQgZm9ybSBvZiB0aG9zZSBmaWVsZHMgb24gdGhlIHBhY2thZ2UuanNvbiBkYXRhLCB0aHJvd2luZyBhbiBlcnJvciBpZiBhbnl0aGluZyBpc1xuICAgKiBhbWlzcy5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGFwcGl1bVBrZ0RhdGEgLSB0aGUgZGF0YSBpbiB0aGUgXCJhcHBpdW1cIiBmaWVsZCBvZiBwYWNrYWdlLmpzb24gZm9yIGFuXG4gICAqIGV4dGVuc2lvblxuICAgKi9cbiAgdmFsaWRhdGVFeHRlbnNpb25GaWVsZHMgKC8qYXBwaXVtUGtnRGF0YSovKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGJlIGltcGxlbWVudGVkIGluIGZpbmFsIGNsYXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gVW5pbnN0YWxsQXJnc1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZXh0IC0gdGhlIG5hbWUgb3Igc3BlYyBvZiBhbiBleHRlbnNpb24gdG8gdW5pbnN0YWxsXG4gICAqL1xuXG4gIC8qKlxuICAgKiBVbmluc3RhbGwgYW4gZXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7VW5pbnN0YWxsQXJnc30gYXJnc1xuICAgKiBAcmV0dXJuIHtvYmplY3R9IG1hcCBvZiBhbGwgaW5zdGFsbGVkIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgdW5pbnN0YWxsICh7ZXh0fSkge1xuICAgIGlmICghdGhpcy5jb25maWcuaXNJbnN0YWxsZWQoZXh0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCB1bmluc3RhbGwgJHt0aGlzLnR5cGV9ICcke2V4dH0nOyBpdCBpcyBub3QgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5yaW1yYWYodGhpcy5jb25maWcuZ2V0SW5zdGFsbFBhdGgoZXh0KSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuY29uZmlnLnJlbW92ZUV4dGVuc2lvbihleHQpO1xuICAgIH1cbiAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGBTdWNjZXNzZnVsbHkgdW5pbnN0YWxsZWQgJHt0aGlzLnR5cGV9ICcke2V4dH0nYC5ncmVlbik7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXh0ZW5zaW9uVXBkYXRlT3B0c1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZXh0IC0gdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0byB1cGRhdGVcbiAgICogQHByb3BlcnR5IHtib29sZWFufSB1bnNhZmUgLSBpZiB0cnVlLCB3aWxsIHBlcmZvcm0gdW5zYWZlIHVwZGF0ZXMgcGFzdCBtYWpvciByZXZpc2lvblxuICAgKiBib3VuZGFyaWVzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBVcGRhdGVSZXBvcnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGZyb20gLSB2ZXJzaW9uIHVwZGF0ZWQgZnJvbVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdG8gLSB2ZXJzaW9uIHVwZGF0ZWQgdG9cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV4dGVuc2lvblVwZGF0ZVJlc3VsdFxuICAgKiBAcHJvcGVydHkge09iamVjdH0gZXJyb3JzIC0gbWFwIG9mIGV4dCBuYW1lcyB0byBlcnJvciBvYmplY3RzXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB1cGRhdGVzIC0gbWFwIG9mIGV4dCBuYW1lcyB0byB7QGxpbmsgVXBkYXRlUmVwb3J0fXNcbiAgICovXG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgdG8gdXBkYXRlIG9uZSBvciBtb3JlIGRyaXZlcnMgdXNpbmcgTlBNXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVXBkYXRlT3B0c30gdXBkYXRlU3BlY1xuICAgKiBAcmV0dXJuIHtFeHRlbnNpb25VcGRhdGVSZXN1bHR9XG4gICAqL1xuICBhc3luYyB1cGRhdGUgKHtleHQsIHVuc2FmZX0pIHtcbiAgICBjb25zdCBzaG91bGRVcGRhdGVBbGwgPSBleHQgPT09IFVQREFURV9BTEw7XG4gICAgLy8gaWYgd2UncmUgc3BlY2lmaWNhbGx5IHJlcXVlc3RpbmcgYW4gdXBkYXRlIGZvciBhbiBleHRlbnNpb24sIG1ha2Ugc3VyZSBpdCdzIGluc3RhbGxlZFxuICAgIGlmICghc2hvdWxkVXBkYXRlQWxsICYmICF0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChleHQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gJyR7ZXh0fScgd2FzIG5vdCBpbnN0YWxsZWQsIHNvIGNhbid0IGJlIHVwZGF0ZWRgKTtcbiAgICB9XG4gICAgY29uc3QgZXh0c1RvVXBkYXRlID0gc2hvdWxkVXBkYXRlQWxsID8gT2JqZWN0LmtleXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucykgOiBbZXh0XTtcblxuICAgIC8vICdlcnJvcnMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgZXJyb3Igb2JqZWN0cyBhcyB2YWx1ZXNcbiAgICBjb25zdCBlcnJvcnMgPSB7fTtcblxuICAgIC8vICd1cGRhdGVzJyB3aWxsIGhhdmUgZXh0IG5hbWVzIGFzIGtleXMgYW5kIHVwZGF0ZSBvYmplY3RzIGFzIHZhbHVlcywgd2hlcmUgYW4gdXBkYXRlXG4gICAgLy8gb2JqZWN0IGlzIG9mIHRoZSBmb3JtIHtmcm9tOiB2ZXJzaW9uU3RyaW5nLCB0bzogdmVyc2lvblN0cmluZ31cbiAgICBjb25zdCB1cGRhdGVzID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGUgb2YgZXh0c1RvVXBkYXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgYENoZWNraW5nIGlmICR7dGhpcy50eXBlfSAnJHtlfScgaXMgdXBkYXRhYmxlYCwgKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2VdLmluc3RhbGxUeXBlICE9PSBJTlNUQUxMX1RZUEVfTlBNKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm90VXBkYXRhYmxlRXJyb3IoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB1cGRhdGUgPSBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgYENoZWNraW5nIGlmICR7dGhpcy50eXBlfSAnJHtlfScgbmVlZHMgYW4gdXBkYXRlYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZSA9IGF3YWl0IHRoaXMuY2hlY2tGb3JFeHRlbnNpb25VcGRhdGUoZSk7XG4gICAgICAgICAgaWYgKCEodXBkYXRlLnNhZmVVcGRhdGUgfHwgdXBkYXRlLnVuc2FmZVVwZGF0ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb1VwZGF0ZXNBdmFpbGFibGVFcnJvcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdXBkYXRlO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF1bnNhZmUgJiYgIXVwZGF0ZS5zYWZlVXBkYXRlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJHt0aGlzLnR5cGV9ICcke2V9JyBoYXMgYSBtYWpvciByZXZpc2lvbiB1cGRhdGUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGAoJHt1cGRhdGUuY3VycmVudH0gPT4gJHt1cGRhdGUudW5zYWZlVXBkYXRlfSksIHdoaWNoIGNvdWxkIGluY2x1ZGUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBicmVha2luZyBjaGFuZ2VzLiBJZiB5b3Ugd2FudCB0byBhcHBseSB0aGlzIHVwZGF0ZSwgcmUtcnVuIHdpdGggLS11bnNhZmVgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cGRhdGVWZXIgPSB1bnNhZmUgJiYgdXBkYXRlLnVuc2FmZVVwZGF0ZSA/IHVwZGF0ZS51bnNhZmVVcGRhdGUgOiB1cGRhdGUuc2FmZVVwZGF0ZTtcbiAgICAgICAgYXdhaXQgc3BpbldpdGgoXG4gICAgICAgICAgdGhpcy5pc0pzb25PdXRwdXQsXG4gICAgICAgICAgYFVwZGF0aW5nIGRyaXZlciAnJHtlfScgZnJvbSAke3VwZGF0ZS5jdXJyZW50fSB0byAke3VwZGF0ZVZlcn1gLFxuICAgICAgICAgIGFzeW5jICgpID0+IGF3YWl0IHRoaXMudXBkYXRlRXh0ZW5zaW9uKGUsIHVwZGF0ZVZlcilcbiAgICAgICAgKTtcbiAgICAgICAgdXBkYXRlc1tlXSA9IHtmcm9tOiB1cGRhdGUuY3VycmVudCwgdG86IHVwZGF0ZVZlcn07XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgZXJyb3JzW2VdID0gZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgJ1VwZGF0ZSByZXBvcnQ6Jyk7XG4gICAgZm9yIChjb25zdCBbZSwgdXBkYXRlXSBvZiBfLnRvUGFpcnModXBkYXRlcykpIHtcbiAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYC0gJHt0aGlzLnR5cGV9ICR7ZX0gdXBkYXRlZDogJHt1cGRhdGUuZnJvbX0gPT4gJHt1cGRhdGUudG99YC5ncmVlbik7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2UsIGVycl0gb2YgXy50b1BhaXJzKGVycm9ycykpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RVcGRhdGFibGVFcnJvcikge1xuICAgICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGAtICcke2V9JyB3YXMgbm90IGluc3RhbGxlZCB2aWEgbnBtLCBzbyB3ZSBjb3VsZCBub3QgY2hlY2sgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGZvciB1cGRhdGVzYC55ZWxsb3cpO1xuICAgICAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBOb1VwZGF0ZXNBdmFpbGFibGVFcnJvcikge1xuICAgICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGAtICcke2V9JyBoYWQgbm8gdXBkYXRlcyBhdmFpbGFibGVgLnllbGxvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBvdGhlcndpc2UsIG1ha2UgaXQgcG9wIHdpdGggcmVkIVxuICAgICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGAtICcke2V9JyBmYWlsZWQgdG8gdXBkYXRlOiAke2Vycn1gLnJlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHt1cGRhdGVzLCBlcnJvcnN9O1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIFBvc3NpYmxlVXBkYXRlc1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY3VycmVudCAtIGN1cnJlbnQgdmVyc2lvblxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBzYWZlVXBkYXRlIC0gdmVyc2lvbiB3ZSBjYW4gc2FmZWx5IHVwZGF0ZSB0byBpZiBpdCBleGlzdHMsIG9yIG51bGxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gdW5zYWZlVXBkYXRlIC0gdmVyc2lvbiB3ZSBjYW4gdW5zYWZlbHkgdXBkYXRlIHRvIGlmIGl0IGV4aXN0cywgb3IgbnVsbFxuICAgKi9cblxuICAvKipcbiAgICogR2l2ZW4gYW4gZXh0ZW5zaW9uIG5hbWUsIGZpZ3VyZSBvdXQgd2hhdCBpdHMgaGlnaGVzdCBwb3NzaWJsZSB2ZXJzaW9uIHVwZ3JhZGUgaXMsIGFuZCBhbHNvIHRoZVxuICAgKiBoaWdoZXN0IHBvc3NpYmxlIHNhZmUgdXBncmFkZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dCAtIG5hbWUgb2YgZXh0ZW5zaW9uXG4gICAqIEByZXR1cm4ge1Bvc3NpYmxlVXBkYXRlc31cbiAgICovXG4gIGFzeW5jIGNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlIChleHQpIHtcbiAgICAvLyBUT0RPIGRlY2lkZSBob3cgd2Ugd2FudCB0byBoYW5kbGUgYmV0YSB2ZXJzaW9ucz9cbiAgICAvLyB0aGlzIGlzIGEgaGVscGVyIG1ldGhvZCwgJ2V4dCcgaXMgYXNzdW1lZCB0byBhbHJlYWR5IGJlIGluc3RhbGxlZCBoZXJlLCBhbmQgb2YgdGhlIG5wbVxuICAgIC8vIGluc3RhbGwgdHlwZVxuICAgIGNvbnN0IHt2ZXJzaW9uLCBwa2dOYW1lfSA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0XTtcbiAgICBsZXQgdW5zYWZlVXBkYXRlID0gYXdhaXQgdGhpcy5ucG0uZ2V0TGF0ZXN0VmVyc2lvbihwa2dOYW1lKTtcbiAgICBsZXQgc2FmZVVwZGF0ZSA9IGF3YWl0IHRoaXMubnBtLmdldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbihwa2dOYW1lLCB2ZXJzaW9uKTtcbiAgICBpZiAoIXV0aWwuY29tcGFyZVZlcnNpb25zKHVuc2FmZVVwZGF0ZSwgJz4nLCB2ZXJzaW9uKSkge1xuICAgICAgLy8gdGhlIGxhdGVzdCB2ZXJzaW9uIGlzIG5vdCBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgdmVyc2lvbiwgc28gdGhlcmUncyBubyBwb3NzaWJsZSB1cGRhdGVcbiAgICAgIHVuc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgICBzYWZlVXBkYXRlID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHVuc2FmZVVwZGF0ZSAmJiB1bnNhZmVVcGRhdGUgPT09IHNhZmVVcGRhdGUpIHtcbiAgICAgIC8vIHRoZSBsYXRlc3QgdXBkYXRlIGlzIHRoZSBzYW1lIGFzIHRoZSBzYWZlIHVwZGF0ZSwgd2hpY2ggbWVhbnMgaXQncyBub3QgYWN0dWFsbHkgdW5zYWZlXG4gICAgICB1bnNhZmVVcGRhdGUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoc2FmZVVwZGF0ZSAmJiAhdXRpbC5jb21wYXJlVmVyc2lvbnMoc2FmZVVwZGF0ZSwgJz4nLCB2ZXJzaW9uKSkge1xuICAgICAgLy8gZXZlbiB0aGUgc2FmZSB1cGRhdGUgaXMgbm90IGxhdGVyIHRoYW4gdGhlIGN1cnJlbnQsIHNvIGl0IGlzIG5vdCBhY3R1YWxseSBhbiB1cGRhdGVcbiAgICAgIHNhZmVVcGRhdGUgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge2N1cnJlbnQ6IHZlcnNpb24sIHNhZmVVcGRhdGUsIHVuc2FmZVVwZGF0ZX07XG4gIH1cblxuICAvKipcbiAgICogQWN0dWFsbHkgdXBkYXRlIGFuIGV4dGVuc2lvbiBpbnN0YWxsZWQgYnkgTlBNLCB1c2luZyB0aGUgTlBNIGNsaS4gQW5kIHVwZGF0ZSB0aGUgaW5zdGFsbGF0aW9uXG4gICAqIG1hbmlmZXN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0IC0gbmFtZSBvZiBleHRlbnNpb24gdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gdmVyc2lvbiBzdHJpbmcgaWRlbnRpZmllciB0byB1cGRhdGUgZXh0ZW5zaW9uIHRvXG4gICAqL1xuICBhc3luYyB1cGRhdGVFeHRlbnNpb24gKGV4dCwgdmVyc2lvbikge1xuICAgIGNvbnN0IHtwa2dOYW1lfSA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0XTtcbiAgICBhd2FpdCBmcy5yaW1yYWYodGhpcy5jb25maWcuZ2V0SW5zdGFsbFBhdGgoZXh0KSk7XG4gICAgY29uc3QgZXh0RGF0YSA9IGF3YWl0IHRoaXMuaW5zdGFsbFZpYU5wbSh7ZXh0LCBwa2dOYW1lLCBwa2dWZXI6IHZlcnNpb259KTtcbiAgICBkZWxldGUgZXh0RGF0YVtgJHt0aGlzLnR5cGV9TmFtZWBdO1xuICAgIGF3YWl0IHRoaXMuY29uZmlnLnVwZGF0ZUV4dGVuc2lvbihleHQsIGV4dERhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBzY3JpcHQgY2FjaGVkIGluc2lkZSB0aGUgXCJzY3JpcHRzXCIgZmllbGQgdW5kZXIgXCJhcHBpdW1cIlxuICAgKiBpbnNpZGUgb2YgdGhlIGRyaXZlci9wbHVnaW5zIFwicGFja2FnZS5qc29uXCIgZmlsZS4gV2lsbCB0aHJvd1xuICAgKiBhbiBlcnJvciBpZiB0aGUgZHJpdmVyL3BsdWdpbiBkb2VzIG5vdCBjb250YWluIGEgXCJzY3JpcHRzXCIgZmllbGRcbiAgICogdW5kZXJuZWF0aCB0aGUgXCJhcHBpdW1cIiBmaWVsZCBpbiBpdHMgcGFja2FnZS5qc29uLCBpZiB0aGVcbiAgICogXCJzY3JpcHRzXCIgZmllbGQgaXMgbm90IGEgcGxhaW4gb2JqZWN0LCBvciBpZiB0aGUgc2NyaXB0TmFtZSBpc1xuICAgKiBub3QgZm91bmQgd2l0aGluIFwic2NyaXB0c1wiIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dCAtIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0byBydW4gYSBzY3JpcHQgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NyaXB0TmFtZSAtIG5hbWUgb2YgdGhlIHNjcmlwdCB0byBydW5cbiAgICogQHJldHVybiB7UnVuT3V0cHV0fVxuICAgKi9cbiAgYXN5bmMgcnVuICh7ZXh0LCBzY3JpcHROYW1lfSkge1xuICAgIGlmICghXy5oYXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucywgZXh0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBwbGVhc2UgaW5zdGFsbCB0aGUgJHt0aGlzLnR5cGV9IGZpcnN0YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0Q29uZmlnID0gdGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHRdO1xuXG4gICAgaWYgKCFfLmhhcyhleHRDb25maWcsICdzY3JpcHRzJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtleHR9JyBkb2VzIG5vdCBjb250YWluIHRoZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgXCJzY3JpcHRzXCIgZmllbGQgdW5kZXJuZWF0aCB0aGUgXCJhcHBpdW1cIiBmaWVsZCBpbiBpdHMgcGFja2FnZS5qc29uYCk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0U2NyaXB0cyA9IGV4dENvbmZpZy5zY3JpcHRzO1xuXG4gICAgaWYgKCFfLmlzUGxhaW5PYmplY3QoZXh0U2NyaXB0cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtleHR9JyBcInNjcmlwdHNcIiBmaWVsZCBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0YCk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmhhcyhleHRTY3JpcHRzLCBzY3JpcHROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJHt0aGlzLnR5cGV9IG5hbWVkICcke2V4dH0nIGRvZXMgbm90IHN1cHBvcnQgdGhlIHNjcmlwdDogJyR7c2NyaXB0TmFtZX0nYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcnVubmVyID0gbmV3IFN1YlByb2Nlc3MocHJvY2Vzcy5leGVjUGF0aCwgW2V4dFNjcmlwdHNbc2NyaXB0TmFtZV1dLCB7XG4gICAgICBjd2Q6IHRoaXMuY29uZmlnLmdldEV4dGVuc2lvblJlcXVpcmVQYXRoKGV4dClcbiAgICB9KTtcblxuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBSaW5nQnVmZmVyKDUwKTtcblxuICAgIHJ1bm5lci5vbignc3RyZWFtLWxpbmUnLCAobGluZSkgPT4ge1xuICAgICAgb3V0cHV0LmVucXVldWUobGluZSk7XG4gICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGxpbmUpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgcnVubmVyLnN0YXJ0KDApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJ1bm5lci5qb2luKCk7XG4gICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGAke3NjcmlwdE5hbWV9IHN1Y2Nlc3NmdWxseSByYW5gLmdyZWVuKTtcbiAgICAgIHJldHVybiB7b3V0cHV0OiBvdXRwdXQuZ2V0QnVmZigpfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYEVuY291bnRlcmVkIGFuIGVycm9yIHdoZW4gcnVubmluZyAnJHtzY3JpcHROYW1lfSc6ICR7ZXJyLm1lc3NhZ2V9YC5yZWQpO1xuICAgICAgcmV0dXJuIHtlcnJvcjogZXJyLm1lc3NhZ2UsIG91dHB1dDogb3V0cHV0LmdldEJ1ZmYoKX07XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUnVuT3V0cHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ3x1bmRlZmluZWR9IGVycm9yIC0gZXJyb3IgbWVzc2FnZSBpZiBzY3JpcHQgcmFuIHVuc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UgdW5kZWZpbmVkXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBvdXRwdXQgLSBzY3JpcHQgb3V0cHV0XG4gKi9cbiJdLCJmaWxlIjoibGliL2NsaS9leHRlbnNpb24tY29tbWFuZC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|
|
464
|
+
exports.default = ExtensionCommand;
|
|
465
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQuanMiXSwibmFtZXMiOlsiVVBEQVRFX0FMTCIsIk5vdFVwZGF0YWJsZUVycm9yIiwiRXJyb3IiLCJOb1VwZGF0ZXNBdmFpbGFibGVFcnJvciIsIkV4dGVuc2lvbkNvbW1hbmQiLCJjb25maWciLCJrbm93bkV4dGVuc2lvbnMiLCJpc0pzb25PdXRwdXQiLCJjb25zdHJ1Y3RvciIsImpzb24iLCJ0eXBlIiwiZXh0ZW5zaW9uVHlwZSIsImV4ZWN1dGUiLCJhcmdzIiwiY21kIiwiXyIsImlzRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJleGVjdXRlQ21kIiwiYmluZCIsImxpc3QiLCJzaG93SW5zdGFsbGVkIiwic2hvd1VwZGF0ZXMiLCJsc01zZyIsImluc3RhbGxlZE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJrbm93bk5hbWVzIiwiZXh0cyIsInJlZHVjZSIsImFjYyIsIm5hbWUiLCJpbmNsdWRlcyIsImluc3RhbGxlZCIsInBrZ05hbWUiLCJleHQiLCJkYXRhIiwidG9QYWlycyIsImluc3RhbGxUeXBlIiwiSU5TVEFMTF9UWVBFX05QTSIsInVwZGF0ZXMiLCJjaGVja0ZvckV4dGVuc2lvblVwZGF0ZSIsInVwZGF0ZVZlcnNpb24iLCJzYWZlVXBkYXRlIiwidW5zYWZlVXBkYXRlVmVyc2lvbiIsInVuc2FmZVVwZGF0ZSIsInVwVG9EYXRlIiwiaW5zdGFsbFR4dCIsImdyZXkiLCJ1cGRhdGVUeHQiLCJ1cFRvRGF0ZVR4dCIsInVuc2FmZVVwZGF0ZVR4dCIsImluc3RhbGxTcGVjIiwidmVyc2lvbiIsInR5cGVUeHQiLCJJTlNUQUxMX1RZUEVfR0lUIiwiSU5TVEFMTF9UWVBFX0dJVEhVQiIsInllbGxvdyIsIklOU1RBTExfVFlQRV9MT0NBTCIsIm1hZ2VudGEiLCJncmVlbiIsImN5YW4iLCJjb25zb2xlIiwibG9nIiwiaW5zdGFsbCIsInBhY2thZ2VOYW1lIiwiZXh0RGF0YSIsIm1zZyIsImFwcGl1bUhvbWUiLCJwa2dKc29uRGF0YSIsIm5wbSIsImxpbmtQYWNrYWdlIiwiZ2V0RXh0ZW5zaW9uRmllbGRzIiwic3BsaXQiLCJsZW5ndGgiLCJpbnN0YWxsVmlhTnBtIiwicmVwbGFjZSIsInBrZ1ZlciIsInNwbGl0cyIsIkpTT04iLCJzdHJpbmdpZnkiLCJleHROYW1lIiwiaXNJbnN0YWxsZWQiLCJhZGRFeHRlbnNpb24iLCJnZXRQb3N0SW5zdGFsbFRleHQiLCJucG1TcGVjIiwic3BlY01zZyIsImluc3RhbGxQYWNrYWdlIiwiZXJyIiwibWVzc2FnZSIsImFwcGl1bSIsInZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzIiwiYXBwaXVtUGtnRGF0YSIsInVuaW5zdGFsbCIsImluc3RhbGxQYXRoIiwiZ2V0SW5zdGFsbFBhdGgiLCJmcyIsInJpbXJhZiIsInJlbW92ZUV4dGVuc2lvbiIsInVwZGF0ZSIsInVuc2FmZSIsInNob3VsZFVwZGF0ZUFsbCIsImV4dHNUb1VwZGF0ZSIsImVycm9ycyIsImUiLCJjdXJyZW50IiwidXBkYXRlVmVyIiwidXBkYXRlRXh0ZW5zaW9uIiwiZnJvbSIsInRvIiwicmVkIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsImdldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbiIsInV0aWwiLCJjb21wYXJlVmVyc2lvbnMiLCJydW4iLCJzY3JpcHROYW1lIiwiaGFzIiwiZXh0Q29uZmlnIiwic2NyaXB0cyIsImV4dFNjcmlwdHMiLCJpc1BsYWluT2JqZWN0IiwicnVubmVyIiwiU3ViUHJvY2VzcyIsInByb2Nlc3MiLCJleGVjUGF0aCIsImN3ZCIsIm91dHB1dCIsIlJpbmdCdWZmZXIiLCJvbiIsImxpbmUiLCJlbnF1ZXVlIiwic3RhcnQiLCJqb2luIiwiZ2V0QnVmZiIsImVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLFVBQVUsR0FBRyxXQUFuQjs7QUFFQSxNQUFNQyxpQkFBTixTQUFn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TUFBTSxFQUFFQSxNQUFNLENBQUNPLE9BQVA7QUFBVCxPQUFQO0FBQ0QsS0FKRCxDQUlFLE9BQU85QyxHQUFQLEVBQVk7QUFDWixzQkFBSSxLQUFLbEYsWUFBVCxFQUF3QixzQ0FBcUM4RyxVQUFXLE1BQUs1QixHQUFHLENBQUNDLE9BQVEsRUFBbEUsQ0FBb0VxQixHQUEzRjtBQUNBLGFBQU87QUFBQ3lCLFFBQUFBLEtBQUssRUFBRS9DLEdBQUcsQ0FBQ0MsT0FBWjtBQUFxQnNDLFFBQUFBLE1BQU0sRUFBRUEsTUFBTSxDQUFDTyxPQUFQO0FBQTdCLE9BQVA7QUFDRDtBQUNGOztBQXBmbUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cblxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IG5wbSwgZnMsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgbG9nLCBzcGluV2l0aCwgUmluZ0J1ZmZlciB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgU3ViUHJvY2VzcyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyBJTlNUQUxMX1RZUEVfTlBNLCBJTlNUQUxMX1RZUEVfR0lULCBJTlNUQUxMX1RZUEVfR0lUSFVCLFxuICAgICAgICAgSU5TVEFMTF9UWVBFX0xPQ0FMIH0gZnJvbSAnLi4vZXh0ZW5zaW9uL2V4dGVuc2lvbi1jb25maWcnO1xuXG5jb25zdCBVUERBVEVfQUxMID0gJ2luc3RhbGxlZCc7XG5cbmNsYXNzIE5vdFVwZGF0YWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cbmNsYXNzIE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXh0ZW5zaW9uQ29tbWFuZCB7XG4gIC8qKlxuICAgKiBUaGlzIGlzIHRoZSBgRHJpdmVyQ29uZmlnYCBvciBgUGx1Z2luQ29uZmlnYCwgZGVwZW5kaW5nIG9uIGBFeHRUeXBlYC5cbiAgICogQHR5cGUge0V4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn1cbiAgICovXG4gIGNvbmZpZztcblxuICAvKipcbiAgICoge0BsaW5rY29kZSBSZWNvcmR9IG9mIG9mZmljaWFsIHBsdWdpbnMgb3IgZHJpdmVycy5cbiAgICogQHR5cGUge0V4dFR5cGUgZXh0ZW5kcyBpbXBvcnQoJy4uL2V4dGVuc2lvbi9tYW5pZmVzdCcpLkRyaXZlclR5cGUgPyB0eXBlb2YgaW1wb3J0KCcuLi9jb25zdGFudHMnKS5LTk9XTl9EUklWRVJTIDogdHlwZW9mIGltcG9ydCgnLi4vY29uc3RhbnRzJykuS05PV05fUExVR0lOU31cbiAgICovXG4gIGtub3duRXh0ZW5zaW9ucztcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBjb21tYW5kIG91dHB1dCBoYXMgYmVlbiByZXF1ZXN0ZWQgYXMgSlNPTi5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBpc0pzb25PdXRwdXQ7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIEV4dGVuc2lvbkNvbW1hbmRcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Db21tYW5kT3B0aW9uczxFeHRUeXBlPn0gb3B0c1xuICAgKi9cbiAgY29uc3RydWN0b3IgKHtjb25maWcsIGpzb259KSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5pc0pzb25PdXRwdXQgPSBqc29uO1xuICB9XG5cbiAgLyoqXG4gICAqIGBkcml2ZXJgIG9yIGBwbHVnaW5gLCBkZXBlbmRpbmcgb24gdGhlIGBFeHRlbnNpb25Db25maWdgLlxuICAgKi9cbiAgZ2V0IHR5cGUgKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5leHRlbnNpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYSBDTEkgcGFyc2UgYW5kIHJ1biBhbiBleHRlbnNpb24gY29tbWFuZCBiYXNlZCBvbiBpdHMgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIGEga2V5L3ZhbHVlIG9iamVjdCB3aXRoIENMSSBmbGFncyBhbmQgdmFsdWVzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8b2JqZWN0Pn0gdGhlIHJlc3VsdCBvZiB0aGUgc3BlY2lmaWMgY29tbWFuZCB3aGljaCBpcyBleGVjdXRlZFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZSAoYXJncykge1xuICAgIGNvbnN0IGNtZCA9IGFyZ3NbYCR7dGhpcy50eXBlfUNvbW1hbmRgXTtcbiAgICBpZiAoIV8uaXNGdW5jdGlvbihFeHRlbnNpb25Db21tYW5kLnByb3RvdHlwZVtjbWRdKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgaGFuZGxlICR7dGhpcy50eXBlfSBjb21tYW5kICR7Y21kfWApO1xuICAgIH1cbiAgICBjb25zdCBleGVjdXRlQ21kID0gdGhpc1tjbWRdLmJpbmQodGhpcyk7XG4gICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGVDbWQoYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYgTGlzdE9wdGlvbnNcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBzaG93SW5zdGFsbGVkIC0gd2hldGhlciBzaG91bGQgc2hvdyBvbmx5IGluc3RhbGxlZCBleHRlbnNpb25zXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc2hvd1VwZGF0ZXMgLSB3aGV0aGVyIHNob3VsZCBzaG93IGF2YWlsYWJsZSB1cGRhdGVzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBMaXN0IGV4dGVuc2lvbnNcbiAgICpcbiAgICogQHBhcmFtIHtMaXN0T3B0aW9uc30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dGVuc2lvbkxpc3REYXRhPn0gbWFwIG9mIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgbGlzdCAoe3Nob3dJbnN0YWxsZWQsIHNob3dVcGRhdGVzfSkge1xuICAgIGNvbnN0IGxzTXNnID0gYExpc3RpbmcgJHtzaG93SW5zdGFsbGVkID8gJ2luc3RhbGxlZCcgOiAnYXZhaWxhYmxlJ30gJHt0aGlzLnR5cGV9c2A7XG4gICAgY29uc3QgaW5zdGFsbGVkTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zKTtcbiAgICBjb25zdCBrbm93bk5hbWVzID0gT2JqZWN0LmtleXModGhpcy5rbm93bkV4dGVuc2lvbnMpO1xuICAgIGNvbnN0IGV4dHMgPSBbLi4uaW5zdGFsbGVkTmFtZXMsIC4uLmtub3duTmFtZXNdLnJlZHVjZSgoYWNjLCBuYW1lKSA9PiB7XG4gICAgICBpZiAoIWFjY1tuYW1lXSkge1xuICAgICAgICBpZiAoaW5zdGFsbGVkTmFtZXMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgICBhY2NbbmFtZV0gPSB7Li4udGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tuYW1lXSwgaW5zdGFsbGVkOiB0cnVlfTtcbiAgICAgICAgfSBlbHNlIGlmICghc2hvd0luc3RhbGxlZCkge1xuICAgICAgICAgIGFjY1tuYW1lXSA9IHtwa2dOYW1lOiB0aGlzLmtub3duRXh0ZW5zaW9uc1tuYW1lXSwgaW5zdGFsbGVkOiBmYWxzZX07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgLyoqIEB0eXBlIHtFeHRlbnNpb25MaXN0RGF0YX0gKi8oe30pKTtcblxuICAgIC8vIGlmIHdlIHdhbnQgdG8gc2hvdyB3aGV0aGVyIHVwZGF0ZXMgYXJlIGF2YWlsYWJsZSwgcHV0IHRoYXQgYmVoaW5kIGEgc3Bpbm5lclxuICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBsc01zZywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzaG93VXBkYXRlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtleHQsIGRhdGFdIG9mIF8udG9QYWlycyhleHRzKSkge1xuICAgICAgICBpZiAoIWRhdGEuaW5zdGFsbGVkIHx8IGRhdGEuaW5zdGFsbFR5cGUgIT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAvLyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzIG9uIGV4dHMgdGhhdCBhcmVuJ3QgaW5zdGFsbGVkXG4gICAgICAgICAgLy8gYWxzbyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzIG9uIG5vbi1ucG0gZXh0c1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZXMgPSBhd2FpdCB0aGlzLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlKGV4dCk7XG4gICAgICAgIGRhdGEudXBkYXRlVmVyc2lvbiA9IHVwZGF0ZXMuc2FmZVVwZGF0ZTtcbiAgICAgICAgZGF0YS51bnNhZmVVcGRhdGVWZXJzaW9uID0gdXBkYXRlcy51bnNhZmVVcGRhdGU7XG4gICAgICAgIGRhdGEudXBUb0RhdGUgPSB1cGRhdGVzLnNhZmVVcGRhdGUgPT09IG51bGwgJiYgdXBkYXRlcy51bnNhZmVVcGRhdGUgPT09IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBpZiB3ZSdyZSBqdXN0IGdldHRpbmcgdGhlIGRhdGEsIHNob3J0IGNpcmN1aXQgcmV0dXJuIGhlcmUgc2luY2Ugd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnlcbiAgICAvLyBmb3JtYXR0aW5nIGxvZ2ljXG4gICAgaWYgKHRoaXMuaXNKc29uT3V0cHV0KSB7XG4gICAgICByZXR1cm4gZXh0cztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtcbiAgICAgIG5hbWUsXG4gICAgICBkYXRhXG4gICAgXSBvZiBfLnRvUGFpcnMoZXh0cykpIHtcbiAgICAgIGxldCBpbnN0YWxsVHh0ID0gJyBbbm90IGluc3RhbGxlZF0nLmdyZXk7XG4gICAgICBsZXQgdXBkYXRlVHh0ID0gJyc7XG4gICAgICBsZXQgdXBUb0RhdGVUeHQgPSAnJztcbiAgICAgIGxldCB1bnNhZmVVcGRhdGVUeHQgPSAnJztcbiAgICAgIGlmIChkYXRhLmluc3RhbGxlZCkge1xuICAgICAgICBjb25zdCB7aW5zdGFsbFR5cGUsIGluc3RhbGxTcGVjLCB1cGRhdGVWZXJzaW9uLCB1bnNhZmVVcGRhdGVWZXJzaW9uLCB2ZXJzaW9uLCB1cFRvRGF0ZX0gPSBkYXRhO1xuICAgICAgICBsZXQgdHlwZVR4dDtcbiAgICAgICAgc3dpdGNoIChpbnN0YWxsVHlwZSkge1xuICAgICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0dJVDpcbiAgICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9HSVRIVUI6XG4gICAgICAgICAgICB0eXBlVHh0ID0gYChjbG9uZWQgZnJvbSAke2luc3RhbGxTcGVjfSlgLnllbGxvdztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0xPQ0FMOlxuICAgICAgICAgICAgdHlwZVR4dCA9IGAobGlua2VkIGZyb20gJHtpbnN0YWxsU3BlY30pYC5tYWdlbnRhO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHR5cGVUeHQgPSAnKE5QTSknO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbGxUeHQgPSBgQCR7dmVyc2lvbi55ZWxsb3d9ICR7KCdbaW5zdGFsbGVkICcgKyB0eXBlVHh0ICsgJ10nKS5ncmVlbn1gO1xuXG4gICAgICAgIGlmIChzaG93VXBkYXRlcykge1xuICAgICAgICAgIGlmICh1cGRhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgICB1cGRhdGVUeHQgPSBgIFske3VwZGF0ZVZlcnNpb259IGF2YWlsYWJsZV1gLm1hZ2VudGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1cFRvRGF0ZSkge1xuICAgICAgICAgICAgdXBUb0RhdGVUeHQgPSBgIFtVcCB0byBkYXRlXWAuZ3JlZW47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1bnNhZmVVcGRhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgICB1bnNhZmVVcGRhdGVUeHQgPSBgIFske3Vuc2FmZVVwZGF0ZVZlcnNpb259IGF2YWlsYWJsZSAocG90ZW50aWFsbHkgdW5zYWZlKV1gLmN5YW47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUubG9nKGAtICR7bmFtZS55ZWxsb3d9JHtpbnN0YWxsVHh0fSR7dXBkYXRlVHh0fSR7dXBUb0RhdGVUeHR9JHt1bnNhZmVVcGRhdGVUeHR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4dHM7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhbiBleHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtJbnN0YWxsQXJnc30gYXJnc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dFJlY29yZDxFeHRUeXBlPj59IG1hcCBvZiBhbGwgaW5zdGFsbGVkIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgaW5zdGFsbCAoe2V4dCwgaW5zdGFsbFR5cGUsIHBhY2thZ2VOYW1lfSkge1xuICAgIC8qKiBAdHlwZSB7RXh0RGF0YTxFeHRUeXBlPn0gKi9cbiAgICBsZXQgZXh0RGF0YTtcbiAgICBsZXQgaW5zdGFsbFNwZWMgPSBleHQ7XG5cbiAgICBpZiAocGFja2FnZU5hbWUgJiYgW0lOU1RBTExfVFlQRV9MT0NBTCwgSU5TVEFMTF9UWVBFX05QTV0uaW5jbHVkZXMoaW5zdGFsbFR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFdoZW4gdXNpbmcgLS1zb3VyY2U9JHtpbnN0YWxsVHlwZX0sIGNhbm5vdCBhbHNvIHVzZSAtLXBhY2thZ2VgKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhY2thZ2VOYW1lICYmIFtJTlNUQUxMX1RZUEVfR0lULCBJTlNUQUxMX1RZUEVfR0lUSFVCXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgV2hlbiB1c2luZyAtLXNvdXJjZT0ke2luc3RhbGxUeXBlfSwgbXVzdCBhbHNvIHVzZSAtLXBhY2thZ2VgKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9MT0NBTCkge1xuICAgICAgY29uc3QgbXNnID0gYExpbmtpbmcgJHt0aGlzLnR5cGV9IGZyb20gbG9jYWwgcGF0aCBpbnRvICR7dGhpcy5jb25maWcuYXBwaXVtSG9tZX1gO1xuICAgICAgY29uc3QgcGtnSnNvbkRhdGEgPSBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgbXNnLCBhc3luYyAoKSA9PiAoXG4gICAgICAgIGF3YWl0IG5wbS5saW5rUGFja2FnZSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lLCBpbnN0YWxsU3BlYykpXG4gICAgICApO1xuICAgICAgZXh0RGF0YSA9IHRoaXMuZ2V0RXh0ZW5zaW9uRmllbGRzKHBrZ0pzb25EYXRhKTtcbiAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYFN1Y2Nlc3NmdWxseSBsaW5rZWQgJHtleHREYXRhLnBrZ05hbWV9IGludG8gJHt0aGlzLmNvbmZpZy5hcHBpdW1Ib21lfWApO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9HSVRIVUIpIHtcbiAgICAgIGlmIChpbnN0YWxsU3BlYy5zcGxpdCgnLycpLmxlbmd0aCAhPT0gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdpdGh1YiAke3RoaXMudHlwZX0gc3BlYyAke2luc3RhbGxTcGVjfSBhcHBlYXJlZCB0byBiZSBpbnZhbGlkOyBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdpdCBzaG91bGQgYmUgb2YgdGhlIGZvcm0gPG9yZz4vPHJlcG8+Jyk7XG4gICAgICB9XG4gICAgICBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKHtleHQ6IGluc3RhbGxTcGVjLCBwa2dOYW1lOiAvKiogQHR5cGUge3N0cmluZ30gKi8ocGFja2FnZU5hbWUpfSk7XG4gICAgfSBlbHNlIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX0dJVCkge1xuICAgICAgLy8gZ2l0IHVybHMgY2FuIGhhdmUgJy5naXQnIGF0IHRoZSBlbmQsIGJ1dCB0aGlzIGlzIG5vdCBuZWNlc3NhcnkgYW5kIHdvdWxkIGNvbXBsaWNhdGUgdGhlXG4gICAgICAvLyB3YXkgd2UgZG93bmxvYWQgYW5kIG5hbWUgZGlyZWN0b3JpZXMsIHNvIHdlIGNhbiBqdXN0IHJlbW92ZSBpdFxuICAgICAgaW5zdGFsbFNwZWMgPSBpbnN0YWxsU3BlYy5yZXBsYWNlKC9cXC5naXQkLywgJycpO1xuICAgICAgZXh0RGF0YSA9IGF3YWl0IHRoaXMuaW5zdGFsbFZpYU5wbSh7ZXh0OiBpbnN0YWxsU3BlYywgcGtnTmFtZTogLyoqIEB0eXBlIHtzdHJpbmd9ICovKHBhY2thZ2VOYW1lKX0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhdCB0aGlzIHBvaW50IHdlIGhhdmUgZWl0aGVyIGFuIG5wbSBwYWNrYWdlIG9yIGFuIGFwcGl1bSB2ZXJpZmllZCBleHRlbnNpb25cbiAgICAgIC8vIG5hbWUuIGJvdGggb2Ygd2hpY2ggd2lsbCBiZSBpbnN0YWxsZWQgdmlhIG5wbS5cbiAgICAgIC8vIGV4dGVuc2lvbnMgaW5zdGFsbGVkIHZpYSBucG0gY2FuIGluY2x1ZGUgdmVyc2lvbnMgb3IgdGFncyBhZnRlciB0aGUgJ0AnXG4gICAgICAvLyBzaWduLCBzbyBjaGVjayBmb3IgdGhhdC4gV2UgYWxzbyBuZWVkIHRvIGJlIGNhcmVmdWwgdGhhdCBwYWNrYWdlIG5hbWVzIHRoZW1zZWx2ZXMgY2FuXG4gICAgICAvLyBjb250YWluIHRoZSAnQCcgc3ltYm9sLCBhcyBpbiBgbnBtIGluc3RhbGwgQGFwcGl1bS9mYWtlLWRyaXZlckAxLjIuMGBcbiAgICAgIGxldCBuYW1lLCBwa2dWZXI7XG4gICAgICBjb25zdCBzcGxpdHMgPSBpbnN0YWxsU3BlYy5zcGxpdCgnQCcpO1xuICAgICAgaWYgKGluc3RhbGxTcGVjWzBdID09PSAnQCcpIHtcbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIGFuIG5wbSBvcmcgaW5jbHVkZWQgaW4gdGhlIHBhY2thZ2UgbmFtZVxuICAgICAgICBbbmFtZSwgcGtnVmVyXSA9IFtgQCR7c3BsaXRzWzFdfWAsIHNwbGl0c1syXV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGlzIGlzIHRoZSBjYXNlIHdpdGhvdXQgYW4gbnBtIG9yZ1xuICAgICAgICBbbmFtZSwgcGtnVmVyXSA9IHNwbGl0cztcbiAgICAgIH1cbiAgICAgIGxldCBwa2dOYW1lO1xuXG4gICAgICBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgLy8gaWYgd2UncmUgaW5zdGFsbGluZyBhIG5hbWVkIHBhY2thZ2UgZnJvbSBucG0sIHdlIGRvbid0IG5lZWQgdG8gY2hlY2tcbiAgICAgICAgLy8gYWdhaW5zdCB0aGUgYXBwaXVtIGV4dGVuc2lvbiBsaXN0OyBqdXN0IHVzZSB0aGUgaW5zdGFsbFNwZWMgYXMgaXNcbiAgICAgICAgcGtnTmFtZSA9IG5hbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB3ZSdyZSBpbnN0YWxsaW5nIGEgbmFtZWQgYXBwaXVtIGRyaXZlciAobGlrZSAneGN1aXRlc3QnKSB3ZSBuZWVkIHRvXG4gICAgICAgIC8vIGRlcmVmZXJlbmNlIHRoZSBhY3R1YWwgbnBtIHBhY2thZ2UgKCdhcHBpdXBtLXhjdWl0ZXN0LWRyaXZlcicpLCBzb1xuICAgICAgICAvLyBjaGVjayBpdCBleGlzdHMgYW5kIGdldCB0aGUgY29ycmVjdCBwYWNrYWdlXG4gICAgICAgIGNvbnN0IGtub3duTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmtub3duRXh0ZW5zaW9ucyk7XG4gICAgICAgIGlmICghXy5pbmNsdWRlcyhrbm93bk5hbWVzLCBuYW1lKSkge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IGBDb3VsZCBub3QgcmVzb2x2ZSAke3RoaXMudHlwZX07IGFyZSB5b3Ugc3VyZSBpdCdzIGluIHRoZSBsaXN0IGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBvZiBzdXBwb3J0ZWQgJHt0aGlzLnR5cGV9cz8gJHtKU09OLnN0cmluZ2lmeShrbm93bk5hbWVzKX1gO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICB9XG4gICAgICAgIHBrZ05hbWUgPSB0aGlzLmtub3duRXh0ZW5zaW9uc1tuYW1lXTtcbiAgICAgICAgLy8gZ2l2ZW4gdGhhdCB3ZSdsbCB1c2UgdGhlIGluc3RhbGwgdHlwZSBpbiB0aGUgZHJpdmVyIGpzb24sIHN0b3JlIGl0IGFzXG4gICAgICAgIC8vICducG0nIG5vd1xuICAgICAgICBpbnN0YWxsVHlwZSA9IElOU1RBTExfVFlQRV9OUE07XG4gICAgICB9XG5cbiAgICAgIGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe2V4dCwgcGtnTmFtZSwgcGtnVmVyfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0TmFtZSA9IGV4dERhdGFbLyoqIEB0eXBlIHtzdHJpbmd9ICovKGAke3RoaXMudHlwZX1OYW1lYCldO1xuICAgIGRlbGV0ZSBleHREYXRhWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyhgJHt0aGlzLnR5cGV9TmFtZWApXTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChleHROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBICR7dGhpcy50eXBlfSBuYW1lZCAnJHtleHROYW1lfScgaXMgYWxyZWFkeSBpbnN0YWxsZWQuIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBEaWQgeW91IG1lYW4gdG8gdXBkYXRlPyAnYXBwaXVtICR7dGhpcy50eXBlfSB1cGRhdGUnLiBTZWUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYGluc3RhbGxlZCAke3RoaXMudHlwZX1zIHdpdGggJ2FwcGl1bSAke3RoaXMudHlwZX0gbGlzdCAtLWluc3RhbGxlZCcuYCk7XG4gICAgfVxuXG4gICAgZXh0RGF0YS5pbnN0YWxsVHlwZSA9IGluc3RhbGxUeXBlO1xuICAgIGV4dERhdGEuaW5zdGFsbFNwZWMgPSBpbnN0YWxsU3BlYztcbiAgICBhd2FpdCB0aGlzLmNvbmZpZy5hZGRFeHRlbnNpb24oZXh0TmFtZSwgZXh0RGF0YSk7XG5cbiAgICAvLyBsb2cgaW5mbyBmb3IgdGhlIHVzZXJcbiAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIHRoaXMuZ2V0UG9zdEluc3RhbGxUZXh0KHtleHROYW1lLCBleHREYXRhfSkpO1xuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhbiBleHRlbnNpb24gdmlhIE5QTVxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxWaWFOcG1BcmdzfSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEV4dERhdGE8RXh0VHlwZT4+fVxuICAgKi9cbiAgYXN5bmMgaW5zdGFsbFZpYU5wbSAoe2V4dCwgcGtnTmFtZSwgcGtnVmVyfSkge1xuICAgIGNvbnN0IG5wbVNwZWMgPSBgJHtwa2dOYW1lfSR7cGtnVmVyID8gJ0AnICsgcGtnVmVyIDogJyd9YDtcbiAgICBjb25zdCBzcGVjTXNnID0gbnBtU3BlYyA9PT0gZXh0ID8gJycgOiBgIHVzaW5nIE5QTSBpbnN0YWxsIHNwZWMgJyR7bnBtU3BlY30nYDtcbiAgICBjb25zdCBtc2cgPSBgSW5zdGFsbGluZyAnJHtleHR9JyR7c3BlY01zZ31gO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwa2dKc29uRGF0YSA9IGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBtc2csIGFzeW5jICgpID0+IChcbiAgICAgICAgYXdhaXQgbnBtLmluc3RhbGxQYWNrYWdlKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUsIHtcbiAgICAgICAgICBwa2dWZXJcbiAgICAgICAgfSlcbiAgICAgICkpO1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RXh0ZW5zaW9uRmllbGRzKHBrZ0pzb25EYXRhKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW5jb3VudGVyZWQgYW4gZXJyb3Igd2hlbiBpbnN0YWxsaW5nIHBhY2thZ2U6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdGV4dCB3aGljaCBzaG91bGQgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGFmdGVyIGFuIGV4dGVuc2lvbiBoYXMgYmVlbiBpbnN0YWxsZWQuIFRoaXNcbiAgICogaXMgZGVzaWduZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSBkcml2ZXJzL3BsdWdpbnMgd2l0aCB0aGVpciBvd24gcGFydGljdWxhciB0ZXh0LlxuICAgKlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvbkFyZ3N9IGFyZ3NcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBnZXRQb3N0SW5zdGFsbFRleHQgKGFyZ3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYmUgaW1wbGVtZW50ZWQgaW4gZmluYWwgY2xhc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIGFuIE5QTSBtb2R1bGUncyBwYWNrYWdlLmpzb24gYW5kIGV4dHJhY3QgQXBwaXVtIGRyaXZlciBpbmZvcm1hdGlvbiBmcm9tIGEgc3BlY2lhbFxuICAgKiAnYXBwaXVtJyBmaWVsZCBpbiB0aGUgSlNPTiBkYXRhLiBXZSBuZWVkIHRoaXMgaW5mb3JtYXRpb24gdG8gZS5nLiBkZXRlcm1pbmUgd2hpY2ggY2xhc3MgdG9cbiAgICogbG9hZCBhcyB0aGUgbWFpbiBkcml2ZXIgY2xhc3MsIG9yIHRvIGJlIGFibGUgdG8gZGV0ZWN0IGluY29tcGF0aWJpbGl0aWVzIGJldHdlZW4gZHJpdmVyIGFuZFxuICAgKiBhcHBpdW0gdmVyc2lvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwa2dKc29uRGF0YSAtIHRoZSBwYWNrYWdlLmpzb24gZGF0YSBmb3IgYSBkcml2ZXIgbW9kdWxlLCBhcyBpZiBpdCBoYWQgYmVlblxuICAgKiBzdHJhaWdodGZvcndhcmRseSAncmVxdWlyZSdkXG4gICAqL1xuICBnZXRFeHRlbnNpb25GaWVsZHMgKHBrZ0pzb25EYXRhKSB7XG4gICAgaWYgKCFwa2dKc29uRGF0YS5hcHBpdW0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW5zdGFsbGVkIGRyaXZlciBkaWQgbm90IGhhdmUgYW4gJ2FwcGl1bScgc2VjdGlvbiBpbiBpdHMgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYHBhY2thZ2UuanNvbiBmaWxlIGFzIGV4cGVjdGVkYCk7XG4gICAgfVxuICAgIGNvbnN0IHthcHBpdW0sIG5hbWUsIHZlcnNpb259ID0gcGtnSnNvbkRhdGE7XG4gICAgdGhpcy52YWxpZGF0ZUV4dGVuc2lvbkZpZWxkcyhhcHBpdW0pO1xuXG4gICAgcmV0dXJuIHsuLi5hcHBpdW0sIHBrZ05hbWU6IG5hbWUsIHZlcnNpb259O1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBhbnkgcGFja2FnZS5qc29uIGZpZWxkcyB3aGljaCBhIHBhcnRpY3VsYXIgdHlwZSBvZiBleHRlbnNpb24gcmVxdWlyZXMsIHZhbGlkYXRlIHRoZVxuICAgKiBwcmVzZW5jZSBhbmQgZm9ybSBvZiB0aG9zZSBmaWVsZHMgb24gdGhlIHBhY2thZ2UuanNvbiBkYXRhLCB0aHJvd2luZyBhbiBlcnJvciBpZiBhbnl0aGluZyBpc1xuICAgKiBhbWlzcy5cbiAgICpcbiAgICogQHBhcmFtIHtpbXBvcnQoJy4uL2V4dGVuc2lvbi9tYW5pZmVzdCcpLkV4dGVybmFsRGF0YTxFeHRUeXBlPn0gYXBwaXVtUGtnRGF0YSAtIHRoZSBkYXRhIGluIHRoZSBcImFwcGl1bVwiIGZpZWxkIG9mIHBhY2thZ2UuanNvbiBmb3IgYW4gZXh0ZW5zaW9uXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFsaWRhdGVFeHRlbnNpb25GaWVsZHMgKGFwcGl1bVBrZ0RhdGEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYmUgaW1wbGVtZW50ZWQgaW4gZmluYWwgY2xhc3MnKTtcbiAgfVxuICAvKipcbiAgICogVW5pbnN0YWxsIGFuIGV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge1VuaW5zdGFsbE9wdHN9IG9wdHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxFeHRSZWNvcmQ8RXh0VHlwZT4+fSBtYXAgb2YgYWxsIGluc3RhbGxlZCBleHRlbnNpb24gbmFtZXMgdG8gZXh0ZW5zaW9uIGRhdGFcbiAgICovXG4gIGFzeW5jIHVuaW5zdGFsbCAoe2V4dH0pIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKGV4dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgdW5pbnN0YWxsICR7dGhpcy50eXBlfSAnJHtleHR9JzsgaXQgaXMgbm90IGluc3RhbGxlZGApO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YWxsUGF0aCA9IHRoaXMuY29uZmlnLmdldEluc3RhbGxQYXRoKGV4dCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZihpbnN0YWxsUGF0aCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuY29uZmlnLnJlbW92ZUV4dGVuc2lvbihleHQpO1xuICAgIH1cbiAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGBTdWNjZXNzZnVsbHkgdW5pbnN0YWxsZWQgJHt0aGlzLnR5cGV9ICcke2V4dH0nYC5ncmVlbik7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdCB0byB1cGRhdGUgb25lIG9yIG1vcmUgZHJpdmVycyB1c2luZyBOUE1cbiAgICpcbiAgICogQHBhcmFtIHtFeHRlbnNpb25VcGRhdGVPcHRzfSB1cGRhdGVTcGVjXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RXh0ZW5zaW9uVXBkYXRlUmVzdWx0Pn1cbiAgICovXG4gIGFzeW5jIHVwZGF0ZSAoe2V4dCwgdW5zYWZlfSkge1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUFsbCA9IGV4dCA9PT0gVVBEQVRFX0FMTDtcbiAgICAvLyBpZiB3ZSdyZSBzcGVjaWZpY2FsbHkgcmVxdWVzdGluZyBhbiB1cGRhdGUgZm9yIGFuIGV4dGVuc2lvbiwgbWFrZSBzdXJlIGl0J3MgaW5zdGFsbGVkXG4gICAgaWYgKCFzaG91bGRVcGRhdGVBbGwgJiYgIXRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKGV4dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSAnJHtleHR9JyB3YXMgbm90IGluc3RhbGxlZCwgc28gY2FuJ3QgYmUgdXBkYXRlZGApO1xuICAgIH1cbiAgICBjb25zdCBleHRzVG9VcGRhdGUgPSBzaG91bGRVcGRhdGVBbGwgPyBPYmplY3Qua2V5cyh0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zKSA6IFtleHRdO1xuXG4gICAgLy8gJ2Vycm9ycycgd2lsbCBoYXZlIGV4dCBuYW1lcyBhcyBrZXlzIGFuZCBlcnJvciBvYmplY3RzIGFzIHZhbHVlc1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxFcnJvcj59ICovXG4gICAgY29uc3QgZXJyb3JzID0ge307XG5cbiAgICAvLyAndXBkYXRlcycgd2lsbCBoYXZlIGV4dCBuYW1lcyBhcyBrZXlzIGFuZCB1cGRhdGUgb2JqZWN0cyBhcyB2YWx1ZXMsIHdoZXJlIGFuIHVwZGF0ZVxuICAgIC8vIG9iamVjdCBpcyBvZiB0aGUgZm9ybSB7ZnJvbTogdmVyc2lvblN0cmluZywgdG86IHZlcnNpb25TdHJpbmd9XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLFVwZGF0ZVJlcG9ydD59ICovXG4gICAgY29uc3QgdXBkYXRlcyA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBlIG9mIGV4dHNUb1VwZGF0ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3BpbldpdGgodGhpcy5pc0pzb25PdXRwdXQsIGBDaGVja2luZyBpZiAke3RoaXMudHlwZX0gJyR7ZX0nIGlzIHVwZGF0YWJsZWAsICgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tlXS5pbnN0YWxsVHlwZSAhPT0gSU5TVEFMTF9UWVBFX05QTSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFVwZGF0YWJsZUVycm9yKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdXBkYXRlID0gYXdhaXQgc3BpbldpdGgodGhpcy5pc0pzb25PdXRwdXQsIGBDaGVja2luZyBpZiAke3RoaXMudHlwZX0gJyR7ZX0nIG5lZWRzIGFuIHVwZGF0ZWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB1cGRhdGUgPSBhd2FpdCB0aGlzLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlKGUpO1xuICAgICAgICAgIGlmICghKHVwZGF0ZS5zYWZlVXBkYXRlIHx8IHVwZGF0ZS51bnNhZmVVcGRhdGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm9VcGRhdGVzQXZhaWxhYmxlRXJyb3IoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdW5zYWZlICYmICF1cGRhdGUuc2FmZVVwZGF0ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSAnJHtlfScgaGFzIGEgbWFqb3IgcmV2aXNpb24gdXBkYXRlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBgKCR7dXBkYXRlLmN1cnJlbnR9ID0+ICR7dXBkYXRlLnVuc2FmZVVwZGF0ZX0pLCB3aGljaCBjb3VsZCBpbmNsdWRlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBgYnJlYWtpbmcgY2hhbmdlcy4gSWYgeW91IHdhbnQgdG8gYXBwbHkgdGhpcyB1cGRhdGUsIHJlLXJ1biB3aXRoIC0tdW5zYWZlYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlVmVyID0gdW5zYWZlICYmIHVwZGF0ZS51bnNhZmVVcGRhdGUgPyB1cGRhdGUudW5zYWZlVXBkYXRlIDogdXBkYXRlLnNhZmVVcGRhdGU7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKFxuICAgICAgICAgIHRoaXMuaXNKc29uT3V0cHV0LFxuICAgICAgICAgIGBVcGRhdGluZyBkcml2ZXIgJyR7ZX0nIGZyb20gJHt1cGRhdGUuY3VycmVudH0gdG8gJHt1cGRhdGVWZXJ9YCxcbiAgICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnVwZGF0ZUV4dGVuc2lvbihlLCB1cGRhdGVWZXIpXG4gICAgICAgICk7XG4gICAgICAgIHVwZGF0ZXNbZV0gPSB7ZnJvbTogdXBkYXRlLmN1cnJlbnQsIHRvOiB1cGRhdGVWZXJ9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGVycm9yc1tlXSA9IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsICdVcGRhdGUgcmVwb3J0OicpO1xuICAgIGZvciAoY29uc3QgW2UsIHVwZGF0ZV0gb2YgXy50b1BhaXJzKHVwZGF0ZXMpKSB7XG4gICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGAtICR7dGhpcy50eXBlfSAke2V9IHVwZGF0ZWQ6ICR7dXBkYXRlLmZyb219ID0+ICR7dXBkYXRlLnRvfWAuZ3JlZW4pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtlLCBlcnJdIG9mIF8udG9QYWlycyhlcnJvcnMpKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90VXBkYXRhYmxlRXJyb3IpIHtcbiAgICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgLSAnJHtlfScgd2FzIG5vdCBpbnN0YWxsZWQgdmlhIG5wbSwgc28gd2UgY291bGQgbm90IGNoZWNrIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBmb3IgdXBkYXRlc2AueWVsbG93KTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgTm9VcGRhdGVzQXZhaWxhYmxlRXJyb3IpIHtcbiAgICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgLSAnJHtlfScgaGFkIG5vIHVwZGF0ZXMgYXZhaWxhYmxlYC55ZWxsb3cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBtYWtlIGl0IHBvcCB3aXRoIHJlZCFcbiAgICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgLSAnJHtlfScgZmFpbGVkIHRvIHVwZGF0ZTogJHtlcnJ9YC5yZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7dXBkYXRlcywgZXJyb3JzfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhbiBleHRlbnNpb24gbmFtZSwgZmlndXJlIG91dCB3aGF0IGl0cyBoaWdoZXN0IHBvc3NpYmxlIHZlcnNpb24gdXBncmFkZSBpcywgYW5kIGFsc28gdGhlXG4gICAqIGhpZ2hlc3QgcG9zc2libGUgc2FmZSB1cGdyYWRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0IC0gbmFtZSBvZiBleHRlbnNpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxQb3NzaWJsZVVwZGF0ZXM+fVxuICAgKi9cbiAgYXN5bmMgY2hlY2tGb3JFeHRlbnNpb25VcGRhdGUgKGV4dCkge1xuICAgIC8vIFRPRE8gZGVjaWRlIGhvdyB3ZSB3YW50IHRvIGhhbmRsZSBiZXRhIHZlcnNpb25zP1xuICAgIC8vIHRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kLCAnZXh0JyBpcyBhc3N1bWVkIHRvIGFscmVhZHkgYmUgaW5zdGFsbGVkIGhlcmUsIGFuZCBvZiB0aGUgbnBtXG4gICAgLy8gaW5zdGFsbCB0eXBlXG4gICAgY29uc3Qge3ZlcnNpb24sIHBrZ05hbWV9ID0gdGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHRdO1xuICAgIGxldCB1bnNhZmVVcGRhdGUgPSBhd2FpdCBucG0uZ2V0TGF0ZXN0VmVyc2lvbih0aGlzLmNvbmZpZy5hcHBpdW1Ib21lLCBwa2dOYW1lKTtcbiAgICBsZXQgc2FmZVVwZGF0ZSA9IGF3YWl0IG5wbS5nZXRMYXRlc3RTYWZlVXBncmFkZVZlcnNpb24odGhpcy5jb25maWcuYXBwaXVtSG9tZSwgcGtnTmFtZSwgdmVyc2lvbik7XG4gICAgaWYgKCF1dGlsLmNvbXBhcmVWZXJzaW9ucyh1bnNhZmVVcGRhdGUsICc+JywgdmVyc2lvbikpIHtcbiAgICAgIC8vIHRoZSBsYXRlc3QgdmVyc2lvbiBpcyBub3QgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHZlcnNpb24sIHNvIHRoZXJlJ3Mgbm8gcG9zc2libGUgdXBkYXRlXG4gICAgICB1bnNhZmVVcGRhdGUgPSBudWxsO1xuICAgICAgc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIGlmICh1bnNhZmVVcGRhdGUgJiYgdW5zYWZlVXBkYXRlID09PSBzYWZlVXBkYXRlKSB7XG4gICAgICAvLyB0aGUgbGF0ZXN0IHVwZGF0ZSBpcyB0aGUgc2FtZSBhcyB0aGUgc2FmZSB1cGRhdGUsIHdoaWNoIG1lYW5zIGl0J3Mgbm90IGFjdHVhbGx5IHVuc2FmZVxuICAgICAgdW5zYWZlVXBkYXRlID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHNhZmVVcGRhdGUgJiYgIXV0aWwuY29tcGFyZVZlcnNpb25zKHNhZmVVcGRhdGUsICc+JywgdmVyc2lvbikpIHtcbiAgICAgIC8vIGV2ZW4gdGhlIHNhZmUgdXBkYXRlIGlzIG5vdCBsYXRlciB0aGFuIHRoZSBjdXJyZW50LCBzbyBpdCBpcyBub3QgYWN0dWFsbHkgYW4gdXBkYXRlXG4gICAgICBzYWZlVXBkYXRlID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtjdXJyZW50OiB2ZXJzaW9uLCBzYWZlVXBkYXRlLCB1bnNhZmVVcGRhdGV9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdHVhbGx5IHVwZGF0ZSBhbiBleHRlbnNpb24gaW5zdGFsbGVkIGJ5IE5QTSwgdXNpbmcgdGhlIE5QTSBjbGkuIEFuZCB1cGRhdGUgdGhlIGluc3RhbGxhdGlvblxuICAgKiBtYW5pZmVzdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dCAtIG5hbWUgb2YgZXh0ZW5zaW9uIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIHZlcnNpb24gc3RyaW5nIGlkZW50aWZpZXIgdG8gdXBkYXRlIGV4dGVuc2lvbiB0b1xuICAgKi9cbiAgYXN5bmMgdXBkYXRlRXh0ZW5zaW9uIChleHQsIHZlcnNpb24pIHtcbiAgICBjb25zdCB7cGtnTmFtZX0gPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dF07XG4gICAgYXdhaXQgZnMucmltcmFmKHRoaXMuY29uZmlnLmdldEluc3RhbGxQYXRoKGV4dCkpO1xuICAgIGNvbnN0IGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe2V4dCwgcGtnTmFtZSwgcGtnVmVyOiB2ZXJzaW9ufSk7XG4gICAgZGVsZXRlIGV4dERhdGFbLyoqIEB0eXBlIHtzdHJpbmd9ICovKGAke3RoaXMudHlwZX1OYW1lYCldO1xuICAgIGF3YWl0IHRoaXMuY29uZmlnLnVwZGF0ZUV4dGVuc2lvbihleHQsIGV4dERhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBzY3JpcHQgY2FjaGVkIGluc2lkZSB0aGUgXCJzY3JpcHRzXCIgZmllbGQgdW5kZXIgXCJhcHBpdW1cIlxuICAgKiBpbnNpZGUgb2YgdGhlIGRyaXZlci9wbHVnaW5zIFwicGFja2FnZS5qc29uXCIgZmlsZS4gV2lsbCB0aHJvd1xuICAgKiBhbiBlcnJvciBpZiB0aGUgZHJpdmVyL3BsdWdpbiBkb2VzIG5vdCBjb250YWluIGEgXCJzY3JpcHRzXCIgZmllbGRcbiAgICogdW5kZXJuZWF0aCB0aGUgXCJhcHBpdW1cIiBmaWVsZCBpbiBpdHMgcGFja2FnZS5qc29uLCBpZiB0aGVcbiAgICogXCJzY3JpcHRzXCIgZmllbGQgaXMgbm90IGEgcGxhaW4gb2JqZWN0LCBvciBpZiB0aGUgc2NyaXB0TmFtZSBpc1xuICAgKiBub3QgZm91bmQgd2l0aGluIFwic2NyaXB0c1wiIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtSdW5PcHRpb25zfSBvcHRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UnVuT3V0cHV0Pn1cbiAgICovXG4gIGFzeW5jIHJ1biAoe2V4dCwgc2NyaXB0TmFtZX0pIHtcbiAgICBpZiAoIV8uaGFzKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnMsIGV4dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcGxlYXNlIGluc3RhbGwgdGhlICR7dGhpcy50eXBlfSBmaXJzdGApO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dENvbmZpZyA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0XTtcblxuICAgIC8vIG5vdGU6IFRTIGNhbm5vdCB1bmRlcnN0YW5kIHRoYXQgXy5oYXMoKSBpcyBhIHR5cGUgZ3VhcmRcbiAgICBpZiAoIWV4dENvbmZpZy5zY3JpcHRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gbmFtZWQgJyR7ZXh0fScgZG9lcyBub3QgY29udGFpbiB0aGUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYFwic2NyaXB0c1wiIGZpZWxkIHVuZGVybmVhdGggdGhlIFwiYXBwaXVtXCIgZmllbGQgaW4gaXRzIHBhY2thZ2UuanNvbmApO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dFNjcmlwdHMgPSBleHRDb25maWcuc2NyaXB0cztcblxuICAgIGlmICghXy5pc1BsYWluT2JqZWN0KGV4dFNjcmlwdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gbmFtZWQgJyR7ZXh0fScgXCJzY3JpcHRzXCIgZmllbGQgbXVzdCBiZSBhIHBsYWluIG9iamVjdGApO1xuICAgIH1cblxuICAgIGlmICghXy5oYXMoZXh0U2NyaXB0cywgc2NyaXB0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtleHR9JyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzY3JpcHQ6ICcke3NjcmlwdE5hbWV9J2ApO1xuICAgIH1cblxuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBTdWJQcm9jZXNzKHByb2Nlc3MuZXhlY1BhdGgsIFtcbiAgICAgIGV4dFNjcmlwdHNbc2NyaXB0TmFtZV1cbiAgICBdLCB7XG4gICAgICBjd2Q6IHRoaXMuY29uZmlnLmdldEluc3RhbGxQYXRoKGV4dClcbiAgICB9KTtcblxuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBSaW5nQnVmZmVyKDUwKTtcblxuICAgIHJ1bm5lci5vbignc3RyZWFtLWxpbmUnLCAobGluZSkgPT4ge1xuICAgICAgb3V0cHV0LmVucXVldWUobGluZSk7XG4gICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGxpbmUpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgcnVubmVyLnN0YXJ0KDApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJ1bm5lci5qb2luKCk7XG4gICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGAke3NjcmlwdE5hbWV9IHN1Y2Nlc3NmdWxseSByYW5gLmdyZWVuKTtcbiAgICAgIHJldHVybiB7b3V0cHV0OiBvdXRwdXQuZ2V0QnVmZigpfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYEVuY291bnRlcmVkIGFuIGVycm9yIHdoZW4gcnVubmluZyAnJHtzY3JpcHROYW1lfSc6ICR7ZXJyLm1lc3NhZ2V9YC5yZWQpO1xuICAgICAgcmV0dXJuIHtlcnJvcjogZXJyLm1lc3NhZ2UsIG91dHB1dDogb3V0cHV0LmdldEJ1ZmYoKX07XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZycpLkV4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn0gRXh0ZW5zaW9uQ29uZmlnXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kfSBjb25zdHJ1Y3RvclxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25Db21tYW5kT3B0aW9uc1xuICogQHByb3BlcnR5IHtFeHRlbnNpb25Db25maWc8RXh0VHlwZT59IGNvbmZpZyAtIHRoZSBgRHJpdmVyQ29uZmlnYCBvciBgUGx1Z2luQ29uZmlnYCBpbnN0YW5jZSB1c2VkIGZvciB0aGlzIGNvbW1hbmRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0ganNvbiAtIHdoZXRoZXIgdGhlIG91dHB1dCBvZiB0aGlzIGNvbW1hbmQgc2hvdWxkIGJlIEpTT04gb3IgdGV4dFxuICovXG5cbi8qKlxuICogRXh0cmEgc3R1ZmYgYWJvdXQgZXh0ZW5zaW9uczsgdXNlZCBpbmRpcmVjdGx5IGJ5IHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fS5cbiAqXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25NZXRhZGF0YVxuICogQHByb3BlcnR5IHtib29sZWFufSBpbnN0YWxsZWQgLSBJZiBgdHJ1ZWAsIHRoZSBleHRlbnNpb24gaXMgaW5zdGFsbGVkXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbdXBkYXRlVmVyc2lvbl0gLSBJZiB0aGUgZXh0ZW5zaW9uIGlzIGluc3RhbGxlZCwgdGhlIHZlcnNpb24gaXQgY2FuIGJlIHVwZGF0ZWQgdG9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFt1bnNhZmVVcGRhdGVWZXJzaW9uXSAtIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIG1ham9yIHZlcnNpb24gYnVtcFxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXBUb0RhdGVdIC0gSWYgdGhlIGV4dGVuc2lvbiBpcyBpbnN0YWxsZWQgYW5kIHRoZSBsYXRlc3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2V4dGVuc2lvbi9tYW5pZmVzdCcpLkV4dGVuc2lvblR5cGV9IEV4dGVuc2lvblR5cGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vZXh0ZW5zaW9uL21hbmlmZXN0JykuRXh0UmVjb3JkPEV4dFR5cGU+fSBFeHRSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vZXh0ZW5zaW9uL21hbmlmZXN0JykuRXh0RGF0YTxFeHRUeXBlPn0gRXh0RGF0YVxuICovXG5cbi8qKlxuICogUmV0dXJuIHZhbHVlIG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fS5cbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCAoaW1wb3J0KCcuLi9leHRlbnNpb24vbWFuaWZlc3QnKS5JbnRlcm5hbERhdGEgJiBFeHRlbnNpb25NZXRhZGF0YSkgfCB7IHBrZ05hbWU6IHN0cmluZywgaW5zdGFsbGVkOiBmYWxzZSB9Pn0gRXh0ZW5zaW9uTGlzdERhdGFcbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5ydW59LlxuICogQHR5cGVkZWYgUnVuT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dCAtIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0byBydW4gYSBzY3JpcHQgZnJvbVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNjcmlwdE5hbWUgLSBuYW1lIG9mIHRoZSBzY3JpcHQgdG8gcnVuXG4gKi9cblxuLyoqXG4gKiBSZXR1cm4gdmFsdWUgb2Yge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLnJ1bn1cbiAqXG4gKiBAdHlwZWRlZiBSdW5PdXRwdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXJyb3JdIC0gZXJyb3IgbWVzc2FnZSBpZiBzY3JpcHQgcmFuIHVuc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UgdW5kZWZpbmVkXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBvdXRwdXQgLSBzY3JpcHQgb3V0cHV0XG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQudXBkYXRlfS5cbiAqIEB0eXBlZGVmIEV4dGVuc2lvblVwZGF0ZU9wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHQgLSB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHRvIHVwZGF0ZVxuICogQHByb3BlcnR5IHtib29sZWFufSB1bnNhZmUgLSBpZiB0cnVlLCB3aWxsIHBlcmZvcm0gdW5zYWZlIHVwZGF0ZXMgcGFzdCBtYWpvciByZXZpc2lvbiBib3VuZGFyaWVzXG4gKi9cblxuLyoqXG4gKiBSZXR1cm4gdmFsdWUgb2Yge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLnVwZGF0ZX0uXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25VcGRhdGVSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxFcnJvcj59IGVycm9ycyAtIG1hcCBvZiBleHQgbmFtZXMgdG8gZXJyb3Igb2JqZWN0c1xuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLFVwZGF0ZVJlcG9ydD59IHVwZGF0ZXMgLSBtYXAgb2YgZXh0IG5hbWVzIHRvIHtAbGlua2NvZGUgVXBkYXRlUmVwb3J0fXNcbiAqL1xuXG4vKipcbiAqIFBhcnQgb2YgcmVzdWx0IG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC51cGRhdGV9LlxuICogQHR5cGVkZWYgVXBkYXRlUmVwb3J0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gZnJvbSAtIHZlcnNpb24gdGhlIGV4dGVuc2lvbiB3YXMgdXBkYXRlZCBmcm9tXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdG8gLSB2ZXJzaW9uIHRoZSBleHRlbnNpb24gd2FzIHVwZGF0ZWQgdG9cbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC51bmluc3RhbGx9LlxuICogQHR5cGVkZWYgVW5pbnN0YWxsT3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dCAtIHRoZSBuYW1lIG9yIHNwZWMgb2YgYW4gZXh0ZW5zaW9uIHRvIHVuaW5zdGFsbFxuICovXG5cbi8qKlxuICogVXNlZCBieSB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuZ2V0UG9zdEluc3RhbGxUZXh0fVxuICogQHR5cGVkZWYgRXh0ZW5zaW9uQXJnc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dE5hbWUgLSB0aGUgbmFtZSBvZiBhbiBleHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBleHREYXRhIC0gdGhlIGRhdGEgZm9yIGFuIGluc3RhbGxlZCBleHRlbnNpb25cbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5pbnN0YWxsVmlhTnBtfVxuICogQHR5cGVkZWYgSW5zdGFsbFZpYU5wbUFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHQgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byBpbnN0YWxsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGtnTmFtZSAtIHRoZSBOUE0gcGFja2FnZSBuYW1lIG9mIHRoZSBleHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGtnVmVyXSAtIHRoZSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBOUE0gcGFja2FnZVxuICovXG5cbi8qKlxuICogT2JqZWN0IHJldHVybmVkIGJ5IHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5jaGVja0ZvckV4dGVuc2lvblVwZGF0ZX1cbiAqIEB0eXBlZGVmIFBvc3NpYmxlVXBkYXRlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGN1cnJlbnQgLSBjdXJyZW50IHZlcnNpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gc2FmZVVwZGF0ZSAtIHZlcnNpb24gd2UgY2FuIHNhZmVseSB1cGRhdGUgdG8gaWYgaXQgZXhpc3RzLCBvciBudWxsXG4gKiBAcHJvcGVydHkge3N0cmluZz99IHVuc2FmZVVwZGF0ZSAtIHZlcnNpb24gd2UgY2FuIHVuc2FmZWx5IHVwZGF0ZSB0byBpZiBpdCBleGlzdHMsIG9yIG51bGxcbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5pbnN0YWxsfVxuICogQHR5cGVkZWYgSW5zdGFsbEFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHQgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byBpbnN0YWxsXG4gKiBAcHJvcGVydHkge2ltcG9ydCgnLi4vZXh0ZW5zaW9uL2V4dGVuc2lvbi1jb25maWcnKS5JbnN0YWxsVHlwZX0gaW5zdGFsbFR5cGUgLSBob3cgdG8gaW5zdGFsbCB0aGlzIGV4dGVuc2lvbi4gT25lIG9mIHRoZSBJTlNUQUxMX1RZUEVTXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BhY2thZ2VOYW1lXSAtIGZvciBnaXQvZ2l0aHViIGluc3RhbGxzLCB0aGUgZXh0ZW5zaW9uIG5vZGUgcGFja2FnZSBuYW1lXG4gKi9cbiJdfQ==
|
|
@@ -13,18 +13,15 @@ var _driverCommand = _interopRequireDefault(require("./driver-command"));
|
|
|
13
13
|
|
|
14
14
|
var _pluginCommand = _interopRequireDefault(require("./plugin-command"));
|
|
15
15
|
|
|
16
|
-
var
|
|
17
|
-
|
|
18
|
-
var _pluginConfig = _interopRequireDefault(require("../plugin-config"));
|
|
19
|
-
|
|
20
|
-
var _extensionConfig = require("../extension-config");
|
|
16
|
+
var _constants = require("../constants");
|
|
21
17
|
|
|
22
18
|
var _utils = require("./utils");
|
|
23
19
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
async function runExtensionCommand(args, type, configObject) {
|
|
20
|
+
async function runExtensionCommand(args, configObject) {
|
|
27
21
|
let jsonResult = null;
|
|
22
|
+
const {
|
|
23
|
+
extensionType: type
|
|
24
|
+
} = configObject;
|
|
28
25
|
const extCmd = args[`${type}Command`];
|
|
29
26
|
|
|
30
27
|
if (!extCmd) {
|
|
@@ -42,23 +39,15 @@ async function runExtensionCommand(args, type, configObject) {
|
|
|
42
39
|
|
|
43
40
|
const logFn = msg => (0, _utils.log)(json, msg);
|
|
44
41
|
|
|
45
|
-
let config;
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
config = configObject;
|
|
49
|
-
config.log = logFn;
|
|
50
|
-
} else {
|
|
51
|
-
config = (type === _extensionConfig.DRIVER_TYPE ? _driverConfig.default : _pluginConfig.default).getInstance(_args.APPIUM_HOME, logFn);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const CommandClass = type === _extensionConfig.DRIVER_TYPE ? _driverCommand.default : _pluginCommand.default;
|
|
42
|
+
let config = configObject;
|
|
43
|
+
config.log = logFn;
|
|
44
|
+
const CommandClass = type === _constants.DRIVER_TYPE ? _driverCommand.default : _pluginCommand.default;
|
|
55
45
|
const cmd = new CommandClass({
|
|
56
46
|
config,
|
|
57
47
|
json
|
|
58
48
|
});
|
|
59
49
|
|
|
60
50
|
try {
|
|
61
|
-
await config.read();
|
|
62
51
|
jsonResult = await cmd.execute(args);
|
|
63
52
|
} catch (err) {
|
|
64
53
|
if (suppressOutput) {
|
|
@@ -73,7 +62,5 @@ async function runExtensionCommand(args, type, configObject) {
|
|
|
73
62
|
}
|
|
74
63
|
|
|
75
64
|
return jsonResult;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jbGkvZXh0ZW5zaW9uLmpzIl0sIm5hbWVzIjpbInJ1bkV4dGVuc2lvbkNvbW1hbmQiLCJhcmdzIiwidHlwZSIsImNvbmZpZ09iamVjdCIsImpzb25SZXN1bHQiLCJleHRDbWQiLCJUeXBlRXJyb3IiLCJqc29uIiwic3VwcHJlc3NPdXRwdXQiLCJsb2dGbiIsIm1zZyIsImNvbmZpZyIsImxvZyIsIkRSSVZFUl9UWVBFIiwiRHJpdmVyQ29uZmlnIiwiUGx1Z2luQ29uZmlnIiwiZ2V0SW5zdGFuY2UiLCJBUFBJVU1fSE9NRSIsIkNvbW1hbmRDbGFzcyIsIkRyaXZlckNvbW1hbmQiLCJQbHVnaW5Db21tYW5kIiwiY21kIiwicmVhZCIsImV4ZWN1dGUiLCJlcnIiLCJjb25zb2xlIiwiSlNPTiIsInN0cmluZ2lmeSIsIkpTT05fU1BBQ0VTIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQVdBLGVBQWVBLG1CQUFmLENBQW9DQyxJQUFwQyxFQUEwQ0MsSUFBMUMsRUFBZ0RDLFlBQWhELEVBQThEO0FBRzVELE1BQUlDLFVBQVUsR0FBRyxJQUFqQjtBQUNBLFFBQU1DLE1BQU0sR0FBR0osSUFBSSxDQUFFLEdBQUVDLElBQUssU0FBVCxDQUFuQjs7QUFDQSxNQUFJLENBQUNHLE1BQUwsRUFBYTtBQUNYLFVBQU0sSUFBSUMsU0FBSixDQUFlLGVBQWNKLElBQUssOENBQWxDLENBQU47QUFDRDs7QUFDRCxNQUFJO0FBQUNLLElBQUFBLElBQUQ7QUFBT0MsSUFBQUE7QUFBUCxNQUF5QlAsSUFBN0I7O0FBQ0EsTUFBSU8sY0FBSixFQUFvQjtBQUNsQkQsSUFBQUEsSUFBSSxHQUFHLElBQVA7QUFDRDs7QUFDRCxRQUFNRSxLQUFLLEdBQUlDLEdBQUQsSUFBUyxnQkFBSUgsSUFBSixFQUFVRyxHQUFWLENBQXZCOztBQUNBLE1BQUlDLE1BQUo7O0FBQ0EsTUFBSVIsWUFBSixFQUFrQjtBQUNoQlEsSUFBQUEsTUFBTSxHQUFHUixZQUFUO0FBQ0FRLElBQUFBLE1BQU0sQ0FBQ0MsR0FBUCxHQUFhSCxLQUFiO0FBQ0QsR0FIRCxNQUdPO0FBQ0xFLElBQUFBLE1BQU0sR0FBRyxDQUFDVCxJQUFJLEtBQUtXLDRCQUFULEdBQXVCQyxxQkFBdkIsR0FBc0NDLHFCQUF2QyxFQUFxREMsV0FBckQsQ0FBaUVDLGlCQUFqRSxFQUE4RVIsS0FBOUUsQ0FBVDtBQUNEOztBQUNELFFBQU1TLFlBQVksR0FBR2hCLElBQUksS0FBS1csNEJBQVQsR0FBdUJNLHNCQUF2QixHQUF1Q0Msc0JBQTVEO0FBQ0EsUUFBTUMsR0FBRyxHQUFHLElBQUlILFlBQUosQ0FBaUI7QUFBQ1AsSUFBQUEsTUFBRDtBQUFTSixJQUFBQTtBQUFULEdBQWpCLENBQVo7O0FBQ0EsTUFBSTtBQUNGLFVBQU1JLE1BQU0sQ0FBQ1csSUFBUCxFQUFOO0FBQ0FsQixJQUFBQSxVQUFVLEdBQUcsTUFBTWlCLEdBQUcsQ0FBQ0UsT0FBSixDQUFZdEIsSUFBWixDQUFuQjtBQUNELEdBSEQsQ0FHRSxPQUFPdUIsR0FBUCxFQUFZO0FBR1osUUFBSWhCLGNBQUosRUFBb0I7QUFDbEIsWUFBTWdCLEdBQU47QUFDRDs7QUFDRCwyQkFBV2pCLElBQVgsRUFBaUJpQixHQUFqQjtBQUNEOztBQUVELE1BQUlqQixJQUFJLElBQUksQ0FBQ0MsY0FBYixFQUE2QjtBQUMzQmlCLElBQUFBLE9BQU8sQ0FBQ2IsR0FBUixDQUFZYyxJQUFJLENBQUNDLFNBQUwsQ0FBZXZCLFVBQWYsRUFBMkIsSUFBM0IsRUFBaUN3QixrQkFBakMsQ0FBWjtBQUNEOztBQUVELFNBQU94QixVQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5cbmltcG9ydCBEcml2ZXJDb21tYW5kIGZyb20gJy4vZHJpdmVyLWNvbW1hbmQnO1xuaW1wb3J0IFBsdWdpbkNvbW1hbmQgZnJvbSAnLi9wbHVnaW4tY29tbWFuZCc7XG5pbXBvcnQgRHJpdmVyQ29uZmlnIGZyb20gJy4uL2RyaXZlci1jb25maWcnO1xuaW1wb3J0IFBsdWdpbkNvbmZpZyBmcm9tICcuLi9wbHVnaW4tY29uZmlnJztcbmltcG9ydCB7IERSSVZFUl9UWVBFIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQgeyBlcnJBbmRRdWl0LCBsb2csIEpTT05fU1BBQ0VTIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBBUFBJVU1fSE9NRSB9IGZyb20gJy4vYXJncyc7XG5cbi8qKlxuICogUnVuIGEgc3ViY29tbWFuZCBvZiB0aGUgJ2FwcGl1bSBkcml2ZXInIHR5cGUuIEVhY2ggc3ViY29tbWFuZCBoYXMgaXRzIG93biBzZXQgb2YgYXJndW1lbnRzIHdoaWNoXG4gKiBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBKUyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MgLSBKUyBvYmplY3Qgd2hlcmUgdGhlIGtleSBpcyB0aGUgcGFyYW1ldGVyIG5hbWUgKGFzIGRlZmluZWQgaW5cbiAqIGRyaXZlci1wYXJzZXIuanMpXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vZXh0LWNvbmZpZy1pbycpLkV4dGVuc2lvblR5cGV9IHR5cGUgLSBFeHRlbnNpb24gdHlwZVxuICogQG9hcmFtIHtFeHRlbnNpb25Db25maWd9IFtjb25maWdPYmplY3RdIC0gRXh0ZW5zaW9uIGNvbmZpZyBvYmplY3QsIGlmIHdlIGhhdmUgb25lXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bkV4dGVuc2lvbkNvbW1hbmQgKGFyZ3MsIHR5cGUsIGNvbmZpZ09iamVjdCkge1xuICAvLyBUT0RPIGRyaXZlciBjb25maWcgZmlsZSBzaG91bGQgYmUgbG9ja2VkIHdoaWxlIGFueSBvZiB0aGVzZSBjb21tYW5kcyBhcmVcbiAgLy8gcnVubmluZyB0byBwcmV2ZW50IHdlaXJkIHNpdHVhdGlvbnNcbiAgbGV0IGpzb25SZXN1bHQgPSBudWxsO1xuICBjb25zdCBleHRDbWQgPSBhcmdzW2Ake3R5cGV9Q29tbWFuZGBdO1xuICBpZiAoIWV4dENtZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCBjYWxsICR7dHlwZX0gY29tbWFuZCB3aXRob3V0IGEgc3ViY29tbWFuZCBsaWtlICdpbnN0YWxsJ2ApO1xuICB9XG4gIGxldCB7anNvbiwgc3VwcHJlc3NPdXRwdXR9ID0gYXJncztcbiAgaWYgKHN1cHByZXNzT3V0cHV0KSB7XG4gICAganNvbiA9IHRydWU7XG4gIH1cbiAgY29uc3QgbG9nRm4gPSAobXNnKSA9PiBsb2coanNvbiwgbXNnKTtcbiAgbGV0IGNvbmZpZztcbiAgaWYgKGNvbmZpZ09iamVjdCkge1xuICAgIGNvbmZpZyA9IGNvbmZpZ09iamVjdDtcbiAgICBjb25maWcubG9nID0gbG9nRm47XG4gIH0gZWxzZSB7XG4gICAgY29uZmlnID0gKHR5cGUgPT09IERSSVZFUl9UWVBFID8gRHJpdmVyQ29uZmlnIDogUGx1Z2luQ29uZmlnKS5nZXRJbnN0YW5jZShBUFBJVU1fSE9NRSwgbG9nRm4pO1xuICB9XG4gIGNvbnN0IENvbW1hbmRDbGFzcyA9IHR5cGUgPT09IERSSVZFUl9UWVBFID8gRHJpdmVyQ29tbWFuZCA6IFBsdWdpbkNvbW1hbmQ7XG4gIGNvbnN0IGNtZCA9IG5ldyBDb21tYW5kQ2xhc3Moe2NvbmZpZywganNvbn0pO1xuICB0cnkge1xuICAgIGF3YWl0IGNvbmZpZy5yZWFkKCk7XG4gICAganNvblJlc3VsdCA9IGF3YWl0IGNtZC5leGVjdXRlKGFyZ3MpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpbiB0aGUgc3VwcHJlc3Mgb3V0cHV0IGNhc2UsIHdlIGFyZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaW50ZXJuYWxseSBhbmQgc2hvdWxkXG4gICAgLy8ganVzdCB0aHJvdyBpbnN0ZWFkIG9mIHByaW50aW5nIGFuIGVycm9yIGFuZCBlbmRpbmcgdGhlIHByb2Nlc3NcbiAgICBpZiAoc3VwcHJlc3NPdXRwdXQpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgZXJyQW5kUXVpdChqc29uLCBlcnIpO1xuICB9XG5cbiAgaWYgKGpzb24gJiYgIXN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoanNvblJlc3VsdCwgbnVsbCwgSlNPTl9TUEFDRVMpKTtcbiAgfVxuXG4gIHJldHVybiBqc29uUmVzdWx0O1xufVxuXG5leHBvcnQge1xuICBydW5FeHRlbnNpb25Db21tYW5kLFxufTtcbiJdLCJmaWxlIjoibGliL2NsaS9leHRlbnNpb24uanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jbGkvZXh0ZW5zaW9uLmpzIl0sIm5hbWVzIjpbInJ1bkV4dGVuc2lvbkNvbW1hbmQiLCJhcmdzIiwiY29uZmlnT2JqZWN0IiwianNvblJlc3VsdCIsImV4dGVuc2lvblR5cGUiLCJ0eXBlIiwiZXh0Q21kIiwiVHlwZUVycm9yIiwianNvbiIsInN1cHByZXNzT3V0cHV0IiwibG9nRm4iLCJtc2ciLCJjb25maWciLCJsb2ciLCJDb21tYW5kQ2xhc3MiLCJEUklWRVJfVFlQRSIsIkRyaXZlckNvbW1hbmQiLCJQbHVnaW5Db21tYW5kIiwiY21kIiwiZXhlY3V0ZSIsImVyciIsImNvbnNvbGUiLCJKU09OIiwic3RyaW5naWZ5IiwiSlNPTl9TUEFDRVMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBV0EsZUFBZUEsbUJBQWYsQ0FBb0NDLElBQXBDLEVBQTBDQyxZQUExQyxFQUF3RDtBQUd0RCxNQUFJQyxVQUFVLEdBQUcsSUFBakI7QUFDQSxRQUFNO0FBQUNDLElBQUFBLGFBQWEsRUFBRUM7QUFBaEIsTUFBd0JILFlBQTlCO0FBQ0EsUUFBTUksTUFBTSxHQUFHTCxJQUFJLENBQUUsR0FBRUksSUFBSyxTQUFULENBQW5COztBQUNBLE1BQUksQ0FBQ0MsTUFBTCxFQUFhO0FBQ1gsVUFBTSxJQUFJQyxTQUFKLENBQWUsZUFBY0YsSUFBSyw4Q0FBbEMsQ0FBTjtBQUNEOztBQUNELE1BQUk7QUFBQ0csSUFBQUEsSUFBRDtBQUFPQyxJQUFBQTtBQUFQLE1BQXlCUixJQUE3Qjs7QUFDQSxNQUFJUSxjQUFKLEVBQW9CO0FBQ2xCRCxJQUFBQSxJQUFJLEdBQUcsSUFBUDtBQUNEOztBQUNELFFBQU1FLEtBQUssR0FBSUMsR0FBRCxJQUFTLGdCQUFJSCxJQUFKLEVBQVVHLEdBQVYsQ0FBdkI7O0FBQ0EsTUFBSUMsTUFBTSxHQUFHVixZQUFiO0FBQ0FVLEVBQUFBLE1BQU0sQ0FBQ0MsR0FBUCxHQUFhSCxLQUFiO0FBQ0EsUUFBTUksWUFBWSxHQUFHVCxJQUFJLEtBQUtVLHNCQUFULEdBQXVCQyxzQkFBdkIsR0FBdUNDLHNCQUE1RDtBQUNBLFFBQU1DLEdBQUcsR0FBRyxJQUFJSixZQUFKLENBQWlCO0FBQUNGLElBQUFBLE1BQUQ7QUFBU0osSUFBQUE7QUFBVCxHQUFqQixDQUFaOztBQUNBLE1BQUk7QUFDRkwsSUFBQUEsVUFBVSxHQUFHLE1BQU1lLEdBQUcsQ0FBQ0MsT0FBSixDQUFZbEIsSUFBWixDQUFuQjtBQUNELEdBRkQsQ0FFRSxPQUFPbUIsR0FBUCxFQUFZO0FBR1osUUFBSVgsY0FBSixFQUFvQjtBQUNsQixZQUFNVyxHQUFOO0FBQ0Q7O0FBQ0QsMkJBQVdaLElBQVgsRUFBaUJZLEdBQWpCO0FBQ0Q7O0FBRUQsTUFBSVosSUFBSSxJQUFJLENBQUNDLGNBQWIsRUFBNkI7QUFDM0JZLElBQUFBLE9BQU8sQ0FBQ1IsR0FBUixDQUFZUyxJQUFJLENBQUNDLFNBQUwsQ0FBZXBCLFVBQWYsRUFBMkIsSUFBM0IsRUFBaUNxQixrQkFBakMsQ0FBWjtBQUNEOztBQUVELFNBQU9yQixVQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5cbmltcG9ydCBEcml2ZXJDb21tYW5kIGZyb20gJy4vZHJpdmVyLWNvbW1hbmQnO1xuaW1wb3J0IFBsdWdpbkNvbW1hbmQgZnJvbSAnLi9wbHVnaW4tY29tbWFuZCc7XG5pbXBvcnQgeyBEUklWRVJfVFlQRSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBlcnJBbmRRdWl0LCBsb2csIEpTT05fU1BBQ0VTIH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogUnVuIGEgc3ViY29tbWFuZCBvZiB0aGUgJ2FwcGl1bSBkcml2ZXInIHR5cGUuIEVhY2ggc3ViY29tbWFuZCBoYXMgaXRzIG93biBzZXQgb2YgYXJndW1lbnRzIHdoaWNoXG4gKiBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBKUyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MgLSBKUyBvYmplY3Qgd2hlcmUgdGhlIGtleSBpcyB0aGUgcGFyYW1ldGVyIG5hbWUgKGFzIGRlZmluZWQgaW5cbiAqIGRyaXZlci1wYXJzZXIuanMpXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZycpLkV4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn0gY29uZmlnT2JqZWN0IC0gRXh0ZW5zaW9uIGNvbmZpZyBvYmplY3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuRXh0ZW5zaW9uQ29tbWFuZCAoYXJncywgY29uZmlnT2JqZWN0KSB7XG4gIC8vIFRPRE8gZHJpdmVyIGNvbmZpZyBmaWxlIHNob3VsZCBiZSBsb2NrZWQgd2hpbGUgYW55IG9mIHRoZXNlIGNvbW1hbmRzIGFyZVxuICAvLyBydW5uaW5nIHRvIHByZXZlbnQgd2VpcmQgc2l0dWF0aW9uc1xuICBsZXQganNvblJlc3VsdCA9IG51bGw7XG4gIGNvbnN0IHtleHRlbnNpb25UeXBlOiB0eXBlfSA9IGNvbmZpZ09iamVjdDtcbiAgY29uc3QgZXh0Q21kID0gYXJnc1tgJHt0eXBlfUNvbW1hbmRgXTtcbiAgaWYgKCFleHRDbWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW5ub3QgY2FsbCAke3R5cGV9IGNvbW1hbmQgd2l0aG91dCBhIHN1YmNvbW1hbmQgbGlrZSAnaW5zdGFsbCdgKTtcbiAgfVxuICBsZXQge2pzb24sIHN1cHByZXNzT3V0cHV0fSA9IGFyZ3M7XG4gIGlmIChzdXBwcmVzc091dHB1dCkge1xuICAgIGpzb24gPSB0cnVlO1xuICB9XG4gIGNvbnN0IGxvZ0ZuID0gKG1zZykgPT4gbG9nKGpzb24sIG1zZyk7XG4gIGxldCBjb25maWcgPSBjb25maWdPYmplY3Q7XG4gIGNvbmZpZy5sb2cgPSBsb2dGbjtcbiAgY29uc3QgQ29tbWFuZENsYXNzID0gdHlwZSA9PT0gRFJJVkVSX1RZUEUgPyBEcml2ZXJDb21tYW5kIDogUGx1Z2luQ29tbWFuZDtcbiAgY29uc3QgY21kID0gbmV3IENvbW1hbmRDbGFzcyh7Y29uZmlnLCBqc29ufSk7XG4gIHRyeSB7XG4gICAganNvblJlc3VsdCA9IGF3YWl0IGNtZC5leGVjdXRlKGFyZ3MpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpbiB0aGUgc3VwcHJlc3Mgb3V0cHV0IGNhc2UsIHdlIGFyZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaW50ZXJuYWxseSBhbmQgc2hvdWxkXG4gICAgLy8ganVzdCB0aHJvdyBpbnN0ZWFkIG9mIHByaW50aW5nIGFuIGVycm9yIGFuZCBlbmRpbmcgdGhlIHByb2Nlc3NcbiAgICBpZiAoc3VwcHJlc3NPdXRwdXQpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgZXJyQW5kUXVpdChqc29uLCBlcnIpO1xuICB9XG5cbiAgaWYgKGpzb24gJiYgIXN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoanNvblJlc3VsdCwgbnVsbCwgSlNPTl9TUEFDRVMpKTtcbiAgfVxuXG4gIHJldHVybiBqc29uUmVzdWx0O1xufVxuXG5leHBvcnQge1xuICBydW5FeHRlbnNpb25Db21tYW5kLFxufTtcbiJdfQ==
|