appium 2.0.0-beta.33 → 2.0.0-beta.37
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.d.ts +41 -52
- package/build/lib/appium.d.ts.map +1 -1
- package/build/lib/appium.js +32 -15
- package/build/lib/cli/args.d.ts +1 -1
- package/build/lib/cli/args.d.ts.map +1 -1
- package/build/lib/cli/args.js +1 -1
- package/build/lib/cli/driver-command.d.ts +5 -5
- package/build/lib/cli/driver-command.d.ts.map +1 -1
- package/build/lib/cli/driver-command.js +8 -8
- package/build/lib/cli/extension-command.d.ts +78 -51
- package/build/lib/cli/extension-command.d.ts.map +1 -1
- package/build/lib/cli/extension-command.js +135 -80
- package/build/lib/cli/extension.d.ts +9 -5
- package/build/lib/cli/extension.d.ts.map +1 -1
- package/build/lib/cli/extension.js +5 -7
- package/build/lib/cli/parser.d.ts +3 -3
- package/build/lib/cli/parser.d.ts.map +1 -1
- package/build/lib/cli/parser.js +1 -1
- package/build/lib/cli/plugin-command.d.ts +9 -15
- package/build/lib/cli/plugin-command.d.ts.map +1 -1
- package/build/lib/cli/plugin-command.js +8 -8
- package/build/lib/cli/utils.js +1 -1
- package/build/lib/config-file.d.ts.map +1 -1
- package/build/lib/config-file.js +1 -1
- package/build/lib/config.d.ts +4 -4
- package/build/lib/config.d.ts.map +1 -1
- package/build/lib/config.js +1 -1
- package/build/lib/constants.d.ts.map +1 -1
- package/build/lib/constants.js +1 -1
- package/build/lib/extension/driver-config.d.ts +29 -32
- package/build/lib/extension/driver-config.d.ts.map +1 -1
- package/build/lib/extension/driver-config.js +7 -20
- package/build/lib/extension/extension-config.d.ts +108 -36
- package/build/lib/extension/extension-config.d.ts.map +1 -1
- package/build/lib/extension/extension-config.js +199 -60
- package/build/lib/extension/index.d.ts +16 -7
- package/build/lib/extension/index.d.ts.map +1 -1
- package/build/lib/extension/index.js +15 -18
- package/build/lib/extension/manifest.d.ts +12 -12
- package/build/lib/extension/manifest.d.ts.map +1 -1
- package/build/lib/extension/manifest.js +13 -3
- package/build/lib/extension/package-changed.d.ts.map +1 -1
- package/build/lib/extension/package-changed.js +1 -1
- package/build/lib/extension/plugin-config.d.ts +19 -24
- package/build/lib/extension/plugin-config.d.ts.map +1 -1
- package/build/lib/extension/plugin-config.js +9 -18
- package/build/lib/grid-register.d.ts.map +1 -1
- package/build/lib/grid-register.js +1 -1
- package/build/lib/logger.d.ts +1 -1
- package/build/lib/logger.d.ts.map +1 -1
- package/build/lib/logger.js +1 -1
- package/build/lib/logsink.d.ts.map +1 -1
- package/build/lib/logsink.js +3 -2
- package/build/lib/main.d.ts +13 -12
- package/build/lib/main.d.ts.map +1 -1
- package/build/lib/main.js +4 -4
- package/build/lib/schema/arg-spec.d.ts +4 -4
- package/build/lib/schema/arg-spec.d.ts.map +1 -1
- package/build/lib/schema/arg-spec.js +1 -1
- package/build/lib/schema/cli-args.d.ts.map +1 -1
- package/build/lib/schema/cli-args.js +1 -1
- package/build/lib/schema/cli-transformers.d.ts.map +1 -1
- package/build/lib/schema/cli-transformers.js +1 -1
- package/build/lib/schema/index.js +1 -1
- package/build/lib/schema/keywords.d.ts.map +1 -1
- package/build/lib/schema/keywords.js +1 -1
- package/build/lib/schema/schema.d.ts +2 -2
- package/build/lib/schema/schema.d.ts.map +1 -1
- package/build/lib/schema/schema.js +1 -1
- package/build/lib/utils.d.ts.map +1 -1
- package/build/lib/utils.js +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/appium-manifest.d.ts +23 -4
- package/build/types/appium-manifest.d.ts.map +1 -1
- package/build/types/cli.d.ts.map +1 -1
- package/build/types/{external-manifest.d.ts → extension-manifest.d.ts} +15 -7
- package/build/types/extension-manifest.d.ts.map +1 -0
- package/build/types/index.d.ts +6 -5
- package/build/types/index.d.ts.map +1 -1
- package/driver.d.ts +1 -0
- package/driver.js +14 -0
- package/lib/appium.js +208 -124
- package/lib/cli/args.js +143 -93
- package/lib/cli/driver-command.js +46 -26
- package/lib/cli/extension-command.js +314 -157
- package/lib/cli/extension.js +15 -19
- package/lib/cli/parser.js +19 -31
- package/lib/cli/plugin-command.js +39 -24
- package/lib/cli/utils.js +8 -14
- package/lib/config-file.js +21 -25
- package/lib/config.js +82 -64
- package/lib/constants.js +4 -13
- package/lib/extension/driver-config.js +171 -171
- package/lib/extension/extension-config.js +347 -126
- package/lib/extension/index.js +72 -58
- package/lib/extension/manifest.js +48 -57
- package/lib/extension/package-changed.js +9 -8
- package/lib/extension/plugin-config.js +62 -62
- package/lib/grid-register.js +29 -18
- package/lib/logger.js +1 -2
- package/lib/logsink.js +29 -31
- package/lib/main.js +111 -73
- package/lib/schema/arg-spec.js +10 -13
- package/lib/schema/cli-args.js +14 -37
- package/lib/schema/cli-transformers.js +7 -14
- package/lib/schema/keywords.js +15 -13
- package/lib/schema/schema.js +58 -75
- package/lib/utils.js +50 -25
- package/package.json +27 -20
- package/plugin.d.ts +1 -0
- package/plugin.js +13 -0
- package/scripts/autoinstall-extensions.js +177 -0
- package/support.d.ts +1 -0
- package/support.js +13 -0
- package/types/appium-manifest.ts +27 -15
- package/types/cli.ts +2 -9
- package/types/{external-manifest.ts → extension-manifest.ts} +21 -15
- package/types/index.ts +12 -5
- package/build/types/extension.d.ts +0 -43
- package/build/types/extension.d.ts.map +0 -1
- package/build/types/external-manifest.d.ts.map +0 -1
- package/lib/appium-config.schema.json +0 -278
- package/scripts/postinstall.js +0 -71
- package/types/extension.ts +0 -56
|
@@ -9,6 +9,8 @@ exports.default = exports.ExtensionCommand = void 0;
|
|
|
9
9
|
|
|
10
10
|
require("source-map-support/register");
|
|
11
11
|
|
|
12
|
+
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
13
|
+
|
|
12
14
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
15
|
|
|
14
16
|
var _path = _interopRequireDefault(require("path"));
|
|
@@ -39,18 +41,25 @@ class ExtensionCommand {
|
|
|
39
41
|
json
|
|
40
42
|
}) {
|
|
41
43
|
this.config = config;
|
|
42
|
-
this.
|
|
44
|
+
this.log = new _support.console.CliConsole({
|
|
45
|
+
jsonMode: json
|
|
46
|
+
});
|
|
47
|
+
this.isJsonOutput = Boolean(json);
|
|
43
48
|
}
|
|
44
49
|
|
|
45
50
|
get type() {
|
|
46
51
|
return this.config.extensionType;
|
|
47
52
|
}
|
|
48
53
|
|
|
54
|
+
_createFatalError(message) {
|
|
55
|
+
return new Error(this.log.decorate(message, 'error'));
|
|
56
|
+
}
|
|
57
|
+
|
|
49
58
|
async execute(args) {
|
|
50
59
|
const cmd = args[`${this.type}Command`];
|
|
51
60
|
|
|
52
61
|
if (!_lodash.default.isFunction(this[cmd])) {
|
|
53
|
-
throw
|
|
62
|
+
throw this._createFatalError(`Cannot handle ${this.type} command ${cmd}`);
|
|
54
63
|
}
|
|
55
64
|
|
|
56
65
|
const executeCmd = this[cmd].bind(this);
|
|
@@ -150,43 +159,47 @@ class ExtensionCommand {
|
|
|
150
159
|
}
|
|
151
160
|
}
|
|
152
161
|
|
|
153
|
-
|
|
162
|
+
this.log.log(`- ${name.yellow}${installTxt}${updateTxt}${upToDateTxt}${unsafeUpdateTxt}`);
|
|
154
163
|
}
|
|
155
164
|
|
|
156
165
|
return listData;
|
|
157
166
|
}
|
|
158
167
|
|
|
159
168
|
async _install({
|
|
160
|
-
|
|
169
|
+
installSpec,
|
|
161
170
|
installType,
|
|
162
171
|
packageName
|
|
163
172
|
}) {
|
|
164
173
|
let extData;
|
|
165
|
-
let installSpec = ext;
|
|
166
174
|
|
|
167
175
|
if (packageName && [_extensionConfig.INSTALL_TYPE_LOCAL, _extensionConfig.INSTALL_TYPE_NPM].includes(installType)) {
|
|
168
|
-
throw
|
|
176
|
+
throw this._createFatalError(`When using --source=${installType}, cannot also use --package`);
|
|
169
177
|
}
|
|
170
178
|
|
|
171
179
|
if (!packageName && [_extensionConfig.INSTALL_TYPE_GIT, _extensionConfig.INSTALL_TYPE_GITHUB].includes(installType)) {
|
|
172
|
-
throw
|
|
180
|
+
throw this._createFatalError(`When using --source=${installType}, must also use --package`);
|
|
173
181
|
}
|
|
174
182
|
|
|
183
|
+
let installOpts;
|
|
184
|
+
let probableExtName = '';
|
|
185
|
+
|
|
175
186
|
if (installType === _extensionConfig.INSTALL_TYPE_GITHUB) {
|
|
176
187
|
if (installSpec.split('/').length !== 2) {
|
|
177
|
-
throw
|
|
188
|
+
throw this._createFatalError(`Github ${this.type} spec ${installSpec} appeared to be invalid; ` + 'it should be of the form <org>/<repo>');
|
|
178
189
|
}
|
|
179
190
|
|
|
180
|
-
|
|
181
|
-
|
|
191
|
+
installOpts = {
|
|
192
|
+
installSpec,
|
|
182
193
|
pkgName: packageName
|
|
183
|
-
}
|
|
194
|
+
};
|
|
195
|
+
probableExtName = installSpec;
|
|
184
196
|
} else if (installType === _extensionConfig.INSTALL_TYPE_GIT) {
|
|
185
197
|
installSpec = installSpec.replace(/\.git$/, '');
|
|
186
|
-
|
|
187
|
-
|
|
198
|
+
installOpts = {
|
|
199
|
+
installSpec,
|
|
188
200
|
pkgName: packageName
|
|
189
|
-
}
|
|
201
|
+
};
|
|
202
|
+
probableExtName = installSpec;
|
|
190
203
|
} else {
|
|
191
204
|
let pkgName, pkgVer;
|
|
192
205
|
|
|
@@ -209,39 +222,61 @@ class ExtensionCommand {
|
|
|
209
222
|
|
|
210
223
|
if (!_lodash.default.includes(knownNames, name)) {
|
|
211
224
|
const msg = `Could not resolve ${this.type}; are you sure it's in the list ` + `of supported ${this.type}s? ${JSON.stringify(knownNames)}`;
|
|
212
|
-
throw
|
|
225
|
+
throw this._createFatalError(msg);
|
|
213
226
|
}
|
|
214
227
|
|
|
228
|
+
probableExtName = name;
|
|
215
229
|
pkgName = this.knownExtensions[name];
|
|
216
230
|
installType = _extensionConfig.INSTALL_TYPE_NPM;
|
|
217
231
|
}
|
|
218
232
|
}
|
|
219
233
|
|
|
220
|
-
|
|
221
|
-
|
|
234
|
+
installOpts = {
|
|
235
|
+
installSpec,
|
|
222
236
|
pkgName,
|
|
223
237
|
pkgVer
|
|
224
|
-
}
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
if (probableExtName && this.config.isInstalled(probableExtName)) {
|
|
242
|
+
throw this._createFatalError(`A ${this.type} named "${probableExtName}" is already installed. ` + `Did you mean to update? Run "appium ${this.type} update". See ` + `installed ${this.type}s with "appium ${this.type} list --installed".`);
|
|
225
243
|
}
|
|
226
244
|
|
|
245
|
+
extData = await this.installViaNpm(installOpts);
|
|
227
246
|
const extName = extData[`${this.type}Name`];
|
|
228
|
-
delete extData[`${this.type}Name`];
|
|
229
247
|
|
|
230
248
|
if (this.config.isInstalled(extName)) {
|
|
231
|
-
throw
|
|
249
|
+
throw this._createFatalError(`A ${this.type} named "${extName}" is already installed. ` + `Did you mean to update? Run "appium ${this.type} update". See ` + `installed ${this.type}s with "appium ${this.type} list --installed".`);
|
|
232
250
|
}
|
|
233
251
|
|
|
252
|
+
delete extData[`${this.type}Name`];
|
|
234
253
|
const extManifest = { ...extData,
|
|
235
254
|
installType,
|
|
236
255
|
installSpec
|
|
237
256
|
};
|
|
257
|
+
const [errors, warnings] = await _bluebird.default.all([this.config.getProblems(extName, extManifest), this.config.getWarnings(extName, extManifest)]);
|
|
258
|
+
const errorMap = new Map([[extName, errors]]);
|
|
259
|
+
const warningMap = new Map([[extName, warnings]]);
|
|
260
|
+
const {
|
|
261
|
+
errorSummaries,
|
|
262
|
+
warningSummaries
|
|
263
|
+
} = this.config.getValidationResultSummaries(errorMap, warningMap);
|
|
264
|
+
|
|
265
|
+
if (!_lodash.default.isEmpty(errorSummaries)) {
|
|
266
|
+
throw this._createFatalError(errorSummaries.join('\n'));
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
if (!_lodash.default.isEmpty(warningSummaries)) {
|
|
270
|
+
this.log.warn(warningSummaries.join('\n'));
|
|
271
|
+
}
|
|
272
|
+
|
|
238
273
|
await this.config.addExtension(extName, extManifest);
|
|
239
274
|
|
|
240
275
|
if (await _support.env.hasAppiumDependency(this.config.appiumHome)) {
|
|
241
276
|
await (0, _packageChanged.packageDidChange)(this.config.appiumHome);
|
|
242
277
|
}
|
|
243
278
|
|
|
244
|
-
|
|
279
|
+
this.log.info(this.getPostInstallText({
|
|
245
280
|
extName,
|
|
246
281
|
extData
|
|
247
282
|
}));
|
|
@@ -249,80 +284,101 @@ class ExtensionCommand {
|
|
|
249
284
|
}
|
|
250
285
|
|
|
251
286
|
async installViaNpm({
|
|
252
|
-
|
|
287
|
+
installSpec,
|
|
253
288
|
pkgName,
|
|
254
289
|
pkgVer
|
|
255
290
|
}) {
|
|
256
291
|
const npmSpec = `${pkgName}${pkgVer ? '@' + pkgVer : ''}`;
|
|
257
|
-
const specMsg = npmSpec ===
|
|
258
|
-
const msg = `Installing '${
|
|
292
|
+
const specMsg = npmSpec === installSpec ? '' : ` using NPM install spec '${npmSpec}'`;
|
|
293
|
+
const msg = `Installing '${installSpec}'${specMsg}`;
|
|
259
294
|
|
|
260
295
|
try {
|
|
261
|
-
const pkgJsonData = await (0, _utils.spinWith)(this.isJsonOutput, msg, async () =>
|
|
262
|
-
|
|
263
|
-
|
|
296
|
+
const pkgJsonData = await (0, _utils.spinWith)(this.isJsonOutput, msg, async () => {
|
|
297
|
+
const pkgJsonData = await _support.npm.installPackage(this.config.appiumHome, pkgName, {
|
|
298
|
+
pkgVer
|
|
299
|
+
});
|
|
300
|
+
this.validatePackageJson(pkgJsonData, installSpec);
|
|
301
|
+
return pkgJsonData;
|
|
302
|
+
});
|
|
264
303
|
return this.getExtensionFields(pkgJsonData);
|
|
265
304
|
} catch (err) {
|
|
266
|
-
throw
|
|
305
|
+
throw this._createFatalError(`Encountered an error when installing package: ${err.message}`);
|
|
267
306
|
}
|
|
268
307
|
}
|
|
269
308
|
|
|
270
309
|
getPostInstallText(args) {
|
|
271
|
-
throw
|
|
310
|
+
throw this._createFatalError('Must be implemented in final class');
|
|
272
311
|
}
|
|
273
312
|
|
|
274
|
-
getExtensionFields(
|
|
275
|
-
if (!pkgJsonData.appium) {
|
|
276
|
-
throw new Error(`Installed driver did not have an 'appium' section in its ` + `package.json file as expected`);
|
|
277
|
-
}
|
|
278
|
-
|
|
313
|
+
getExtensionFields(pkgJson) {
|
|
279
314
|
const {
|
|
280
315
|
appium,
|
|
281
316
|
name,
|
|
282
|
-
version
|
|
283
|
-
|
|
284
|
-
|
|
317
|
+
version,
|
|
318
|
+
peerDependencies
|
|
319
|
+
} = pkgJson;
|
|
285
320
|
const result = { ...appium,
|
|
286
321
|
pkgName: name,
|
|
287
|
-
version
|
|
322
|
+
version,
|
|
323
|
+
appiumVersion: peerDependencies === null || peerDependencies === void 0 ? void 0 : peerDependencies.appium
|
|
288
324
|
};
|
|
289
325
|
return result;
|
|
290
326
|
}
|
|
291
327
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
328
|
+
validatePackageJson(pkgJson, installSpec) {
|
|
329
|
+
const {
|
|
330
|
+
appium,
|
|
331
|
+
name,
|
|
332
|
+
version
|
|
333
|
+
} = pkgJson;
|
|
295
334
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
throw new Error(`Can't uninstall ${this.type} '${ext}'; it is not installed`);
|
|
335
|
+
const createMissingFieldError = field => new ReferenceError(`${this.type} "${installSpec}" invalid; missing a \`${field}\` field of its \`package.json\``);
|
|
336
|
+
|
|
337
|
+
if (!name) {
|
|
338
|
+
throw createMissingFieldError('name');
|
|
301
339
|
}
|
|
302
340
|
|
|
303
|
-
|
|
341
|
+
if (!version) {
|
|
342
|
+
throw createMissingFieldError('version');
|
|
343
|
+
}
|
|
304
344
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
}
|
|
308
|
-
|
|
345
|
+
if (!appium) {
|
|
346
|
+
throw createMissingFieldError('appium');
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
this.validateExtensionFields(appium, installSpec);
|
|
350
|
+
return true;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
validateExtensionFields(extMetadata, installSpec) {
|
|
354
|
+
throw this._createFatalError('Must be implemented in final class');
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
async _uninstall({
|
|
358
|
+
installSpec
|
|
359
|
+
}) {
|
|
360
|
+
if (!this.config.isInstalled(installSpec)) {
|
|
361
|
+
throw this._createFatalError(`Can't uninstall ${this.type} '${installSpec}'; it is not installed`);
|
|
309
362
|
}
|
|
310
363
|
|
|
311
|
-
|
|
364
|
+
const pkgName = this.config.installedExtensions[installSpec].pkgName;
|
|
365
|
+
await _support.npm.uninstallPackage(this.config.appiumHome, pkgName);
|
|
366
|
+
await this.config.removeExtension(installSpec);
|
|
367
|
+
this.log.ok(`Successfully uninstalled ${this.type} '${installSpec}'`.green);
|
|
312
368
|
return this.config.installedExtensions;
|
|
313
369
|
}
|
|
314
370
|
|
|
315
371
|
async _update({
|
|
316
|
-
|
|
372
|
+
installSpec,
|
|
317
373
|
unsafe
|
|
318
374
|
}) {
|
|
319
|
-
const shouldUpdateAll =
|
|
375
|
+
const shouldUpdateAll = installSpec === UPDATE_ALL;
|
|
320
376
|
|
|
321
|
-
if (!shouldUpdateAll && !this.config.isInstalled(
|
|
322
|
-
throw
|
|
377
|
+
if (!shouldUpdateAll && !this.config.isInstalled(installSpec)) {
|
|
378
|
+
throw this._createFatalError(`The ${this.type} "${installSpec}" was not installed, so can't be updated`);
|
|
323
379
|
}
|
|
324
380
|
|
|
325
|
-
const extsToUpdate = shouldUpdateAll ? Object.keys(this.config.installedExtensions) : [
|
|
381
|
+
const extsToUpdate = shouldUpdateAll ? Object.keys(this.config.installedExtensions) : [installSpec];
|
|
326
382
|
const errors = {};
|
|
327
383
|
const updates = {};
|
|
328
384
|
|
|
@@ -344,7 +400,7 @@ class ExtensionCommand {
|
|
|
344
400
|
});
|
|
345
401
|
|
|
346
402
|
if (!unsafe && !update.safeUpdate) {
|
|
347
|
-
throw
|
|
403
|
+
throw this._createFatalError(`The ${this.type} '${e}' has a major revision update ` + `(${update.current} => ${update.unsafeUpdate}), which could include ` + `breaking changes. If you want to apply this update, re-run with --unsafe`);
|
|
348
404
|
}
|
|
349
405
|
|
|
350
406
|
const updateVer = unsafe && update.unsafeUpdate ? update.unsafeUpdate : update.safeUpdate;
|
|
@@ -358,19 +414,19 @@ class ExtensionCommand {
|
|
|
358
414
|
}
|
|
359
415
|
}
|
|
360
416
|
|
|
361
|
-
|
|
417
|
+
this.log.info('Update report:');
|
|
362
418
|
|
|
363
419
|
for (const [e, update] of _lodash.default.toPairs(updates)) {
|
|
364
|
-
|
|
420
|
+
this.log.ok(` - ${this.type} ${e} updated: ${update.from} => ${update.to}`.green);
|
|
365
421
|
}
|
|
366
422
|
|
|
367
423
|
for (const [e, err] of _lodash.default.toPairs(errors)) {
|
|
368
424
|
if (err instanceof NotUpdatableError) {
|
|
369
|
-
|
|
425
|
+
this.log.warn(` - '${e}' was not installed via npm, so we could not check ` + `for updates`.yellow);
|
|
370
426
|
} else if (err instanceof NoUpdatesAvailableError) {
|
|
371
|
-
|
|
427
|
+
this.log.info(` - '${e}' had no updates available`.yellow);
|
|
372
428
|
} else {
|
|
373
|
-
|
|
429
|
+
this.log.error(` - '${e}' failed to update: ${err}`.red);
|
|
374
430
|
}
|
|
375
431
|
}
|
|
376
432
|
|
|
@@ -408,62 +464,61 @@ class ExtensionCommand {
|
|
|
408
464
|
};
|
|
409
465
|
}
|
|
410
466
|
|
|
411
|
-
async updateExtension(
|
|
467
|
+
async updateExtension(installSpec, version) {
|
|
412
468
|
const {
|
|
413
469
|
pkgName
|
|
414
|
-
} = this.config.installedExtensions[
|
|
415
|
-
await _support.fs.rimraf(this.config.getInstallPath(ext));
|
|
470
|
+
} = this.config.installedExtensions[installSpec];
|
|
416
471
|
const extData = await this.installViaNpm({
|
|
417
|
-
|
|
472
|
+
installSpec,
|
|
418
473
|
pkgName,
|
|
419
474
|
pkgVer: version
|
|
420
475
|
});
|
|
421
476
|
delete extData[`${this.type}Name`];
|
|
422
|
-
await this.config.updateExtension(
|
|
477
|
+
await this.config.updateExtension(installSpec, extData);
|
|
423
478
|
}
|
|
424
479
|
|
|
425
480
|
async _run({
|
|
426
|
-
|
|
481
|
+
installSpec,
|
|
427
482
|
scriptName
|
|
428
483
|
}) {
|
|
429
|
-
if (!
|
|
430
|
-
throw
|
|
484
|
+
if (!this.config.isInstalled(installSpec)) {
|
|
485
|
+
throw this._createFatalError(`The ${this.type} "${installSpec}" is not installed`);
|
|
431
486
|
}
|
|
432
487
|
|
|
433
|
-
const extConfig = this.config.installedExtensions[
|
|
488
|
+
const extConfig = this.config.installedExtensions[installSpec];
|
|
434
489
|
|
|
435
490
|
if (!extConfig.scripts) {
|
|
436
|
-
throw
|
|
491
|
+
throw this._createFatalError(`The ${this.type} named '${installSpec}' does not contain the ` + `"scripts" field underneath the "appium" field in its package.json`);
|
|
437
492
|
}
|
|
438
493
|
|
|
439
494
|
const extScripts = extConfig.scripts;
|
|
440
495
|
|
|
441
496
|
if (!_lodash.default.isPlainObject(extScripts)) {
|
|
442
|
-
throw
|
|
497
|
+
throw this._createFatalError(`The ${this.type} named '${installSpec}' "scripts" field must be a plain object`);
|
|
443
498
|
}
|
|
444
499
|
|
|
445
500
|
if (!_lodash.default.has(extScripts, scriptName)) {
|
|
446
|
-
throw
|
|
501
|
+
throw this._createFatalError(`The ${this.type} named '${installSpec}' does not support the script: '${scriptName}'`);
|
|
447
502
|
}
|
|
448
503
|
|
|
449
504
|
const runner = new _teen_process.SubProcess(process.execPath, [extScripts[scriptName]], {
|
|
450
|
-
cwd: this.config.getInstallPath(
|
|
505
|
+
cwd: this.config.getInstallPath(installSpec)
|
|
451
506
|
});
|
|
452
507
|
const output = new _utils.RingBuffer(50);
|
|
453
508
|
runner.on('stream-line', line => {
|
|
454
509
|
output.enqueue(line);
|
|
455
|
-
|
|
510
|
+
this.log.log(line);
|
|
456
511
|
});
|
|
457
512
|
await runner.start(0);
|
|
458
513
|
|
|
459
514
|
try {
|
|
460
515
|
await runner.join();
|
|
461
|
-
|
|
516
|
+
this.log.ok(`${scriptName} successfully ran`.green);
|
|
462
517
|
return {
|
|
463
518
|
output: output.getBuff()
|
|
464
519
|
};
|
|
465
520
|
} catch (err) {
|
|
466
|
-
|
|
521
|
+
this.log.error(`Encountered an error when running '${scriptName}': ${err.message}`.red);
|
|
467
522
|
return {
|
|
468
523
|
error: err.message,
|
|
469
524
|
output: output.getBuff()
|
|
@@ -476,4 +531,4 @@ class ExtensionCommand {
|
|
|
476
531
|
exports.ExtensionCommand = ExtensionCommand;
|
|
477
532
|
var _default = ExtensionCommand;
|
|
478
533
|
exports.default = _default;
|
|
479
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQuanMiXSwibmFtZXMiOlsiVVBEQVRFX0FMTCIsIk5vdFVwZGF0YWJsZUVycm9yIiwiRXJyb3IiLCJOb1VwZGF0ZXNBdmFpbGFibGVFcnJvciIsIkV4dGVuc2lvbkNvbW1hbmQiLCJjb25maWciLCJrbm93bkV4dGVuc2lvbnMiLCJpc0pzb25PdXRwdXQiLCJjb25zdHJ1Y3RvciIsImpzb24iLCJ0eXBlIiwiZXh0ZW5zaW9uVHlwZSIsImV4ZWN1dGUiLCJhcmdzIiwiY21kIiwiXyIsImlzRnVuY3Rpb24iLCJleGVjdXRlQ21kIiwiYmluZCIsImxpc3QiLCJzaG93SW5zdGFsbGVkIiwic2hvd1VwZGF0ZXMiLCJsc01zZyIsImluc3RhbGxlZE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJrbm93bk5hbWVzIiwiZXh0cyIsInJlZHVjZSIsImFjYyIsIm5hbWUiLCJpbmNsdWRlcyIsImluc3RhbGxlZCIsInBrZ05hbWUiLCJleHQiLCJkYXRhIiwidG9QYWlycyIsImluc3RhbGxUeXBlIiwiSU5TVEFMTF9UWVBFX05QTSIsInVwZGF0ZXMiLCJjaGVja0ZvckV4dGVuc2lvblVwZGF0ZSIsInVwZGF0ZVZlcnNpb24iLCJzYWZlVXBkYXRlIiwidW5zYWZlVXBkYXRlVmVyc2lvbiIsInVuc2FmZVVwZGF0ZSIsInVwVG9EYXRlIiwibGlzdERhdGEiLCJpbnN0YWxsVHh0IiwiZ3JleSIsInVwZGF0ZVR4dCIsInVwVG9EYXRlVHh0IiwidW5zYWZlVXBkYXRlVHh0IiwiaW5zdGFsbFNwZWMiLCJ2ZXJzaW9uIiwidHlwZVR4dCIsIklOU1RBTExfVFlQRV9HSVQiLCJJTlNUQUxMX1RZUEVfR0lUSFVCIiwieWVsbG93IiwiSU5TVEFMTF9UWVBFX0xPQ0FMIiwibWFnZW50YSIsImdyZWVuIiwiY3lhbiIsImNvbnNvbGUiLCJsb2ciLCJfaW5zdGFsbCIsInBhY2thZ2VOYW1lIiwiZXh0RGF0YSIsInNwbGl0IiwibGVuZ3RoIiwiaW5zdGFsbFZpYU5wbSIsInJlcGxhY2UiLCJwa2dWZXIiLCJwYXRoIiwiaXNBYnNvbHV0ZSIsInJlc29sdmUiLCJzcGxpdHMiLCJtc2ciLCJKU09OIiwic3RyaW5naWZ5IiwiZXh0TmFtZSIsImlzSW5zdGFsbGVkIiwiZXh0TWFuaWZlc3QiLCJhZGRFeHRlbnNpb24iLCJlbnYiLCJoYXNBcHBpdW1EZXBlbmRlbmN5IiwiYXBwaXVtSG9tZSIsImdldFBvc3RJbnN0YWxsVGV4dCIsIm5wbVNwZWMiLCJzcGVjTXNnIiwicGtnSnNvbkRhdGEiLCJucG0iLCJpbnN0YWxsUGFja2FnZSIsImdldEV4dGVuc2lvbkZpZWxkcyIsImVyciIsIm1lc3NhZ2UiLCJhcHBpdW0iLCJ2YWxpZGF0ZUV4dGVuc2lvbkZpZWxkcyIsInJlc3VsdCIsImFwcGl1bVBrZ0RhdGEiLCJfdW5pbnN0YWxsIiwiaW5zdGFsbFBhdGgiLCJnZXRJbnN0YWxsUGF0aCIsImZzIiwicmltcmFmIiwicmVtb3ZlRXh0ZW5zaW9uIiwiX3VwZGF0ZSIsInVuc2FmZSIsInNob3VsZFVwZGF0ZUFsbCIsImV4dHNUb1VwZGF0ZSIsImVycm9ycyIsImUiLCJ1cGRhdGUiLCJjdXJyZW50IiwidXBkYXRlVmVyIiwidXBkYXRlRXh0ZW5zaW9uIiwiZnJvbSIsInRvIiwicmVkIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsImdldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbiIsInV0aWwiLCJjb21wYXJlVmVyc2lvbnMiLCJfcnVuIiwic2NyaXB0TmFtZSIsImhhcyIsImV4dENvbmZpZyIsInNjcmlwdHMiLCJleHRTY3JpcHRzIiwiaXNQbGFpbk9iamVjdCIsInJ1bm5lciIsIlN1YlByb2Nlc3MiLCJwcm9jZXNzIiwiZXhlY1BhdGgiLCJjd2QiLCJvdXRwdXQiLCJSaW5nQnVmZmVyIiwib24iLCJsaW5lIiwiZW5xdWV1ZSIsInN0YXJ0Iiwiam9pbiIsImdldEJ1ZmYiLCJlcnJvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7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LEVBQUVBLE1BQU0sQ0FBQ08sT0FBUDtBQUFULE9BQVA7QUFDRCxLQUpELENBSUUsT0FBT2hELEdBQVAsRUFBWTtBQUNaLHNCQUFJLEtBQUt2RixZQUFULEVBQXdCLHNDQUFxQ3FILFVBQVcsTUFBSzlCLEdBQUcsQ0FBQ0MsT0FBUSxFQUFsRSxDQUFvRXVCLEdBQTNGO0FBQ0EsYUFBTztBQUFDeUIsUUFBQUEsS0FBSyxFQUFFakQsR0FBRyxDQUFDQyxPQUFaO0FBQXFCd0MsUUFBQUEsTUFBTSxFQUFFQSxNQUFNLENBQUNPLE9BQVA7QUFBN0IsT0FBUDtBQUNEO0FBQ0Y7O0FBOWZvQjs7O2VBaWdCUjFJLGdCIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBucG0sIGZzLCB1dGlsLCBlbnYgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgbG9nLCBzcGluV2l0aCwgUmluZ0J1ZmZlciB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgU3ViUHJvY2VzcyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyBJTlNUQUxMX1RZUEVfTlBNLCBJTlNUQUxMX1RZUEVfR0lULCBJTlNUQUxMX1RZUEVfR0lUSFVCLFxuICAgICAgICAgSU5TVEFMTF9UWVBFX0xPQ0FMIH0gZnJvbSAnLi4vZXh0ZW5zaW9uL2V4dGVuc2lvbi1jb25maWcnO1xuaW1wb3J0IHsgcGFja2FnZURpZENoYW5nZSB9IGZyb20gJy4uL2V4dGVuc2lvbi9wYWNrYWdlLWNoYW5nZWQnO1xuXG5jb25zdCBVUERBVEVfQUxMID0gJ2luc3RhbGxlZCc7XG5cbmNsYXNzIE5vdFVwZGF0YWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cbmNsYXNzIE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqL1xuY2xhc3MgRXh0ZW5zaW9uQ29tbWFuZCB7XG4gIC8qKlxuICAgKiBUaGlzIGlzIHRoZSBgRHJpdmVyQ29uZmlnYCBvciBgUGx1Z2luQ29uZmlnYCwgZGVwZW5kaW5nIG9uIGBFeHRUeXBlYC5cbiAgICogQHR5cGUge0V4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn1cbiAgICovXG4gIGNvbmZpZztcblxuICAvKipcbiAgICoge0BsaW5rY29kZSBSZWNvcmR9IG9mIG9mZmljaWFsIHBsdWdpbnMgb3IgZHJpdmVycy5cbiAgICogQHR5cGUge0tub3duRXh0ZW5zaW9uczxFeHRUeXBlPn1cbiAgICovXG4gIGtub3duRXh0ZW5zaW9ucztcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBjb21tYW5kIG91dHB1dCBoYXMgYmVlbiByZXF1ZXN0ZWQgYXMgSlNPTi5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBpc0pzb25PdXRwdXQ7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIEV4dGVuc2lvbkNvbW1hbmRcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Db21tYW5kT3B0aW9uczxFeHRUeXBlPn0gb3B0c1xuICAgKi9cbiAgY29uc3RydWN0b3IgKHtjb25maWcsIGpzb259KSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5pc0pzb25PdXRwdXQgPSBqc29uO1xuICB9XG5cbiAgLyoqXG4gICAqIGBkcml2ZXJgIG9yIGBwbHVnaW5gLCBkZXBlbmRpbmcgb24gdGhlIGBFeHRlbnNpb25Db25maWdgLlxuICAgKi9cbiAgZ2V0IHR5cGUgKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5leHRlbnNpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYSBDTEkgcGFyc2UgYW5kIHJ1biBhbiBleHRlbnNpb24gY29tbWFuZCBiYXNlZCBvbiBpdHMgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIGEga2V5L3ZhbHVlIG9iamVjdCB3aXRoIENMSSBmbGFncyBhbmQgdmFsdWVzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8b2JqZWN0Pn0gdGhlIHJlc3VsdCBvZiB0aGUgc3BlY2lmaWMgY29tbWFuZCB3aGljaCBpcyBleGVjdXRlZFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZSAoYXJncykge1xuICAgIGNvbnN0IGNtZCA9IGFyZ3NbYCR7dGhpcy50eXBlfUNvbW1hbmRgXTtcbiAgICBpZiAoIV8uaXNGdW5jdGlvbih0aGlzW2NtZF0pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBoYW5kbGUgJHt0aGlzLnR5cGV9IGNvbW1hbmQgJHtjbWR9YCk7XG4gICAgfVxuICAgIGNvbnN0IGV4ZWN1dGVDbWQgPSB0aGlzW2NtZF0uYmluZCh0aGlzKTtcbiAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZUNtZChhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiBMaXN0T3B0aW9uc1xuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IHNob3dJbnN0YWxsZWQgLSB3aGV0aGVyIHNob3VsZCBzaG93IG9ubHkgaW5zdGFsbGVkIGV4dGVuc2lvbnNcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBzaG93VXBkYXRlcyAtIHdoZXRoZXIgc2hvdWxkIHNob3cgYXZhaWxhYmxlIHVwZGF0ZXNcbiAgICovXG5cbiAgLyoqXG4gICAqIExpc3QgZXh0ZW5zaW9uc1xuICAgKlxuICAgKiBAcGFyYW0ge0xpc3RPcHRpb25zfSBvcHRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RXh0ZW5zaW9uTGlzdERhdGE+fSBtYXAgb2YgZXh0ZW5zaW9uIG5hbWVzIHRvIGV4dGVuc2lvbiBkYXRhXG4gICAqL1xuICBhc3luYyBsaXN0ICh7c2hvd0luc3RhbGxlZCwgc2hvd1VwZGF0ZXN9KSB7XG4gICAgY29uc3QgbHNNc2cgPSBgTGlzdGluZyAke3Nob3dJbnN0YWxsZWQgPyAnaW5zdGFsbGVkJyA6ICdhdmFpbGFibGUnfSAke3RoaXMudHlwZX1zYDtcbiAgICBjb25zdCBpbnN0YWxsZWROYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnMpO1xuICAgIGNvbnN0IGtub3duTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmtub3duRXh0ZW5zaW9ucyk7XG4gICAgY29uc3QgZXh0cyA9IFsuLi5pbnN0YWxsZWROYW1lcywgLi4ua25vd25OYW1lc10ucmVkdWNlKChhY2MsIG5hbWUpID0+IHtcbiAgICAgIGlmICghYWNjW25hbWVdKSB7XG4gICAgICAgIGlmIChpbnN0YWxsZWROYW1lcy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgIGFjY1tuYW1lXSA9IHsuLi50aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW25hbWVdLCBpbnN0YWxsZWQ6IHRydWV9O1xuICAgICAgICB9IGVsc2UgaWYgKCFzaG93SW5zdGFsbGVkKSB7XG4gICAgICAgICAgYWNjW25hbWVdID0ge3BrZ05hbWU6IHRoaXMua25vd25FeHRlbnNpb25zW25hbWVdLCBpbnN0YWxsZWQ6IGZhbHNlfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFRoaXMgYWNjdW11bGF0b3IgY29udGFpbnMgZWl0aGVyIHtAbGlua2NvZGUgVW5pbnN0YWxsZWRFeHRlbnNpb25MSXN0RGF0YX0gX29yX1xuICAgICAqIHtAbGlua2NvZGUgSW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGF9IHdpdGhvdXQgdXBncmFkZSBpbmZvcm1hdGlvbiAod2hpY2ggaXMgYWRkZWQgYnkgdGhlIGJlbG93IGNvZGUgYmxvY2spXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsUGFydGlhbDxJbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YT58VW5pbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YT59XG4gICAgICovKHt9KSk7XG5cbiAgICAvLyBpZiB3ZSB3YW50IHRvIHNob3cgd2hldGhlciB1cGRhdGVzIGFyZSBhdmFpbGFibGUsIHB1dCB0aGF0IGJlaGluZCBhIHNwaW5uZXJcbiAgICBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgbHNNc2csIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghc2hvd1VwZGF0ZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBbZXh0LCBkYXRhXSBvZiBfLnRvUGFpcnMoZXh0cykpIHtcbiAgICAgICAgaWYgKCFkYXRhLmluc3RhbGxlZCB8fCBkYXRhLmluc3RhbGxUeXBlICE9PSBJTlNUQUxMX1RZUEVfTlBNKSB7XG4gICAgICAgICAgLy8gZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgdXBkYXRlcyBvbiBleHRzIHRoYXQgYXJlbid0IGluc3RhbGxlZFxuICAgICAgICAgIC8vIGFsc28gZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgdXBkYXRlcyBvbiBub24tbnBtIGV4dHNcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cGRhdGVzID0gYXdhaXQgdGhpcy5jaGVja0ZvckV4dGVuc2lvblVwZGF0ZShleHQpO1xuICAgICAgICBkYXRhLnVwZGF0ZVZlcnNpb24gPSB1cGRhdGVzLnNhZmVVcGRhdGU7XG4gICAgICAgIGRhdGEudW5zYWZlVXBkYXRlVmVyc2lvbiA9IHVwZGF0ZXMudW5zYWZlVXBkYXRlO1xuICAgICAgICBkYXRhLnVwVG9EYXRlID0gdXBkYXRlcy5zYWZlVXBkYXRlID09PSBudWxsICYmIHVwZGF0ZXMudW5zYWZlVXBkYXRlID09PSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgbGlzdERhdGEgPSAvKiogQHR5cGUge0V4dGVuc2lvbkxpc3REYXRhfSAqLyhleHRzKTtcblxuICAgIC8vIGlmIHdlJ3JlIGp1c3QgZ2V0dGluZyB0aGUgZGF0YSwgc2hvcnQgY2lyY3VpdCByZXR1cm4gaGVyZSBzaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueVxuICAgIC8vIGZvcm1hdHRpbmcgbG9naWNcbiAgICBpZiAodGhpcy5pc0pzb25PdXRwdXQpIHtcbiAgICAgIHJldHVybiBsaXN0RGF0YTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtcbiAgICAgIG5hbWUsXG4gICAgICBkYXRhXG4gICAgXSBvZiBfLnRvUGFpcnMobGlzdERhdGEpKSB7XG4gICAgICBsZXQgaW5zdGFsbFR4dCA9ICcgW25vdCBpbnN0YWxsZWRdJy5ncmV5O1xuICAgICAgbGV0IHVwZGF0ZVR4dCA9ICcnO1xuICAgICAgbGV0IHVwVG9EYXRlVHh0ID0gJyc7XG4gICAgICBsZXQgdW5zYWZlVXBkYXRlVHh0ID0gJyc7XG4gICAgICBpZiAoZGF0YS5pbnN0YWxsZWQpIHtcbiAgICAgICAgY29uc3Qge2luc3RhbGxUeXBlLCBpbnN0YWxsU3BlYywgdXBkYXRlVmVyc2lvbiwgdW5zYWZlVXBkYXRlVmVyc2lvbiwgdmVyc2lvbiwgdXBUb0RhdGV9ID0gZGF0YTtcbiAgICAgICAgbGV0IHR5cGVUeHQ7XG4gICAgICAgIHN3aXRjaCAoaW5zdGFsbFR5cGUpIHtcbiAgICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9HSVQ6XG4gICAgICAgICAgY2FzZSBJTlNUQUxMX1RZUEVfR0lUSFVCOlxuICAgICAgICAgICAgdHlwZVR4dCA9IGAoY2xvbmVkIGZyb20gJHtpbnN0YWxsU3BlY30pYC55ZWxsb3c7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9MT0NBTDpcbiAgICAgICAgICAgIHR5cGVUeHQgPSBgKGxpbmtlZCBmcm9tICR7aW5zdGFsbFNwZWN9KWAubWFnZW50YTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0eXBlVHh0ID0gJyhOUE0pJztcbiAgICAgICAgfVxuICAgICAgICBpbnN0YWxsVHh0ID0gYEAke3ZlcnNpb24ueWVsbG93fSAkeygnW2luc3RhbGxlZCAnICsgdHlwZVR4dCArICddJykuZ3JlZW59YDtcblxuICAgICAgICBpZiAoc2hvd1VwZGF0ZXMpIHtcbiAgICAgICAgICBpZiAodXBkYXRlVmVyc2lvbikge1xuICAgICAgICAgICAgdXBkYXRlVHh0ID0gYCBbJHt1cGRhdGVWZXJzaW9ufSBhdmFpbGFibGVdYC5tYWdlbnRhO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodXBUb0RhdGUpIHtcbiAgICAgICAgICAgIHVwVG9EYXRlVHh0ID0gYCBbVXAgdG8gZGF0ZV1gLmdyZWVuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodW5zYWZlVXBkYXRlVmVyc2lvbikge1xuICAgICAgICAgICAgdW5zYWZlVXBkYXRlVHh0ID0gYCBbJHt1bnNhZmVVcGRhdGVWZXJzaW9ufSBhdmFpbGFibGUgKHBvdGVudGlhbGx5IHVuc2FmZSldYC5jeWFuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZyhgLSAke25hbWUueWVsbG93fSR7aW5zdGFsbFR4dH0ke3VwZGF0ZVR4dH0ke3VwVG9EYXRlVHh0fSR7dW5zYWZlVXBkYXRlVHh0fWApO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0RGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGFuIGV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxBcmdzfSBhcmdzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RXh0UmVjb3JkPEV4dFR5cGU+Pn0gbWFwIG9mIGFsbCBpbnN0YWxsZWQgZXh0ZW5zaW9uIG5hbWVzIHRvIGV4dGVuc2lvbiBkYXRhXG4gICAqL1xuICBhc3luYyBfaW5zdGFsbCAoe2V4dCwgaW5zdGFsbFR5cGUsIHBhY2thZ2VOYW1lfSkge1xuICAgIGxldCBleHREYXRhO1xuICAgIGxldCBpbnN0YWxsU3BlYyA9IGV4dDtcblxuICAgIGlmIChwYWNrYWdlTmFtZSAmJiBbSU5TVEFMTF9UWVBFX0xPQ0FMLCBJTlNUQUxMX1RZUEVfTlBNXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgV2hlbiB1c2luZyAtLXNvdXJjZT0ke2luc3RhbGxUeXBlfSwgY2Fubm90IGFsc28gdXNlIC0tcGFja2FnZWApO1xuICAgIH1cblxuICAgIGlmICghcGFja2FnZU5hbWUgJiYgW0lOU1RBTExfVFlQRV9HSVQsIElOU1RBTExfVFlQRV9HSVRIVUJdLmluY2x1ZGVzKGluc3RhbGxUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBXaGVuIHVzaW5nIC0tc291cmNlPSR7aW5zdGFsbFR5cGV9LCBtdXN0IGFsc28gdXNlIC0tcGFja2FnZWApO1xuICAgIH1cblxuICAgIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX0dJVEhVQikge1xuICAgICAgaWYgKGluc3RhbGxTcGVjLnNwbGl0KCcvJykubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgR2l0aHViICR7dGhpcy50eXBlfSBzcGVjICR7aW5zdGFsbFNwZWN9IGFwcGVhcmVkIHRvIGJlIGludmFsaWQ7IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2l0IHNob3VsZCBiZSBvZiB0aGUgZm9ybSA8b3JnPi88cmVwbz4nKTtcbiAgICAgIH1cbiAgICAgIGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe2V4dDogaW5zdGFsbFNwZWMsIHBrZ05hbWU6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyhwYWNrYWdlTmFtZSl9KTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfR0lUKSB7XG4gICAgICAvLyBnaXQgdXJscyBjYW4gaGF2ZSAnLmdpdCcgYXQgdGhlIGVuZCwgYnV0IHRoaXMgaXMgbm90IG5lY2Vzc2FyeSBhbmQgd291bGQgY29tcGxpY2F0ZSB0aGVcbiAgICAgIC8vIHdheSB3ZSBkb3dubG9hZCBhbmQgbmFtZSBkaXJlY3Rvcmllcywgc28gd2UgY2FuIGp1c3QgcmVtb3ZlIGl0XG4gICAgICBpbnN0YWxsU3BlYyA9IGluc3RhbGxTcGVjLnJlcGxhY2UoL1xcLmdpdCQvLCAnJyk7XG4gICAgICBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKHtleHQ6IGluc3RhbGxTcGVjLCBwa2dOYW1lOiAvKiogQHR5cGUge3N0cmluZ30gKi8ocGFja2FnZU5hbWUpfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBwa2dOYW1lLCBwa2dWZXI7XG4gICAgICBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9MT0NBTCkge1xuICAgICAgICBwa2dOYW1lID0gcGF0aC5pc0Fic29sdXRlKGluc3RhbGxTcGVjKSA/IGluc3RhbGxTcGVjIDogcGF0aC5yZXNvbHZlKGluc3RhbGxTcGVjKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBlaXRoZXIgYW4gbnBtIHBhY2thZ2Ugb3IgYW4gYXBwaXVtIHZlcmlmaWVkIGV4dGVuc2lvblxuICAgICAgICAvLyBuYW1lIG9yIGEgbG9jYWwgcGF0aC4gYm90aCBvZiB3aGljaCB3aWxsIGJlIGluc3RhbGxlZCB2aWEgbnBtLlxuICAgICAgICAvLyBleHRlbnNpb25zIGluc3RhbGxlZCB2aWEgbnBtIGNhbiBpbmNsdWRlIHZlcnNpb25zIG9yIHRhZ3MgYWZ0ZXIgdGhlICdAJ1xuICAgICAgICAvLyBzaWduLCBzbyBjaGVjayBmb3IgdGhhdC4gV2UgYWxzbyBuZWVkIHRvIGJlIGNhcmVmdWwgdGhhdCBwYWNrYWdlIG5hbWVzIHRoZW1zZWx2ZXMgY2FuXG4gICAgICAgIC8vIGNvbnRhaW4gdGhlICdAJyBzeW1ib2wsIGFzIGluIGBucG0gaW5zdGFsbCBAYXBwaXVtL2Zha2UtZHJpdmVyQDEuMi4wYFxuICAgICAgICBsZXQgbmFtZTtcbiAgICAgICAgY29uc3Qgc3BsaXRzID0gaW5zdGFsbFNwZWMuc3BsaXQoJ0AnKTtcbiAgICAgICAgaWYgKGluc3RhbGxTcGVjWzBdID09PSAnQCcpIHtcbiAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgYW4gbnBtIG9yZyBpbmNsdWRlZCBpbiB0aGUgcGFja2FnZSBuYW1lXG4gICAgICAgICAgW25hbWUsIHBrZ1Zlcl0gPSBbYEAke3NwbGl0c1sxXX1gLCBzcGxpdHNbMl1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGNhc2Ugd2l0aG91dCBhbiBucG0gb3JnXG4gICAgICAgICAgW25hbWUsIHBrZ1Zlcl0gPSBzcGxpdHM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAvLyBpZiB3ZSdyZSBpbnN0YWxsaW5nIGEgbmFtZWQgcGFja2FnZSBmcm9tIG5wbSwgd2UgZG9uJ3QgbmVlZCB0byBjaGVja1xuICAgICAgICAgIC8vIGFnYWluc3QgdGhlIGFwcGl1bSBleHRlbnNpb24gbGlzdDsganVzdCB1c2UgdGhlIGluc3RhbGxTcGVjIGFzIGlzXG4gICAgICAgICAgcGtnTmFtZSA9IG5hbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWYgd2UncmUgaW5zdGFsbGluZyBhIG5hbWVkIGFwcGl1bSBkcml2ZXIgKGxpa2UgJ3hjdWl0ZXN0Jykgd2UgbmVlZCB0b1xuICAgICAgICAgIC8vIGRlcmVmZXJlbmNlIHRoZSBhY3R1YWwgbnBtIHBhY2thZ2UgKCdhcHBpdXBtLXhjdWl0ZXN0LWRyaXZlcicpLCBzb1xuICAgICAgICAgIC8vIGNoZWNrIGl0IGV4aXN0cyBhbmQgZ2V0IHRoZSBjb3JyZWN0IHBhY2thZ2VcbiAgICAgICAgICBjb25zdCBrbm93bk5hbWVzID0gT2JqZWN0LmtleXModGhpcy5rbm93bkV4dGVuc2lvbnMpO1xuICAgICAgICAgIGlmICghXy5pbmNsdWRlcyhrbm93bk5hbWVzLCBuYW1lKSkge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gYENvdWxkIG5vdCByZXNvbHZlICR7dGhpcy50eXBlfTsgYXJlIHlvdSBzdXJlIGl0J3MgaW4gdGhlIGxpc3QgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgb2Ygc3VwcG9ydGVkICR7dGhpcy50eXBlfXM/ICR7SlNPTi5zdHJpbmdpZnkoa25vd25OYW1lcyl9YDtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwa2dOYW1lID0gdGhpcy5rbm93bkV4dGVuc2lvbnNbbmFtZV07XG4gICAgICAgICAgLy8gZ2l2ZW4gdGhhdCB3ZSdsbCB1c2UgdGhlIGluc3RhbGwgdHlwZSBpbiB0aGUgZHJpdmVyIGpzb24sIHN0b3JlIGl0IGFzXG4gICAgICAgICAgLy8gJ25wbScgbm93XG4gICAgICAgICAgaW5zdGFsbFR5cGUgPSBJTlNUQUxMX1RZUEVfTlBNO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe2V4dCwgcGtnTmFtZSwgcGtnVmVyfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0TmFtZSA9IGV4dERhdGFbLyoqIEB0eXBlIHtzdHJpbmd9ICovKGAke3RoaXMudHlwZX1OYW1lYCldO1xuICAgIGRlbGV0ZSBleHREYXRhWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyhgJHt0aGlzLnR5cGV9TmFtZWApXTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChleHROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBICR7dGhpcy50eXBlfSBuYW1lZCAnJHtleHROYW1lfScgaXMgYWxyZWFkeSBpbnN0YWxsZWQuIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBEaWQgeW91IG1lYW4gdG8gdXBkYXRlPyAnYXBwaXVtICR7dGhpcy50eXBlfSB1cGRhdGUnLiBTZWUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYGluc3RhbGxlZCAke3RoaXMudHlwZX1zIHdpdGggJ2FwcGl1bSAke3RoaXMudHlwZX0gbGlzdCAtLWluc3RhbGxlZCcuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0TWFuaWZlc3QgPSB7Li4uZXh0RGF0YSwgaW5zdGFsbFR5cGUsIGluc3RhbGxTcGVjfTtcbiAgICBhd2FpdCB0aGlzLmNvbmZpZy5hZGRFeHRlbnNpb24oZXh0TmFtZSwgZXh0TWFuaWZlc3QpO1xuXG4gICAgLy8gdXBkYXRlIHRoZSBpZiB3ZSd2ZSBjaGFuZ2VkIHRoZSBsb2NhbCBgcGFja2FnZS5qc29uYFxuICAgIGlmIChhd2FpdCBlbnYuaGFzQXBwaXVtRGVwZW5kZW5jeSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lKSkge1xuICAgICAgYXdhaXQgcGFja2FnZURpZENoYW5nZSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lKTtcbiAgICB9XG5cbiAgICAvLyBsb2cgaW5mbyBmb3IgdGhlIHVzZXJcbiAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIHRoaXMuZ2V0UG9zdEluc3RhbGxUZXh0KHtleHROYW1lLCBleHREYXRhfSkpO1xuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhbiBleHRlbnNpb24gdmlhIE5QTVxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxWaWFOcG1BcmdzfSBhcmdzXG4gICAqL1xuICBhc3luYyBpbnN0YWxsVmlhTnBtICh7ZXh0LCBwa2dOYW1lLCBwa2dWZXJ9KSB7XG4gICAgY29uc3QgbnBtU3BlYyA9IGAke3BrZ05hbWV9JHtwa2dWZXIgPyAnQCcgKyBwa2dWZXIgOiAnJ31gO1xuICAgIGNvbnN0IHNwZWNNc2cgPSBucG1TcGVjID09PSBleHQgPyAnJyA6IGAgdXNpbmcgTlBNIGluc3RhbGwgc3BlYyAnJHtucG1TcGVjfSdgO1xuICAgIGNvbnN0IG1zZyA9IGBJbnN0YWxsaW5nICcke2V4dH0nJHtzcGVjTXNnfWA7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBrZ0pzb25EYXRhID0gYXdhaXQgc3BpbldpdGgodGhpcy5pc0pzb25PdXRwdXQsIG1zZywgYXN5bmMgKCkgPT4gKFxuICAgICAgICBhd2FpdCBucG0uaW5zdGFsbFBhY2thZ2UodGhpcy5jb25maWcuYXBwaXVtSG9tZSwgcGtnTmFtZSwge1xuICAgICAgICAgIHBrZ1ZlclxuICAgICAgICB9KVxuICAgICAgKSk7XG4gICAgICByZXR1cm4gdGhpcy5nZXRFeHRlbnNpb25GaWVsZHMocGtnSnNvbkRhdGEpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbmNvdW50ZXJlZCBhbiBlcnJvciB3aGVuIGluc3RhbGxpbmcgcGFja2FnZTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB0ZXh0IHdoaWNoIHNob3VsZCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgYWZ0ZXIgYW4gZXh0ZW5zaW9uIGhhcyBiZWVuIGluc3RhbGxlZC4gVGhpc1xuICAgKiBpcyBkZXNpZ25lZCB0byBiZSBvdmVycmlkZGVuIGJ5IGRyaXZlcnMvcGx1Z2lucyB3aXRoIHRoZWlyIG93biBwYXJ0aWN1bGFyIHRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uQXJnc30gYXJnc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIGdldFBvc3RJbnN0YWxsVGV4dCAoYXJncykge1xuICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBmaW5hbCBjbGFzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYW4gTlBNIG1vZHVsZSdzIHBhY2thZ2UuanNvbiBhbmQgZXh0cmFjdCBBcHBpdW0gZHJpdmVyIGluZm9ybWF0aW9uIGZyb20gYSBzcGVjaWFsXG4gICAqICdhcHBpdW0nIGZpZWxkIGluIHRoZSBKU09OIGRhdGEuIFdlIG5lZWQgdGhpcyBpbmZvcm1hdGlvbiB0byBlLmcuIGRldGVybWluZSB3aGljaCBjbGFzcyB0b1xuICAgKiBsb2FkIGFzIHRoZSBtYWluIGRyaXZlciBjbGFzcywgb3IgdG8gYmUgYWJsZSB0byBkZXRlY3QgaW5jb21wYXRpYmlsaXRpZXMgYmV0d2VlbiBkcml2ZXIgYW5kXG4gICAqIGFwcGl1bSB2ZXJzaW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRQYWNrYWdlSnNvbjxFeHRUeXBlPn0gcGtnSnNvbkRhdGEgLSB0aGUgcGFja2FnZS5qc29uIGRhdGEgZm9yIGEgZHJpdmVyIG1vZHVsZSwgYXMgaWYgaXQgaGFkIGJlZW5cbiAgICogc3RyYWlnaHRmb3J3YXJkbHkgJ3JlcXVpcmUnZFxuICAgKiBAcmV0dXJucyB7RXh0ZW5zaW9uRmllbGRzPEV4dFR5cGU+fVxuICAgKi9cbiAgZ2V0RXh0ZW5zaW9uRmllbGRzIChwa2dKc29uRGF0YSkge1xuICAgIGlmICghcGtnSnNvbkRhdGEuYXBwaXVtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEluc3RhbGxlZCBkcml2ZXIgZGlkIG5vdCBoYXZlIGFuICdhcHBpdW0nIHNlY3Rpb24gaW4gaXRzIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBwYWNrYWdlLmpzb24gZmlsZSBhcyBleHBlY3RlZGApO1xuICAgIH1cbiAgICBjb25zdCB7YXBwaXVtLCBuYW1lLCB2ZXJzaW9ufSA9IHBrZ0pzb25EYXRhO1xuICAgIHRoaXMudmFsaWRhdGVFeHRlbnNpb25GaWVsZHMoYXBwaXVtKTtcbiAgICAvKiogQHR5cGUge3Vua25vd259ICovXG4gICAgY29uc3QgcmVzdWx0ID0gey4uLmFwcGl1bSwgcGtnTmFtZTogbmFtZSwgdmVyc2lvbn07XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7RXh0ZW5zaW9uRmllbGRzPEV4dFR5cGU+fSAqLyhyZXN1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBhbnkgcGFja2FnZS5qc29uIGZpZWxkcyB3aGljaCBhIHBhcnRpY3VsYXIgdHlwZSBvZiBleHRlbnNpb24gcmVxdWlyZXMsIHZhbGlkYXRlIHRoZVxuICAgKiBwcmVzZW5jZSBhbmQgZm9ybSBvZiB0aG9zZSBmaWVsZHMgb24gdGhlIHBhY2thZ2UuanNvbiBkYXRhLCB0aHJvd2luZyBhbiBlcnJvciBpZiBhbnl0aGluZyBpc1xuICAgKiBhbWlzcy5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRNZXRhZGF0YTxFeHRUeXBlPn0gYXBwaXVtUGtnRGF0YSAtIHRoZSBkYXRhIGluIHRoZSBcImFwcGl1bVwiIGZpZWxkIG9mIHBhY2thZ2UuanNvbiBmb3IgYW4gZXh0ZW5zaW9uXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFsaWRhdGVFeHRlbnNpb25GaWVsZHMgKGFwcGl1bVBrZ0RhdGEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYmUgaW1wbGVtZW50ZWQgaW4gZmluYWwgY2xhc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmluc3RhbGwgYW4gZXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7VW5pbnN0YWxsT3B0c30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dFJlY29yZDxFeHRUeXBlPj59IG1hcCBvZiBhbGwgaW5zdGFsbGVkIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgX3VuaW5zdGFsbCAoe2V4dH0pIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKGV4dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgdW5pbnN0YWxsICR7dGhpcy50eXBlfSAnJHtleHR9JzsgaXQgaXMgbm90IGluc3RhbGxlZGApO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YWxsUGF0aCA9IHRoaXMuY29uZmlnLmdldEluc3RhbGxQYXRoKGV4dCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZihpbnN0YWxsUGF0aCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuY29uZmlnLnJlbW92ZUV4dGVuc2lvbihleHQpO1xuICAgIH1cbiAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGBTdWNjZXNzZnVsbHkgdW5pbnN0YWxsZWQgJHt0aGlzLnR5cGV9ICcke2V4dH0nYC5ncmVlbik7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdCB0byB1cGRhdGUgb25lIG9yIG1vcmUgZHJpdmVycyB1c2luZyBOUE1cbiAgICpcbiAgICogQHBhcmFtIHtFeHRlbnNpb25VcGRhdGVPcHRzfSB1cGRhdGVTcGVjXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RXh0ZW5zaW9uVXBkYXRlUmVzdWx0Pn1cbiAgICovXG4gIGFzeW5jIF91cGRhdGUgKHtleHQsIHVuc2FmZX0pIHtcbiAgICBjb25zdCBzaG91bGRVcGRhdGVBbGwgPSBleHQgPT09IFVQREFURV9BTEw7XG4gICAgLy8gaWYgd2UncmUgc3BlY2lmaWNhbGx5IHJlcXVlc3RpbmcgYW4gdXBkYXRlIGZvciBhbiBleHRlbnNpb24sIG1ha2Ugc3VyZSBpdCdzIGluc3RhbGxlZFxuICAgIGlmICghc2hvdWxkVXBkYXRlQWxsICYmICF0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChleHQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gJyR7ZXh0fScgd2FzIG5vdCBpbnN0YWxsZWQsIHNvIGNhbid0IGJlIHVwZGF0ZWRgKTtcbiAgICB9XG4gICAgY29uc3QgZXh0c1RvVXBkYXRlID0gc2hvdWxkVXBkYXRlQWxsID8gT2JqZWN0LmtleXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucykgOiBbZXh0XTtcblxuICAgIC8vICdlcnJvcnMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgZXJyb3Igb2JqZWN0cyBhcyB2YWx1ZXNcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsRXJyb3I+fSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IHt9O1xuXG4gICAgLy8gJ3VwZGF0ZXMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgdXBkYXRlIG9iamVjdHMgYXMgdmFsdWVzLCB3aGVyZSBhbiB1cGRhdGVcbiAgICAvLyBvYmplY3QgaXMgb2YgdGhlIGZvcm0ge2Zyb206IHZlcnNpb25TdHJpbmcsIHRvOiB2ZXJzaW9uU3RyaW5nfVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxVcGRhdGVSZXBvcnQ+fSAqL1xuICAgIGNvbnN0IHVwZGF0ZXMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgZSBvZiBleHRzVG9VcGRhdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBgQ2hlY2tpbmcgaWYgJHt0aGlzLnR5cGV9ICcke2V9JyBpcyB1cGRhdGFibGVgLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZV0uaW5zdGFsbFR5cGUgIT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RVcGRhdGFibGVFcnJvcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZSA9IGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBgQ2hlY2tpbmcgaWYgJHt0aGlzLnR5cGV9ICcke2V9JyBuZWVkcyBhbiB1cGRhdGVgLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlID0gYXdhaXQgdGhpcy5jaGVja0ZvckV4dGVuc2lvblVwZGF0ZShlKTtcbiAgICAgICAgICBpZiAoISh1cGRhdGUuc2FmZVVwZGF0ZSB8fCB1cGRhdGUudW5zYWZlVXBkYXRlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1cGRhdGU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXVuc2FmZSAmJiAhdXBkYXRlLnNhZmVVcGRhdGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gJyR7ZX0nIGhhcyBhIG1ham9yIHJldmlzaW9uIHVwZGF0ZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYCgke3VwZGF0ZS5jdXJyZW50fSA9PiAke3VwZGF0ZS51bnNhZmVVcGRhdGV9KSwgd2hpY2ggY291bGQgaW5jbHVkZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYGJyZWFraW5nIGNoYW5nZXMuIElmIHlvdSB3YW50IHRvIGFwcGx5IHRoaXMgdXBkYXRlLCByZS1ydW4gd2l0aCAtLXVuc2FmZWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZVZlciA9IHVuc2FmZSAmJiB1cGRhdGUudW5zYWZlVXBkYXRlID8gdXBkYXRlLnVuc2FmZVVwZGF0ZSA6IHVwZGF0ZS5zYWZlVXBkYXRlO1xuICAgICAgICBhd2FpdCBzcGluV2l0aChcbiAgICAgICAgICB0aGlzLmlzSnNvbk91dHB1dCxcbiAgICAgICAgICBgVXBkYXRpbmcgZHJpdmVyICcke2V9JyBmcm9tICR7dXBkYXRlLmN1cnJlbnR9IHRvICR7dXBkYXRlVmVyfWAsXG4gICAgICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy51cGRhdGVFeHRlbnNpb24oZSwgdXBkYXRlVmVyKVxuICAgICAgICApO1xuICAgICAgICB1cGRhdGVzW2VdID0ge2Zyb206IHVwZGF0ZS5jdXJyZW50LCB0bzogdXBkYXRlVmVyfTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBlcnJvcnNbZV0gPSBlcnI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCAnVXBkYXRlIHJlcG9ydDonKTtcbiAgICBmb3IgKGNvbnN0IFtlLCB1cGRhdGVdIG9mIF8udG9QYWlycyh1cGRhdGVzKSkge1xuICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgLSAke3RoaXMudHlwZX0gJHtlfSB1cGRhdGVkOiAke3VwZGF0ZS5mcm9tfSA9PiAke3VwZGF0ZS50b31gLmdyZWVuKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbZSwgZXJyXSBvZiBfLnRvUGFpcnMoZXJyb3JzKSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdFVwZGF0YWJsZUVycm9yKSB7XG4gICAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYC0gJyR7ZX0nIHdhcyBub3QgaW5zdGFsbGVkIHZpYSBucG0sIHNvIHdlIGNvdWxkIG5vdCBjaGVjayBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZm9yIHVwZGF0ZXNgLnllbGxvdyk7XG4gICAgICB9IGVsc2UgaWYgKGVyciBpbnN0YW5jZW9mIE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yKSB7XG4gICAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYC0gJyR7ZX0nIGhhZCBubyB1cGRhdGVzIGF2YWlsYWJsZWAueWVsbG93KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSwgbWFrZSBpdCBwb3Agd2l0aCByZWQhXG4gICAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYC0gJyR7ZX0nIGZhaWxlZCB0byB1cGRhdGU6ICR7ZXJyfWAucmVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge3VwZGF0ZXMsIGVycm9yc307XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYW4gZXh0ZW5zaW9uIG5hbWUsIGZpZ3VyZSBvdXQgd2hhdCBpdHMgaGlnaGVzdCBwb3NzaWJsZSB2ZXJzaW9uIHVwZ3JhZGUgaXMsIGFuZCBhbHNvIHRoZVxuICAgKiBoaWdoZXN0IHBvc3NpYmxlIHNhZmUgdXBncmFkZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dCAtIG5hbWUgb2YgZXh0ZW5zaW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UG9zc2libGVVcGRhdGVzPn1cbiAgICovXG4gIGFzeW5jIGNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlIChleHQpIHtcbiAgICAvLyBUT0RPIGRlY2lkZSBob3cgd2Ugd2FudCB0byBoYW5kbGUgYmV0YSB2ZXJzaW9ucz9cbiAgICAvLyB0aGlzIGlzIGEgaGVscGVyIG1ldGhvZCwgJ2V4dCcgaXMgYXNzdW1lZCB0byBhbHJlYWR5IGJlIGluc3RhbGxlZCBoZXJlLCBhbmQgb2YgdGhlIG5wbVxuICAgIC8vIGluc3RhbGwgdHlwZVxuICAgIGNvbnN0IHt2ZXJzaW9uLCBwa2dOYW1lfSA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0XTtcbiAgICBsZXQgdW5zYWZlVXBkYXRlID0gYXdhaXQgbnBtLmdldExhdGVzdFZlcnNpb24odGhpcy5jb25maWcuYXBwaXVtSG9tZSwgcGtnTmFtZSk7XG4gICAgbGV0IHNhZmVVcGRhdGUgPSBhd2FpdCBucG0uZ2V0TGF0ZXN0U2FmZVVwZ3JhZGVWZXJzaW9uKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUsIHZlcnNpb24pO1xuICAgIGlmICghdXRpbC5jb21wYXJlVmVyc2lvbnModW5zYWZlVXBkYXRlLCAnPicsIHZlcnNpb24pKSB7XG4gICAgICAvLyB0aGUgbGF0ZXN0IHZlcnNpb24gaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB2ZXJzaW9uLCBzbyB0aGVyZSdzIG5vIHBvc3NpYmxlIHVwZGF0ZVxuICAgICAgdW5zYWZlVXBkYXRlID0gbnVsbDtcbiAgICAgIHNhZmVVcGRhdGUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodW5zYWZlVXBkYXRlICYmIHVuc2FmZVVwZGF0ZSA9PT0gc2FmZVVwZGF0ZSkge1xuICAgICAgLy8gdGhlIGxhdGVzdCB1cGRhdGUgaXMgdGhlIHNhbWUgYXMgdGhlIHNhZmUgdXBkYXRlLCB3aGljaCBtZWFucyBpdCdzIG5vdCBhY3R1YWxseSB1bnNhZmVcbiAgICAgIHVuc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChzYWZlVXBkYXRlICYmICF1dGlsLmNvbXBhcmVWZXJzaW9ucyhzYWZlVXBkYXRlLCAnPicsIHZlcnNpb24pKSB7XG4gICAgICAvLyBldmVuIHRoZSBzYWZlIHVwZGF0ZSBpcyBub3QgbGF0ZXIgdGhhbiB0aGUgY3VycmVudCwgc28gaXQgaXMgbm90IGFjdHVhbGx5IGFuIHVwZGF0ZVxuICAgICAgc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7Y3VycmVudDogdmVyc2lvbiwgc2FmZVVwZGF0ZSwgdW5zYWZlVXBkYXRlfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3R1YWxseSB1cGRhdGUgYW4gZXh0ZW5zaW9uIGluc3RhbGxlZCBieSBOUE0sIHVzaW5nIHRoZSBOUE0gY2xpLiBBbmQgdXBkYXRlIHRoZSBpbnN0YWxsYXRpb25cbiAgICogbWFuaWZlc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHQgLSBuYW1lIG9mIGV4dGVuc2lvbiB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSB2ZXJzaW9uIHN0cmluZyBpZGVudGlmaWVyIHRvIHVwZGF0ZSBleHRlbnNpb24gdG9cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB1cGRhdGVFeHRlbnNpb24gKGV4dCwgdmVyc2lvbikge1xuICAgIGNvbnN0IHtwa2dOYW1lfSA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0XTtcbiAgICBhd2FpdCBmcy5yaW1yYWYodGhpcy5jb25maWcuZ2V0SW5zdGFsbFBhdGgoZXh0KSk7XG4gICAgY29uc3QgZXh0RGF0YSA9IGF3YWl0IHRoaXMuaW5zdGFsbFZpYU5wbSh7ZXh0LCBwa2dOYW1lLCBwa2dWZXI6IHZlcnNpb259KTtcbiAgICBkZWxldGUgZXh0RGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8oYCR7dGhpcy50eXBlfU5hbWVgKV07XG4gICAgYXdhaXQgdGhpcy5jb25maWcudXBkYXRlRXh0ZW5zaW9uKGV4dCwgZXh0RGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIHNjcmlwdCBjYWNoZWQgaW5zaWRlIHRoZSBcInNjcmlwdHNcIiBmaWVsZCB1bmRlciBcImFwcGl1bVwiXG4gICAqIGluc2lkZSBvZiB0aGUgZHJpdmVyL3BsdWdpbnMgXCJwYWNrYWdlLmpzb25cIiBmaWxlLiBXaWxsIHRocm93XG4gICAqIGFuIGVycm9yIGlmIHRoZSBkcml2ZXIvcGx1Z2luIGRvZXMgbm90IGNvbnRhaW4gYSBcInNjcmlwdHNcIiBmaWVsZFxuICAgKiB1bmRlcm5lYXRoIHRoZSBcImFwcGl1bVwiIGZpZWxkIGluIGl0cyBwYWNrYWdlLmpzb24sIGlmIHRoZVxuICAgKiBcInNjcmlwdHNcIiBmaWVsZCBpcyBub3QgYSBwbGFpbiBvYmplY3QsIG9yIGlmIHRoZSBzY3JpcHROYW1lIGlzXG4gICAqIG5vdCBmb3VuZCB3aXRoaW4gXCJzY3JpcHRzXCIgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge1J1bk9wdGlvbnN9IG9wdHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxSdW5PdXRwdXQ+fVxuICAgKi9cbiAgYXN5bmMgX3J1biAoe2V4dCwgc2NyaXB0TmFtZX0pIHtcbiAgICBpZiAoIV8uaGFzKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnMsIGV4dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcGxlYXNlIGluc3RhbGwgdGhlICR7dGhpcy50eXBlfSBmaXJzdGApO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dENvbmZpZyA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0XTtcblxuICAgIC8vIG5vdGU6IFRTIGNhbm5vdCB1bmRlcnN0YW5kIHRoYXQgXy5oYXMoKSBpcyBhIHR5cGUgZ3VhcmRcbiAgICBpZiAoIWV4dENvbmZpZy5zY3JpcHRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gbmFtZWQgJyR7ZXh0fScgZG9lcyBub3QgY29udGFpbiB0aGUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYFwic2NyaXB0c1wiIGZpZWxkIHVuZGVybmVhdGggdGhlIFwiYXBwaXVtXCIgZmllbGQgaW4gaXRzIHBhY2thZ2UuanNvbmApO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dFNjcmlwdHMgPSBleHRDb25maWcuc2NyaXB0cztcblxuICAgIGlmICghXy5pc1BsYWluT2JqZWN0KGV4dFNjcmlwdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gbmFtZWQgJyR7ZXh0fScgXCJzY3JpcHRzXCIgZmllbGQgbXVzdCBiZSBhIHBsYWluIG9iamVjdGApO1xuICAgIH1cblxuICAgIGlmICghXy5oYXMoZXh0U2NyaXB0cywgc2NyaXB0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtleHR9JyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzY3JpcHQ6ICcke3NjcmlwdE5hbWV9J2ApO1xuICAgIH1cblxuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBTdWJQcm9jZXNzKHByb2Nlc3MuZXhlY1BhdGgsIFtcbiAgICAgIGV4dFNjcmlwdHNbc2NyaXB0TmFtZV1cbiAgICBdLCB7XG4gICAgICBjd2Q6IHRoaXMuY29uZmlnLmdldEluc3RhbGxQYXRoKGV4dClcbiAgICB9KTtcblxuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBSaW5nQnVmZmVyKDUwKTtcblxuICAgIHJ1bm5lci5vbignc3RyZWFtLWxpbmUnLCAobGluZSkgPT4ge1xuICAgICAgb3V0cHV0LmVucXVldWUobGluZSk7XG4gICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGxpbmUpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgcnVubmVyLnN0YXJ0KDApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJ1bm5lci5qb2luKCk7XG4gICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGAke3NjcmlwdE5hbWV9IHN1Y2Nlc3NmdWxseSByYW5gLmdyZWVuKTtcbiAgICAgIHJldHVybiB7b3V0cHV0OiBvdXRwdXQuZ2V0QnVmZigpfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYEVuY291bnRlcmVkIGFuIGVycm9yIHdoZW4gcnVubmluZyAnJHtzY3JpcHROYW1lfSc6ICR7ZXJyLm1lc3NhZ2V9YC5yZWQpO1xuICAgICAgcmV0dXJuIHtlcnJvcjogZXJyLm1lc3NhZ2UsIG91dHB1dDogb3V0cHV0LmdldEJ1ZmYoKX07XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEV4dGVuc2lvbkNvbW1hbmQ7XG5leHBvcnQge0V4dGVuc2lvbkNvbW1hbmR9O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmR9IGNvbnN0cnVjdG9yXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIEV4dGVuc2lvbkNvbW1hbmRPcHRpb25zXG4gKiBAcHJvcGVydHkge0V4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn0gY29uZmlnIC0gdGhlIGBEcml2ZXJDb25maWdgIG9yIGBQbHVnaW5Db25maWdgIGluc3RhbmNlIHVzZWQgZm9yIHRoaXMgY29tbWFuZFxuICogQHByb3BlcnR5IHtib29sZWFufSBqc29uIC0gd2hldGhlciB0aGUgb3V0cHV0IG9mIHRoaXMgY29tbWFuZCBzaG91bGQgYmUgSlNPTiBvciB0ZXh0XG4gKi9cblxuLyoqXG4gKiBFeHRyYSBzdHVmZiBhYm91dCBleHRlbnNpb25zOyB1c2VkIGluZGlyZWN0bHkgYnkge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmxpc3R9LlxuICpcbiAqIEB0eXBlZGVmIEV4dGVuc2lvbk1ldGFkYXRhXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGluc3RhbGxlZCAtIElmIGB0cnVlYCwgdGhlIGV4dGVuc2lvbiBpcyBpbnN0YWxsZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gdXBkYXRlVmVyc2lvbiAtIElmIHRoZSBleHRlbnNpb24gaXMgaW5zdGFsbGVkLCB0aGUgdmVyc2lvbiBpdCBjYW4gYmUgdXBkYXRlZCB0b1xuICogQHByb3BlcnR5IHtzdHJpbmc/fSB1bnNhZmVVcGRhdGVWZXJzaW9uIC0gU2FtZSBhcyBhYm92ZSwgYnV0IGEgbWFqb3IgdmVyc2lvbiBidW1wXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVwVG9EYXRlIC0gSWYgdGhlIGV4dGVuc2lvbiBpcyBpbnN0YWxsZWQgYW5kIHRoZSBsYXRlc3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uLy4uL3R5cGVzJykuRXh0ZW5zaW9uVHlwZX0gRXh0ZW5zaW9uVHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMnKS5Ecml2ZXJUeXBlfSBEcml2ZXJUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi8uLi90eXBlcycpLlBsdWdpblR5cGV9IFBsdWdpblR5cGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuRXh0UmVjb3JkPEV4dFR5cGU+fSBFeHRSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vZXh0ZW5zaW9uL2V4dGVuc2lvbi1jb25maWcnKS5FeHRlbnNpb25Db25maWc8RXh0VHlwZT59IEV4dGVuc2lvbkNvbmZpZ1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi8uLi90eXBlcy9leHRlcm5hbC1tYW5pZmVzdCcpLkV4dE1ldGFkYXRhPEV4dFR5cGU+fSBFeHRNZXRhZGF0YVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi8uLi90eXBlcy9hcHBpdW0tbWFuaWZlc3QnKS5FeHRNYW5pZmVzdDxFeHRUeXBlPn0gRXh0TWFuaWZlc3RcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvZXh0ZXJuYWwtbWFuaWZlc3QnKS5FeHRQYWNrYWdlSnNvbjxFeHRUeXBlPn0gRXh0UGFja2FnZUpzb25cbiAqL1xuXG4vKipcbiAqIFBvc3NpYmxlIHJldHVybiB2YWx1ZSBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmxpc3R9XG4gKiBAdHlwZWRlZiBVbmluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGtnTmFtZVxuICogQHByb3BlcnR5IHtmYWxzZX0gaW5zdGFsbGVkXG4gKi9cblxuLyoqXG4gKiBQb3NzaWJsZSByZXR1cm4gdmFsdWUgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuSW50ZXJuYWxNZXRhZGF0YSAmIEV4dGVuc2lvbk1ldGFkYXRhfSBJbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YVxuICovXG5cbi8qKlxuICogUmV0dXJuIHZhbHVlIG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fS5cbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLEluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhfFVuaW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGE+fSBFeHRlbnNpb25MaXN0RGF0YVxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl9ydW59LlxuICogQHR5cGVkZWYgUnVuT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dCAtIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0byBydW4gYSBzY3JpcHQgZnJvbVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNjcmlwdE5hbWUgLSBuYW1lIG9mIHRoZSBzY3JpcHQgdG8gcnVuXG4gKi9cblxuLyoqXG4gKiBSZXR1cm4gdmFsdWUgb2Yge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl9ydW59XG4gKlxuICogQHR5cGVkZWYgUnVuT3V0cHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Vycm9yXSAtIGVycm9yIG1lc3NhZ2UgaWYgc2NyaXB0IHJhbiB1bnN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlIHVuZGVmaW5lZFxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gb3V0cHV0IC0gc2NyaXB0IG91dHB1dFxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl91cGRhdGV9LlxuICogQHR5cGVkZWYgRXh0ZW5zaW9uVXBkYXRlT3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dCAtIHRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gdG8gdXBkYXRlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVuc2FmZSAtIGlmIHRydWUsIHdpbGwgcGVyZm9ybSB1bnNhZmUgdXBkYXRlcyBwYXN0IG1ham9yIHJldmlzaW9uIGJvdW5kYXJpZXNcbiAqL1xuXG4vKipcbiAqIFJldHVybiB2YWx1ZSBvZiB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuX3VwZGF0ZX0uXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25VcGRhdGVSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxFcnJvcj59IGVycm9ycyAtIG1hcCBvZiBleHQgbmFtZXMgdG8gZXJyb3Igb2JqZWN0c1xuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLFVwZGF0ZVJlcG9ydD59IHVwZGF0ZXMgLSBtYXAgb2YgZXh0IG5hbWVzIHRvIHtAbGlua2NvZGUgVXBkYXRlUmVwb3J0fXNcbiAqL1xuXG4vKipcbiAqIFBhcnQgb2YgcmVzdWx0IG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fdXBkYXRlfS5cbiAqIEB0eXBlZGVmIFVwZGF0ZVJlcG9ydFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZyb20gLSB2ZXJzaW9uIHRoZSBleHRlbnNpb24gd2FzIHVwZGF0ZWQgZnJvbVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRvIC0gdmVyc2lvbiB0aGUgZXh0ZW5zaW9uIHdhcyB1cGRhdGVkIHRvXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuX3VuaW5zdGFsbH0uXG4gKiBAdHlwZWRlZiBVbmluc3RhbGxPcHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXh0IC0gdGhlIG5hbWUgb3Igc3BlYyBvZiBhbiBleHRlbnNpb24gdG8gdW5pbnN0YWxsXG4gKi9cblxuLyoqXG4gKiBVc2VkIGJ5IHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5nZXRQb3N0SW5zdGFsbFRleHR9XG4gKiBAdHlwZWRlZiBFeHRlbnNpb25BcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXh0TmFtZSAtIHRoZSBuYW1lIG9mIGFuIGV4dGVuc2lvblxuICogQHByb3BlcnR5IHtvYmplY3R9IGV4dERhdGEgLSB0aGUgZGF0YSBmb3IgYW4gaW5zdGFsbGVkIGV4dGVuc2lvblxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmluc3RhbGxWaWFOcG19XG4gKiBAdHlwZWRlZiBJbnN0YWxsVmlhTnBtQXJnc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dCAtIHRoZSBuYW1lIG9yIHNwZWMgb2YgYW4gZXh0ZW5zaW9uIHRvIGluc3RhbGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwa2dOYW1lIC0gdGhlIE5QTSBwYWNrYWdlIG5hbWUgb2YgdGhlIGV4dGVuc2lvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwa2dWZXJdIC0gdGhlIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIE5QTSBwYWNrYWdlXG4gKi9cblxuLyoqXG4gKiBPYmplY3QgcmV0dXJuZWQgYnkge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlfVxuICogQHR5cGVkZWYgUG9zc2libGVVcGRhdGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY3VycmVudCAtIGN1cnJlbnQgdmVyc2lvblxuICogQHByb3BlcnR5IHtzdHJpbmc/fSBzYWZlVXBkYXRlIC0gdmVyc2lvbiB3ZSBjYW4gc2FmZWx5IHVwZGF0ZSB0byBpZiBpdCBleGlzdHMsIG9yIG51bGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gdW5zYWZlVXBkYXRlIC0gdmVyc2lvbiB3ZSBjYW4gdW5zYWZlbHkgdXBkYXRlIHRvIGlmIGl0IGV4aXN0cywgb3IgbnVsbFxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl9pbnN0YWxsfVxuICogQHR5cGVkZWYgSW5zdGFsbEFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHQgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byBpbnN0YWxsXG4gKiBAcHJvcGVydHkge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuSW5zdGFsbFR5cGV9IGluc3RhbGxUeXBlIC0gaG93IHRvIGluc3RhbGwgdGhpcyBleHRlbnNpb24uIE9uZSBvZiB0aGUgSU5TVEFMTF9UWVBFU1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYWNrYWdlTmFtZV0gLSBmb3IgZ2l0L2dpdGh1YiBpbnN0YWxscywgdGhlIGV4dGVuc2lvbiBub2RlIHBhY2thZ2UgbmFtZVxuICovXG5cbi8qKlxuICogUmV0dXJuZWQgYnkge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmdldEV4dGVuc2lvbkZpZWxkc31cbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge0V4dE1ldGFkYXRhPEV4dFR5cGU+ICYgeyBwa2dOYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyB9ICYgaW1wb3J0KCcuLi8uLi90eXBlcy9leHRlcm5hbC1tYW5pZmVzdCcpLkNvbW1vbk1ldGFkYXRhfSBFeHRlbnNpb25GaWVsZHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge0V4dFR5cGUgZXh0ZW5kcyBEcml2ZXJUeXBlID8gdHlwZW9mIGltcG9ydCgnLi4vY29uc3RhbnRzJykuS05PV05fRFJJVkVSUyA6IEV4dFR5cGUgZXh0ZW5kcyBQbHVnaW5UeXBlID8gdHlwZW9mIGltcG9ydCgnLi4vY29uc3RhbnRzJykuS05PV05fUExVR0lOUyA6IG5ldmVyfSBLbm93bkV4dGVuc2lvbnNcbiAqL1xuIl19
|
|
534
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJVUERBVEVfQUxMIiwiTm90VXBkYXRhYmxlRXJyb3IiLCJFcnJvciIsIk5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIiwiRXh0ZW5zaW9uQ29tbWFuZCIsImNvbmZpZyIsImtub3duRXh0ZW5zaW9ucyIsImlzSnNvbk91dHB1dCIsImNvbnN0cnVjdG9yIiwianNvbiIsImxvZyIsImNvbnNvbGUiLCJDbGlDb25zb2xlIiwianNvbk1vZGUiLCJCb29sZWFuIiwidHlwZSIsImV4dGVuc2lvblR5cGUiLCJfY3JlYXRlRmF0YWxFcnJvciIsIm1lc3NhZ2UiLCJkZWNvcmF0ZSIsImV4ZWN1dGUiLCJhcmdzIiwiY21kIiwiXyIsImlzRnVuY3Rpb24iLCJleGVjdXRlQ21kIiwiYmluZCIsImxpc3QiLCJzaG93SW5zdGFsbGVkIiwic2hvd1VwZGF0ZXMiLCJsc01zZyIsImluc3RhbGxlZE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJrbm93bk5hbWVzIiwiZXh0cyIsInJlZHVjZSIsImFjYyIsIm5hbWUiLCJpbmNsdWRlcyIsImluc3RhbGxlZCIsInBrZ05hbWUiLCJzcGluV2l0aCIsImV4dCIsImRhdGEiLCJ0b1BhaXJzIiwiaW5zdGFsbFR5cGUiLCJJTlNUQUxMX1RZUEVfTlBNIiwidXBkYXRlcyIsImNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlIiwidXBkYXRlVmVyc2lvbiIsInNhZmVVcGRhdGUiLCJ1bnNhZmVVcGRhdGVWZXJzaW9uIiwidW5zYWZlVXBkYXRlIiwidXBUb0RhdGUiLCJsaXN0RGF0YSIsImluc3RhbGxUeHQiLCJncmV5IiwidXBkYXRlVHh0IiwidXBUb0RhdGVUeHQiLCJ1bnNhZmVVcGRhdGVUeHQiLCJpbnN0YWxsU3BlYyIsInZlcnNpb24iLCJ0eXBlVHh0IiwiSU5TVEFMTF9UWVBFX0dJVCIsIklOU1RBTExfVFlQRV9HSVRIVUIiLCJ5ZWxsb3ciLCJJTlNUQUxMX1RZUEVfTE9DQUwiLCJtYWdlbnRhIiwiZ3JlZW4iLCJjeWFuIiwiX2luc3RhbGwiLCJwYWNrYWdlTmFtZSIsImV4dERhdGEiLCJpbnN0YWxsT3B0cyIsInByb2JhYmxlRXh0TmFtZSIsInNwbGl0IiwibGVuZ3RoIiwicmVwbGFjZSIsInBrZ1ZlciIsInBhdGgiLCJpc0Fic29sdXRlIiwicmVzb2x2ZSIsInNwbGl0cyIsIm1zZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJpc0luc3RhbGxlZCIsImluc3RhbGxWaWFOcG0iLCJleHROYW1lIiwiZXh0TWFuaWZlc3QiLCJlcnJvcnMiLCJ3YXJuaW5ncyIsIkIiLCJhbGwiLCJnZXRQcm9ibGVtcyIsImdldFdhcm5pbmdzIiwiZXJyb3JNYXAiLCJNYXAiLCJ3YXJuaW5nTWFwIiwiZXJyb3JTdW1tYXJpZXMiLCJ3YXJuaW5nU3VtbWFyaWVzIiwiZ2V0VmFsaWRhdGlvblJlc3VsdFN1bW1hcmllcyIsImlzRW1wdHkiLCJqb2luIiwid2FybiIsImFkZEV4dGVuc2lvbiIsImVudiIsImhhc0FwcGl1bURlcGVuZGVuY3kiLCJhcHBpdW1Ib21lIiwicGFja2FnZURpZENoYW5nZSIsImluZm8iLCJnZXRQb3N0SW5zdGFsbFRleHQiLCJucG1TcGVjIiwic3BlY01zZyIsInBrZ0pzb25EYXRhIiwibnBtIiwiaW5zdGFsbFBhY2thZ2UiLCJ2YWxpZGF0ZVBhY2thZ2VKc29uIiwiZ2V0RXh0ZW5zaW9uRmllbGRzIiwiZXJyIiwicGtnSnNvbiIsImFwcGl1bSIsInBlZXJEZXBlbmRlbmNpZXMiLCJyZXN1bHQiLCJhcHBpdW1WZXJzaW9uIiwiY3JlYXRlTWlzc2luZ0ZpZWxkRXJyb3IiLCJmaWVsZCIsIlJlZmVyZW5jZUVycm9yIiwidmFsaWRhdGVFeHRlbnNpb25GaWVsZHMiLCJleHRNZXRhZGF0YSIsIl91bmluc3RhbGwiLCJ1bmluc3RhbGxQYWNrYWdlIiwicmVtb3ZlRXh0ZW5zaW9uIiwib2siLCJfdXBkYXRlIiwidW5zYWZlIiwic2hvdWxkVXBkYXRlQWxsIiwiZXh0c1RvVXBkYXRlIiwiZSIsInVwZGF0ZSIsImN1cnJlbnQiLCJ1cGRhdGVWZXIiLCJ1cGRhdGVFeHRlbnNpb24iLCJmcm9tIiwidG8iLCJlcnJvciIsInJlZCIsImdldExhdGVzdFZlcnNpb24iLCJnZXRMYXRlc3RTYWZlVXBncmFkZVZlcnNpb24iLCJ1dGlsIiwiY29tcGFyZVZlcnNpb25zIiwiX3J1biIsInNjcmlwdE5hbWUiLCJleHRDb25maWciLCJzY3JpcHRzIiwiZXh0U2NyaXB0cyIsImlzUGxhaW5PYmplY3QiLCJoYXMiLCJydW5uZXIiLCJTdWJQcm9jZXNzIiwicHJvY2VzcyIsImV4ZWNQYXRoIiwiY3dkIiwiZ2V0SW5zdGFsbFBhdGgiLCJvdXRwdXQiLCJSaW5nQnVmZmVyIiwib24iLCJsaW5lIiwiZW5xdWV1ZSIsInN0YXJ0IiwiZ2V0QnVmZiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtucG0sIHV0aWwsIGVudiwgY29uc29sZX0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7c3BpbldpdGgsIFJpbmdCdWZmZXJ9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtTdWJQcm9jZXNzfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHtcbiAgSU5TVEFMTF9UWVBFX05QTSxcbiAgSU5TVEFMTF9UWVBFX0dJVCxcbiAgSU5TVEFMTF9UWVBFX0dJVEhVQixcbiAgSU5TVEFMTF9UWVBFX0xPQ0FMLFxufSBmcm9tICcuLi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQge3BhY2thZ2VEaWRDaGFuZ2V9IGZyb20gJy4uL2V4dGVuc2lvbi9wYWNrYWdlLWNoYW5nZWQnO1xuXG5jb25zdCBVUERBVEVfQUxMID0gJ2luc3RhbGxlZCc7XG5cbmNsYXNzIE5vdFVwZGF0YWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cbmNsYXNzIE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqL1xuY2xhc3MgRXh0ZW5zaW9uQ29tbWFuZCB7XG4gIC8qKlxuICAgKiBUaGlzIGlzIHRoZSBgRHJpdmVyQ29uZmlnYCBvciBgUGx1Z2luQ29uZmlnYCwgZGVwZW5kaW5nIG9uIGBFeHRUeXBlYC5cbiAgICogQHR5cGUge0V4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn1cbiAgICovXG4gIGNvbmZpZztcblxuICAvKipcbiAgICoge0BsaW5rY29kZSBSZWNvcmR9IG9mIG9mZmljaWFsIHBsdWdpbnMgb3IgZHJpdmVycy5cbiAgICogQHR5cGUge0tub3duRXh0ZW5zaW9uczxFeHRUeXBlPn1cbiAgICovXG4gIGtub3duRXh0ZW5zaW9ucztcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBjb21tYW5kIG91dHB1dCBoYXMgYmVlbiByZXF1ZXN0ZWQgYXMgSlNPTi5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBpc0pzb25PdXRwdXQ7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIEV4dGVuc2lvbkNvbW1hbmRcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Db21tYW5kT3B0aW9uczxFeHRUeXBlPn0gb3B0c1xuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZywganNvbn0pIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLmxvZyA9IG5ldyBjb25zb2xlLkNsaUNvbnNvbGUoe2pzb25Nb2RlOiBqc29ufSk7XG4gICAgdGhpcy5pc0pzb25PdXRwdXQgPSBCb29sZWFuKGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIGBkcml2ZXJgIG9yIGBwbHVnaW5gLCBkZXBlbmRpbmcgb24gdGhlIGBFeHRlbnNpb25Db25maWdgLlxuICAgKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmV4dGVuc2lvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBhIG1lc3NhZ2UgYW5kIHJldHVybnMgYW4ge0BsaW5rY29kZSBFcnJvcn0gdG8gdGhyb3cuXG4gICAqXG4gICAqIEZvciBUUyB0byB1bmRlcnN0YW5kIHRoYXQgYSBmdW5jdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uLCBpdCBtdXN0IGFjdHVhbGx5IHRocm93IGFuIGV4Y2VwdGlvbi0tXG4gICAqIGluIG90aGVyIHdvcmRzLCBfY2FsbGluZ18gYSBmdW5jdGlvbiB3aGljaCBpcyBndWFyYW50ZWVkIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBpcyBub3QgZW5vdWdoLS1cbiAgICogbm9yIGlzIHNvbWV0aGluZyBsaWtlIGBAcmV0dXJucyB7bmV2ZXJ9YCB3aGljaCBkb2VzIG5vdCBpbXBseSBhIHRocm93biBleGNlcHRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHJldHVybnMge0Vycm9yfVxuICAgKi9cbiAgX2NyZWF0ZUZhdGFsRXJyb3IobWVzc2FnZSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IodGhpcy5sb2cuZGVjb3JhdGUobWVzc2FnZSwgJ2Vycm9yJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYSBDTEkgcGFyc2UgYW5kIHJ1biBhbiBleHRlbnNpb24gY29tbWFuZCBiYXNlZCBvbiBpdHMgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIGEga2V5L3ZhbHVlIG9iamVjdCB3aXRoIENMSSBmbGFncyBhbmQgdmFsdWVzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8b2JqZWN0Pn0gdGhlIHJlc3VsdCBvZiB0aGUgc3BlY2lmaWMgY29tbWFuZCB3aGljaCBpcyBleGVjdXRlZFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShhcmdzKSB7XG4gICAgY29uc3QgY21kID0gYXJnc1tgJHt0aGlzLnR5cGV9Q29tbWFuZGBdO1xuICAgIGlmICghXy5pc0Z1bmN0aW9uKHRoaXNbY21kXSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYENhbm5vdCBoYW5kbGUgJHt0aGlzLnR5cGV9IGNvbW1hbmQgJHtjbWR9YCk7XG4gICAgfVxuICAgIGNvbnN0IGV4ZWN1dGVDbWQgPSB0aGlzW2NtZF0uYmluZCh0aGlzKTtcbiAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZUNtZChhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGV4dGVuc2lvbnNcbiAgICpcbiAgICogQHBhcmFtIHtMaXN0T3B0aW9uc30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dGVuc2lvbkxpc3REYXRhPn0gbWFwIG9mIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgbGlzdCh7c2hvd0luc3RhbGxlZCwgc2hvd1VwZGF0ZXN9KSB7XG4gICAgY29uc3QgbHNNc2cgPSBgTGlzdGluZyAke3Nob3dJbnN0YWxsZWQgPyAnaW5zdGFsbGVkJyA6ICdhdmFpbGFibGUnfSAke3RoaXMudHlwZX1zYDtcbiAgICBjb25zdCBpbnN0YWxsZWROYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnMpO1xuICAgIGNvbnN0IGtub3duTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmtub3duRXh0ZW5zaW9ucyk7XG4gICAgY29uc3QgZXh0cyA9IFsuLi5pbnN0YWxsZWROYW1lcywgLi4ua25vd25OYW1lc10ucmVkdWNlKFxuICAgICAgKGFjYywgbmFtZSkgPT4ge1xuICAgICAgICBpZiAoIWFjY1tuYW1lXSkge1xuICAgICAgICAgIGlmIChpbnN0YWxsZWROYW1lcy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgICAgYWNjW25hbWVdID0ge1xuICAgICAgICAgICAgICAuLi50aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW25hbWVdLFxuICAgICAgICAgICAgICBpbnN0YWxsZWQ6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXNob3dJbnN0YWxsZWQpIHtcbiAgICAgICAgICAgIGFjY1tuYW1lXSA9IHtwa2dOYW1lOiB0aGlzLmtub3duRXh0ZW5zaW9uc1tuYW1lXSwgaW5zdGFsbGVkOiBmYWxzZX07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBUaGlzIGFjY3VtdWxhdG9yIGNvbnRhaW5zIGVpdGhlciB7QGxpbmtjb2RlIFVuaW5zdGFsbGVkRXh0ZW5zaW9uTElzdERhdGF9IF9vcl9cbiAgICAgICAqIHtAbGlua2NvZGUgSW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGF9IHdpdGhvdXQgdXBncmFkZSBpbmZvcm1hdGlvbiAod2hpY2ggaXMgYWRkZWQgYnkgdGhlIGJlbG93IGNvZGUgYmxvY2spXG4gICAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxQYXJ0aWFsPEluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhPnxVbmluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhPn1cbiAgICAgICAqLyAoe30pXG4gICAgKTtcblxuICAgIC8vIGlmIHdlIHdhbnQgdG8gc2hvdyB3aGV0aGVyIHVwZGF0ZXMgYXJlIGF2YWlsYWJsZSwgcHV0IHRoYXQgYmVoaW5kIGEgc3Bpbm5lclxuICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBsc01zZywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzaG93VXBkYXRlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtleHQsIGRhdGFdIG9mIF8udG9QYWlycyhleHRzKSkge1xuICAgICAgICBpZiAoIWRhdGEuaW5zdGFsbGVkIHx8IGRhdGEuaW5zdGFsbFR5cGUgIT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAvLyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzIG9uIGV4dHMgdGhhdCBhcmVuJ3QgaW5zdGFsbGVkXG4gICAgICAgICAgLy8gYWxzbyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzIG9uIG5vbi1ucG0gZXh0c1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZXMgPSBhd2FpdCB0aGlzLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlKGV4dCk7XG4gICAgICAgIGRhdGEudXBkYXRlVmVyc2lvbiA9IHVwZGF0ZXMuc2FmZVVwZGF0ZTtcbiAgICAgICAgZGF0YS51bnNhZmVVcGRhdGVWZXJzaW9uID0gdXBkYXRlcy51bnNhZmVVcGRhdGU7XG4gICAgICAgIGRhdGEudXBUb0RhdGUgPSB1cGRhdGVzLnNhZmVVcGRhdGUgPT09IG51bGwgJiYgdXBkYXRlcy51bnNhZmVVcGRhdGUgPT09IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBsaXN0RGF0YSA9IC8qKiBAdHlwZSB7RXh0ZW5zaW9uTGlzdERhdGF9ICovIChleHRzKTtcblxuICAgIC8vIGlmIHdlJ3JlIGp1c3QgZ2V0dGluZyB0aGUgZGF0YSwgc2hvcnQgY2lyY3VpdCByZXR1cm4gaGVyZSBzaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueVxuICAgIC8vIGZvcm1hdHRpbmcgbG9naWNcbiAgICBpZiAodGhpcy5pc0pzb25PdXRwdXQpIHtcbiAgICAgIHJldHVybiBsaXN0RGF0YTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBkYXRhXSBvZiBfLnRvUGFpcnMobGlzdERhdGEpKSB7XG4gICAgICBsZXQgaW5zdGFsbFR4dCA9ICcgW25vdCBpbnN0YWxsZWRdJy5ncmV5O1xuICAgICAgbGV0IHVwZGF0ZVR4dCA9ICcnO1xuICAgICAgbGV0IHVwVG9EYXRlVHh0ID0gJyc7XG4gICAgICBsZXQgdW5zYWZlVXBkYXRlVHh0ID0gJyc7XG4gICAgICBpZiAoZGF0YS5pbnN0YWxsZWQpIHtcbiAgICAgICAgY29uc3Qge2luc3RhbGxUeXBlLCBpbnN0YWxsU3BlYywgdXBkYXRlVmVyc2lvbiwgdW5zYWZlVXBkYXRlVmVyc2lvbiwgdmVyc2lvbiwgdXBUb0RhdGV9ID1cbiAgICAgICAgICBkYXRhO1xuICAgICAgICBsZXQgdHlwZVR4dDtcbiAgICAgICAgc3dpdGNoIChpbnN0YWxsVHlwZSkge1xuICAgICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0dJVDpcbiAgICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9HSVRIVUI6XG4gICAgICAgICAgICB0eXBlVHh0ID0gYChjbG9uZWQgZnJvbSAke2luc3RhbGxTcGVjfSlgLnllbGxvdztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0xPQ0FMOlxuICAgICAgICAgICAgdHlwZVR4dCA9IGAobGlua2VkIGZyb20gJHtpbnN0YWxsU3BlY30pYC5tYWdlbnRhO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHR5cGVUeHQgPSAnKE5QTSknO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbGxUeHQgPSBgQCR7dmVyc2lvbi55ZWxsb3d9ICR7KCdbaW5zdGFsbGVkICcgKyB0eXBlVHh0ICsgJ10nKS5ncmVlbn1gO1xuXG4gICAgICAgIGlmIChzaG93VXBkYXRlcykge1xuICAgICAgICAgIGlmICh1cGRhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgICB1cGRhdGVUeHQgPSBgIFske3VwZGF0ZVZlcnNpb259IGF2YWlsYWJsZV1gLm1hZ2VudGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1cFRvRGF0ZSkge1xuICAgICAgICAgICAgdXBUb0RhdGVUeHQgPSBgIFtVcCB0byBkYXRlXWAuZ3JlZW47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1bnNhZmVVcGRhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgICB1bnNhZmVVcGRhdGVUeHQgPSBgIFske3Vuc2FmZVVwZGF0ZVZlcnNpb259IGF2YWlsYWJsZSAocG90ZW50aWFsbHkgdW5zYWZlKV1gLmN5YW47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nLmxvZyhgLSAke25hbWUueWVsbG93fSR7aW5zdGFsbFR4dH0ke3VwZGF0ZVR4dH0ke3VwVG9EYXRlVHh0fSR7dW5zYWZlVXBkYXRlVHh0fWApO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0RGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGFuIGV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxBcmdzfSBhcmdzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RXh0UmVjb3JkPEV4dFR5cGU+Pn0gbWFwIG9mIGFsbCBpbnN0YWxsZWQgZXh0ZW5zaW9uIG5hbWVzIHRvIGV4dGVuc2lvbiBkYXRhXG4gICAqL1xuICBhc3luYyBfaW5zdGFsbCh7aW5zdGFsbFNwZWMsIGluc3RhbGxUeXBlLCBwYWNrYWdlTmFtZX0pIHtcbiAgICAvKiogQHR5cGUge0V4dGVuc2lvbkZpZWxkczxFeHRUeXBlPn0gKi9cbiAgICBsZXQgZXh0RGF0YTtcblxuICAgIGlmIChwYWNrYWdlTmFtZSAmJiBbSU5TVEFMTF9UWVBFX0xPQ0FMLCBJTlNUQUxMX1RZUEVfTlBNXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYFdoZW4gdXNpbmcgLS1zb3VyY2U9JHtpbnN0YWxsVHlwZX0sIGNhbm5vdCBhbHNvIHVzZSAtLXBhY2thZ2VgKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhY2thZ2VOYW1lICYmIFtJTlNUQUxMX1RZUEVfR0lULCBJTlNUQUxMX1RZUEVfR0lUSFVCXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYFdoZW4gdXNpbmcgLS1zb3VyY2U9JHtpbnN0YWxsVHlwZX0sIG11c3QgYWxzbyB1c2UgLS1wYWNrYWdlYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0luc3RhbGxWaWFOcG1BcmdzfVxuICAgICAqL1xuICAgIGxldCBpbnN0YWxsT3B0cztcblxuICAgIC8qKlxuICAgICAqIFRoZSBwcm9iYWJsZSAoPykgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGRlcml2ZWQgZnJvbSB0aGUgaW5zdGFsbCBzcGVjLlxuICAgICAqXG4gICAgICogSWYgdXNpbmcgYSBsb2NhbCBpbnN0YWxsIHR5cGUsIHRoaXMgd2lsbCByZW1haW4gZW1wdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBsZXQgcHJvYmFibGVFeHROYW1lID0gJyc7XG5cbiAgICAvLyBkZXBlbmRpbmcgb24gYGluc3RhbGxUeXBlYCwgYnVpbGQgdGhlIG9wdGlvbnMgdG8gcGFzcyBpbnRvIGBpbnN0YWxsVmlhTnBtYFxuICAgIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX0dJVEhVQikge1xuICAgICAgaWYgKGluc3RhbGxTcGVjLnNwbGl0KCcvJykubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgICAgYEdpdGh1YiAke3RoaXMudHlwZX0gc3BlYyAke2luc3RhbGxTcGVjfSBhcHBlYXJlZCB0byBiZSBpbnZhbGlkOyBgICtcbiAgICAgICAgICAgICdpdCBzaG91bGQgYmUgb2YgdGhlIGZvcm0gPG9yZz4vPHJlcG8+J1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaW5zdGFsbE9wdHMgPSB7XG4gICAgICAgIGluc3RhbGxTcGVjLFxuICAgICAgICBwa2dOYW1lOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhY2thZ2VOYW1lKSxcbiAgICAgIH07XG4gICAgICBwcm9iYWJsZUV4dE5hbWUgPSBpbnN0YWxsU3BlYztcbiAgICB9IGVsc2UgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfR0lUKSB7XG4gICAgICAvLyBnaXQgdXJscyBjYW4gaGF2ZSAnLmdpdCcgYXQgdGhlIGVuZCwgYnV0IHRoaXMgaXMgbm90IG5lY2Vzc2FyeSBhbmQgd291bGQgY29tcGxpY2F0ZSB0aGVcbiAgICAgIC8vIHdheSB3ZSBkb3dubG9hZCBhbmQgbmFtZSBkaXJlY3Rvcmllcywgc28gd2UgY2FuIGp1c3QgcmVtb3ZlIGl0XG4gICAgICBpbnN0YWxsU3BlYyA9IGluc3RhbGxTcGVjLnJlcGxhY2UoL1xcLmdpdCQvLCAnJyk7XG4gICAgICBpbnN0YWxsT3B0cyA9IHtcbiAgICAgICAgaW5zdGFsbFNwZWMsXG4gICAgICAgIHBrZ05hbWU6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGFja2FnZU5hbWUpLFxuICAgICAgfTtcbiAgICAgIHByb2JhYmxlRXh0TmFtZSA9IGluc3RhbGxTcGVjO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcGtnTmFtZSwgcGtnVmVyO1xuICAgICAgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfTE9DQUwpIHtcbiAgICAgICAgcGtnTmFtZSA9IHBhdGguaXNBYnNvbHV0ZShpbnN0YWxsU3BlYykgPyBpbnN0YWxsU3BlYyA6IHBhdGgucmVzb2x2ZShpbnN0YWxsU3BlYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhdCB0aGlzIHBvaW50IHdlIGhhdmUgZWl0aGVyIGFuIG5wbSBwYWNrYWdlIG9yIGFuIGFwcGl1bSB2ZXJpZmllZCBleHRlbnNpb25cbiAgICAgICAgLy8gbmFtZSBvciBhIGxvY2FsIHBhdGguIGJvdGggb2Ygd2hpY2ggd2lsbCBiZSBpbnN0YWxsZWQgdmlhIG5wbS5cbiAgICAgICAgLy8gZXh0ZW5zaW9ucyBpbnN0YWxsZWQgdmlhIG5wbSBjYW4gaW5jbHVkZSB2ZXJzaW9ucyBvciB0YWdzIGFmdGVyIHRoZSAnQCdcbiAgICAgICAgLy8gc2lnbiwgc28gY2hlY2sgZm9yIHRoYXQuIFdlIGFsc28gbmVlZCB0byBiZSBjYXJlZnVsIHRoYXQgcGFja2FnZSBuYW1lcyB0aGVtc2VsdmVzIGNhblxuICAgICAgICAvLyBjb250YWluIHRoZSAnQCcgc3ltYm9sLCBhcyBpbiBgbnBtIGluc3RhbGwgQGFwcGl1bS9mYWtlLWRyaXZlckAxLjIuMGBcbiAgICAgICAgbGV0IG5hbWU7XG4gICAgICAgIGNvbnN0IHNwbGl0cyA9IGluc3RhbGxTcGVjLnNwbGl0KCdAJyk7XG4gICAgICAgIGlmIChpbnN0YWxsU3BlY1swXSA9PT0gJ0AnKSB7XG4gICAgICAgICAgLy8gdGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIGFuIG5wbSBvcmcgaW5jbHVkZWQgaW4gdGhlIHBhY2thZ2UgbmFtZVxuICAgICAgICAgIFtuYW1lLCBwa2dWZXJdID0gW2BAJHtzcGxpdHNbMV19YCwgc3BsaXRzWzJdXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBjYXNlIHdpdGhvdXQgYW4gbnBtIG9yZ1xuICAgICAgICAgIFtuYW1lLCBwa2dWZXJdID0gc3BsaXRzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfTlBNKSB7XG4gICAgICAgICAgLy8gaWYgd2UncmUgaW5zdGFsbGluZyBhIG5hbWVkIHBhY2thZ2UgZnJvbSBucG0sIHdlIGRvbid0IG5lZWQgdG8gY2hlY2tcbiAgICAgICAgICAvLyBhZ2FpbnN0IHRoZSBhcHBpdW0gZXh0ZW5zaW9uIGxpc3Q7IGp1c3QgdXNlIHRoZSBpbnN0YWxsU3BlYyBhcyBpc1xuICAgICAgICAgIHBrZ05hbWUgPSBuYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGlmIHdlJ3JlIGluc3RhbGxpbmcgYSBuYW1lZCBhcHBpdW0gZHJpdmVyIChsaWtlICd4Y3VpdGVzdCcpIHdlIG5lZWQgdG9cbiAgICAgICAgICAvLyBkZXJlZmVyZW5jZSB0aGUgYWN0dWFsIG5wbSBwYWNrYWdlICgnYXBwaXVwbS14Y3VpdGVzdC1kcml2ZXInKSwgc29cbiAgICAgICAgICAvLyBjaGVjayBpdCBleGlzdHMgYW5kIGdldCB0aGUgY29ycmVjdCBwYWNrYWdlXG4gICAgICAgICAgY29uc3Qga25vd25OYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMua25vd25FeHRlbnNpb25zKTtcbiAgICAgICAgICBpZiAoIV8uaW5jbHVkZXMoa25vd25OYW1lcywgbmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9XG4gICAgICAgICAgICAgIGBDb3VsZCBub3QgcmVzb2x2ZSAke3RoaXMudHlwZX07IGFyZSB5b3Ugc3VyZSBpdCdzIGluIHRoZSBsaXN0IGAgK1xuICAgICAgICAgICAgICBgb2Ygc3VwcG9ydGVkICR7dGhpcy50eXBlfXM/ICR7SlNPTi5zdHJpbmdpZnkoa25vd25OYW1lcyl9YDtcbiAgICAgICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IobXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJvYmFibGVFeHROYW1lID0gbmFtZTtcbiAgICAgICAgICBwa2dOYW1lID0gdGhpcy5rbm93bkV4dGVuc2lvbnNbbmFtZV07XG4gICAgICAgICAgLy8gZ2l2ZW4gdGhhdCB3ZSdsbCB1c2UgdGhlIGluc3RhbGwgdHlwZSBpbiB0aGUgZHJpdmVyIGpzb24sIHN0b3JlIGl0IGFzXG4gICAgICAgICAgLy8gJ25wbScgbm93XG4gICAgICAgICAgaW5zdGFsbFR5cGUgPSBJTlNUQUxMX1RZUEVfTlBNO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpbnN0YWxsT3B0cyA9IHtpbnN0YWxsU3BlYywgcGtnTmFtZSwgcGtnVmVyfTtcbiAgICB9XG5cbiAgICAvLyBmYWlsIGZhc3QgaGVyZSBpZiB3ZSBjYW5cbiAgICBpZiAocHJvYmFibGVFeHROYW1lICYmIHRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKHByb2JhYmxlRXh0TmFtZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgIGBBICR7dGhpcy50eXBlfSBuYW1lZCBcIiR7cHJvYmFibGVFeHROYW1lfVwiIGlzIGFscmVhZHkgaW5zdGFsbGVkLiBgICtcbiAgICAgICAgICBgRGlkIHlvdSBtZWFuIHRvIHVwZGF0ZT8gUnVuIFwiYXBwaXVtICR7dGhpcy50eXBlfSB1cGRhdGVcIi4gU2VlIGAgK1xuICAgICAgICAgIGBpbnN0YWxsZWQgJHt0aGlzLnR5cGV9cyB3aXRoIFwiYXBwaXVtICR7dGhpcy50eXBlfSBsaXN0IC0taW5zdGFsbGVkXCIuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKGluc3RhbGxPcHRzKTtcblxuICAgIC8vIHRoaXMgX3Nob3VsZF8gYmUgdGhlIHNhbWUgYXMgYHByb2JhYmx5RXh0TmFtZWAgYXMgdGhlIG9uZSBkZXJpdmVkIGFib3ZlIHVubGVzc1xuICAgIC8vIGluc3RhbGwgdHlwZSBpcyBsb2NhbC5cbiAgICBjb25zdCBleHROYW1lID0gZXh0RGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8gKGAke3RoaXMudHlwZX1OYW1lYCldO1xuXG4gICAgLy8gY2hlY2sgX2Egc2Vjb25kIHRpbWVfIHdpdGggdGhlIG1vcmUtYWNjdXJhdGUgZXh0TmFtZVxuICAgIGlmICh0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChleHROYW1lKSkge1xuICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRmF0YWxFcnJvcihcbiAgICAgICAgYEEgJHt0aGlzLnR5cGV9IG5hbWVkIFwiJHtleHROYW1lfVwiIGlzIGFscmVhZHkgaW5zdGFsbGVkLiBgICtcbiAgICAgICAgICBgRGlkIHlvdSBtZWFuIHRvIHVwZGF0ZT8gUnVuIFwiYXBwaXVtICR7dGhpcy50eXBlfSB1cGRhdGVcIi4gU2VlIGAgK1xuICAgICAgICAgIGBpbnN0YWxsZWQgJHt0aGlzLnR5cGV9cyB3aXRoIFwiYXBwaXVtICR7dGhpcy50eXBlfSBsaXN0IC0taW5zdGFsbGVkXCIuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGZpZWxkIGRvZXMgbm90IGV4aXN0IGFzIHN1Y2ggaW4gdGhlIG1hbmlmZXN0IChpdCdzIHVzZWQgYXMgYSBwcm9wZXJ0eSBuYW1lIGluc3RlYWQpXG4gICAgLy8gc28gdGhhdCdzIHdoeSBpdCdzIGJlaW5nIHJlbW92ZWQgaGVyZS5cbiAgICBkZWxldGUgZXh0RGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8gKGAke3RoaXMudHlwZX1OYW1lYCldO1xuXG4gICAgLyoqIEB0eXBlIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gKi9cbiAgICBjb25zdCBleHRNYW5pZmVzdCA9IHsuLi5leHREYXRhLCBpbnN0YWxsVHlwZSwgaW5zdGFsbFNwZWN9O1xuICAgIGNvbnN0IFtlcnJvcnMsIHdhcm5pbmdzXSA9IGF3YWl0IEIuYWxsKFtcbiAgICAgIHRoaXMuY29uZmlnLmdldFByb2JsZW1zKGV4dE5hbWUsIGV4dE1hbmlmZXN0KSxcbiAgICAgIHRoaXMuY29uZmlnLmdldFdhcm5pbmdzKGV4dE5hbWUsIGV4dE1hbmlmZXN0KSxcbiAgICBdKTtcbiAgICBjb25zdCBlcnJvck1hcCA9IG5ldyBNYXAoW1tleHROYW1lLCBlcnJvcnNdXSk7XG4gICAgY29uc3Qgd2FybmluZ01hcCA9IG5ldyBNYXAoW1tleHROYW1lLCB3YXJuaW5nc11dKTtcbiAgICBjb25zdCB7ZXJyb3JTdW1tYXJpZXMsIHdhcm5pbmdTdW1tYXJpZXN9ID0gdGhpcy5jb25maWcuZ2V0VmFsaWRhdGlvblJlc3VsdFN1bW1hcmllcyhcbiAgICAgIGVycm9yTWFwLFxuICAgICAgd2FybmluZ01hcFxuICAgICk7XG5cbiAgICBpZiAoIV8uaXNFbXB0eShlcnJvclN1bW1hcmllcykpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoZXJyb3JTdW1tYXJpZXMuam9pbignXFxuJykpO1xuICAgIH1cblxuICAgIC8vIG5vdGUgdGhhdCB3ZSB3b24ndCBzaG93IGFueSB3YXJuaW5ncyBpZiB0aGVyZSB3ZXJlIGVycm9ycy5cbiAgICBpZiAoIV8uaXNFbXB0eSh3YXJuaW5nU3VtbWFyaWVzKSkge1xuICAgICAgdGhpcy5sb2cud2Fybih3YXJuaW5nU3VtbWFyaWVzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmNvbmZpZy5hZGRFeHRlbnNpb24oZXh0TmFtZSwgZXh0TWFuaWZlc3QpO1xuXG4gICAgLy8gdXBkYXRlIHRoZSBpZiB3ZSd2ZSBjaGFuZ2VkIHRoZSBsb2NhbCBgcGFja2FnZS5qc29uYFxuICAgIGlmIChhd2FpdCBlbnYuaGFzQXBwaXVtRGVwZW5kZW5jeSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lKSkge1xuICAgICAgYXdhaXQgcGFja2FnZURpZENoYW5nZSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lKTtcbiAgICB9XG5cbiAgICAvLyBsb2cgaW5mbyBmb3IgdGhlIHVzZXJcbiAgICB0aGlzLmxvZy5pbmZvKHRoaXMuZ2V0UG9zdEluc3RhbGxUZXh0KHtleHROYW1lLCBleHREYXRhfSkpO1xuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhbiBleHRlbnNpb24gdmlhIE5QTVxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxWaWFOcG1BcmdzfSBhcmdzXG4gICAqL1xuICBhc3luYyBpbnN0YWxsVmlhTnBtKHtpbnN0YWxsU3BlYywgcGtnTmFtZSwgcGtnVmVyfSkge1xuICAgIGNvbnN0IG5wbVNwZWMgPSBgJHtwa2dOYW1lfSR7cGtnVmVyID8gJ0AnICsgcGtnVmVyIDogJyd9YDtcbiAgICBjb25zdCBzcGVjTXNnID0gbnBtU3BlYyA9PT0gaW5zdGFsbFNwZWMgPyAnJyA6IGAgdXNpbmcgTlBNIGluc3RhbGwgc3BlYyAnJHtucG1TcGVjfSdgO1xuICAgIGNvbnN0IG1zZyA9IGBJbnN0YWxsaW5nICcke2luc3RhbGxTcGVjfScke3NwZWNNc2d9YDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGtnSnNvbkRhdGEgPSBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgbXNnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBrZ0pzb25EYXRhID0gYXdhaXQgbnBtLmluc3RhbGxQYWNrYWdlKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUsIHtcbiAgICAgICAgICBwa2dWZXIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnZhbGlkYXRlUGFja2FnZUpzb24ocGtnSnNvbkRhdGEsIGluc3RhbGxTcGVjKTtcbiAgICAgICAgcmV0dXJuIHBrZ0pzb25EYXRhO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0aGlzLmdldEV4dGVuc2lvbkZpZWxkcyhwa2dKc29uRGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKGBFbmNvdW50ZXJlZCBhbiBlcnJvciB3aGVuIGluc3RhbGxpbmcgcGFja2FnZTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB0ZXh0IHdoaWNoIHNob3VsZCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgYWZ0ZXIgYW4gZXh0ZW5zaW9uIGhhcyBiZWVuIGluc3RhbGxlZC4gVGhpc1xuICAgKiBpcyBkZXNpZ25lZCB0byBiZSBvdmVycmlkZGVuIGJ5IGRyaXZlcnMvcGx1Z2lucyB3aXRoIHRoZWlyIG93biBwYXJ0aWN1bGFyIHRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uQXJnc30gYXJnc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIGdldFBvc3RJbnN0YWxsVGV4dChhcmdzKSB7XG4gICAgdGhyb3cgdGhpcy5fY3JlYXRlRmF0YWxFcnJvcignTXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBmaW5hbCBjbGFzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYW4gTlBNIG1vZHVsZSdzIHBhY2thZ2UuanNvbiBhbmQgZXh0cmFjdCBBcHBpdW0gZHJpdmVyIGluZm9ybWF0aW9uIGZyb20gYSBzcGVjaWFsXG4gICAqICdhcHBpdW0nIGZpZWxkIGluIHRoZSBKU09OIGRhdGEuIFdlIG5lZWQgdGhpcyBpbmZvcm1hdGlvbiB0byBlLmcuIGRldGVybWluZSB3aGljaCBjbGFzcyB0b1xuICAgKiBsb2FkIGFzIHRoZSBtYWluIGRyaXZlciBjbGFzcywgb3IgdG8gYmUgYWJsZSB0byBkZXRlY3QgaW5jb21wYXRpYmlsaXRpZXMgYmV0d2VlbiBkcml2ZXIgYW5kXG4gICAqIGFwcGl1bSB2ZXJzaW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRQYWNrYWdlSnNvbjxFeHRUeXBlPn0gcGtnSnNvbiAtIHRoZSBwYWNrYWdlLmpzb24gZGF0YSBmb3IgYSBkcml2ZXIgbW9kdWxlLCBhcyBpZiBpdCBoYWQgYmVlbiBzdHJhaWdodGZvcndhcmRseSAncmVxdWlyZSdkXG4gICAqIEByZXR1cm5zIHtFeHRlbnNpb25GaWVsZHM8RXh0VHlwZT59XG4gICAqL1xuICBnZXRFeHRlbnNpb25GaWVsZHMocGtnSnNvbikge1xuICAgIGNvbnN0IHthcHBpdW0sIG5hbWUsIHZlcnNpb24sIHBlZXJEZXBlbmRlbmNpZXN9ID0gcGtnSnNvbjtcblxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAuLi5hcHBpdW0sXG4gICAgICBwa2dOYW1lOiBuYW1lLFxuICAgICAgdmVyc2lvbixcbiAgICAgIGFwcGl1bVZlcnNpb246IHBlZXJEZXBlbmRlbmNpZXM/LmFwcGl1bSxcbiAgICB9O1xuICAgIHJldHVybiAvKiogQHR5cGUge0V4dGVuc2lvbkZpZWxkczxFeHRUeXBlPn0gKi8gKHJlc3VsdCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBfcmVxdWlyZWRfIHJvb3QgZmllbGRzIG9mIGFuIGV4dGVuc2lvbidzIGBwYWNrYWdlLmpzb25gIGZpbGUuXG4gICAqXG4gICAqIFRoZXNlIHJlcXVpcmVkIGZpZWxkcyBhcmU6XG4gICAqIC0gYG5hbWVgXG4gICAqIC0gYHZlcnNpb25gXG4gICAqIC0gYGFwcGl1bWBcbiAgICogQHBhcmFtIHtpbXBvcnQoJ3R5cGUtZmVzdCcpLlBhY2thZ2VKc29ufSBwa2dKc29uIC0gYHBhY2thZ2UuanNvbmAgb2YgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIEV4dGVuc2lvbiBuYW1lL3NwZWNcbiAgICogQHRocm93cyB7UmVmZXJlbmNlRXJyb3J9IElmIGBwYWNrYWdlLmpzb25gIGhhcyBhIG1pc3Npbmcgb3IgaW52YWxpZCBmaWVsZFxuICAgKiBAcmV0dXJucyB7cGtnSnNvbiBpcyBFeHRQYWNrYWdlSnNvbjxFeHRUeXBlPn1cbiAgICovXG4gIHZhbGlkYXRlUGFja2FnZUpzb24ocGtnSnNvbiwgaW5zdGFsbFNwZWMpIHtcbiAgICBjb25zdCB7YXBwaXVtLCBuYW1lLCB2ZXJzaW9ufSA9IC8qKiBAdHlwZSB7RXh0UGFja2FnZUpzb248RXh0VHlwZT59ICovIChwa2dKc29uKTtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkXG4gICAgICogQHJldHVybnMge1JlZmVyZW5jZUVycm9yfVxuICAgICAqL1xuICAgIGNvbnN0IGNyZWF0ZU1pc3NpbmdGaWVsZEVycm9yID0gKGZpZWxkKSA9PlxuICAgICAgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICBgJHt0aGlzLnR5cGV9IFwiJHtpbnN0YWxsU3BlY31cIiBpbnZhbGlkOyBtaXNzaW5nIGEgXFxgJHtmaWVsZH1cXGAgZmllbGQgb2YgaXRzIFxcYHBhY2thZ2UuanNvblxcYGBcbiAgICAgICk7XG5cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IGNyZWF0ZU1pc3NpbmdGaWVsZEVycm9yKCduYW1lJyk7XG4gICAgfVxuICAgIGlmICghdmVyc2lvbikge1xuICAgICAgdGhyb3cgY3JlYXRlTWlzc2luZ0ZpZWxkRXJyb3IoJ3ZlcnNpb24nKTtcbiAgICB9XG4gICAgaWYgKCFhcHBpdW0pIHtcbiAgICAgIHRocm93IGNyZWF0ZU1pc3NpbmdGaWVsZEVycm9yKCdhcHBpdW0nKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzKGFwcGl1bSwgaW5zdGFsbFNwZWMpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRm9yIGFueSBgcGFja2FnZS5qc29uYCBmaWVsZHMgd2hpY2ggYSBwYXJ0aWN1bGFyIHR5cGUgb2YgZXh0ZW5zaW9uIHJlcXVpcmVzLCB2YWxpZGF0ZSB0aGVcbiAgICogcHJlc2VuY2UgYW5kIGZvcm0gb2YgdGhvc2UgZmllbGRzIG9uIHRoZSBgcGFja2FnZS5qc29uYCBkYXRhLCB0aHJvd2luZyBhbiBlcnJvciBpZiBhbnl0aGluZyBpc1xuICAgKiBhbWlzcy5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRNZXRhZGF0YTxFeHRUeXBlPn0gZXh0TWV0YWRhdGEgLSB0aGUgZGF0YSBpbiB0aGUgXCJhcHBpdW1cIiBmaWVsZCBvZiBgcGFja2FnZS5qc29uYCBmb3IgYW4gZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIEV4dGVuc2lvbiBuYW1lL3NwZWNcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICB2YWxpZGF0ZUV4dGVuc2lvbkZpZWxkcyhleHRNZXRhZGF0YSwgaW5zdGFsbFNwZWMpIHtcbiAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKCdNdXN0IGJlIGltcGxlbWVudGVkIGluIGZpbmFsIGNsYXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogVW5pbnN0YWxsIGFuIGV4dGVuc2lvbi5cbiAgICpcbiAgICogRmlyc3QgdHJpZXMgdG8gZG8gdGhpcyB2aWEgYG5wbSB1bmluc3RhbGxgLCBidXQgaWYgdGhhdCBmYWlscywganVzdCBgcm0gLXJmYCdzIHRoZSBleHRlbnNpb24gZGlyLlxuICAgKlxuICAgKiBXaWxsIG9ubHkgcmVtb3ZlIHRoZSBleHRlbnNpb24gZnJvbSB0aGUgbWFuaWZlc3QgaWYgaXQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7VW5pbnN0YWxsT3B0c30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dFJlY29yZDxFeHRUeXBlPj59IG1hcCBvZiBhbGwgaW5zdGFsbGVkIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YSAod2l0aG91dCB0aGUgZXh0ZW5zaW9uIGp1c3QgdW5pbnN0YWxsZWQpXG4gICAqL1xuICBhc3luYyBfdW5pbnN0YWxsKHtpbnN0YWxsU3BlY30pIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKGluc3RhbGxTcGVjKSkge1xuICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRmF0YWxFcnJvcihcbiAgICAgICAgYENhbid0IHVuaW5zdGFsbCAke3RoaXMudHlwZX0gJyR7aW5zdGFsbFNwZWN9JzsgaXQgaXMgbm90IGluc3RhbGxlZGBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHBrZ05hbWUgPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2luc3RhbGxTcGVjXS5wa2dOYW1lO1xuICAgIGF3YWl0IG5wbS51bmluc3RhbGxQYWNrYWdlKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUpO1xuICAgIGF3YWl0IHRoaXMuY29uZmlnLnJlbW92ZUV4dGVuc2lvbihpbnN0YWxsU3BlYyk7XG4gICAgdGhpcy5sb2cub2soYFN1Y2Nlc3NmdWxseSB1bmluc3RhbGxlZCAke3RoaXMudHlwZX0gJyR7aW5zdGFsbFNwZWN9J2AuZ3JlZW4pO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgdG8gdXBkYXRlIG9uZSBvciBtb3JlIGRyaXZlcnMgdXNpbmcgTlBNXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVXBkYXRlT3B0c30gdXBkYXRlU3BlY1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dGVuc2lvblVwZGF0ZVJlc3VsdD59XG4gICAqL1xuICBhc3luYyBfdXBkYXRlKHtpbnN0YWxsU3BlYywgdW5zYWZlfSkge1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUFsbCA9IGluc3RhbGxTcGVjID09PSBVUERBVEVfQUxMO1xuICAgIC8vIGlmIHdlJ3JlIHNwZWNpZmljYWxseSByZXF1ZXN0aW5nIGFuIHVwZGF0ZSBmb3IgYW4gZXh0ZW5zaW9uLCBtYWtlIHN1cmUgaXQncyBpbnN0YWxsZWRcbiAgICBpZiAoIXNob3VsZFVwZGF0ZUFsbCAmJiAhdGhpcy5jb25maWcuaXNJbnN0YWxsZWQoaW5zdGFsbFNwZWMpKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKFxuICAgICAgICBgVGhlICR7dGhpcy50eXBlfSBcIiR7aW5zdGFsbFNwZWN9XCIgd2FzIG5vdCBpbnN0YWxsZWQsIHNvIGNhbid0IGJlIHVwZGF0ZWRgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleHRzVG9VcGRhdGUgPSBzaG91bGRVcGRhdGVBbGxcbiAgICAgID8gT2JqZWN0LmtleXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucylcbiAgICAgIDogW2luc3RhbGxTcGVjXTtcblxuICAgIC8vICdlcnJvcnMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgZXJyb3Igb2JqZWN0cyBhcyB2YWx1ZXNcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsRXJyb3I+fSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IHt9O1xuXG4gICAgLy8gJ3VwZGF0ZXMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgdXBkYXRlIG9iamVjdHMgYXMgdmFsdWVzLCB3aGVyZSBhbiB1cGRhdGVcbiAgICAvLyBvYmplY3QgaXMgb2YgdGhlIGZvcm0ge2Zyb206IHZlcnNpb25TdHJpbmcsIHRvOiB2ZXJzaW9uU3RyaW5nfVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxVcGRhdGVSZXBvcnQ+fSAqL1xuICAgIGNvbnN0IHVwZGF0ZXMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgZSBvZiBleHRzVG9VcGRhdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBgQ2hlY2tpbmcgaWYgJHt0aGlzLnR5cGV9ICcke2V9JyBpcyB1cGRhdGFibGVgLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZV0uaW5zdGFsbFR5cGUgIT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RVcGRhdGFibGVFcnJvcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZSA9IGF3YWl0IHNwaW5XaXRoKFxuICAgICAgICAgIHRoaXMuaXNKc29uT3V0cHV0LFxuICAgICAgICAgIGBDaGVja2luZyBpZiAke3RoaXMudHlwZX0gJyR7ZX0nIG5lZWRzIGFuIHVwZGF0ZWAsXG4gICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlID0gYXdhaXQgdGhpcy5jaGVja0ZvckV4dGVuc2lvblVwZGF0ZShlKTtcbiAgICAgICAgICAgIGlmICghKHVwZGF0ZS5zYWZlVXBkYXRlIHx8IHVwZGF0ZS51bnNhZmVVcGRhdGUpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBOb1VwZGF0ZXNBdmFpbGFibGVFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGlmICghdW5zYWZlICYmICF1cGRhdGUuc2FmZVVwZGF0ZSkge1xuICAgICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgICAgICBgVGhlICR7dGhpcy50eXBlfSAnJHtlfScgaGFzIGEgbWFqb3IgcmV2aXNpb24gdXBkYXRlIGAgK1xuICAgICAgICAgICAgICBgKCR7dXBkYXRlLmN1cnJlbnR9ID0+ICR7dXBkYXRlLnVuc2FmZVVwZGF0ZX0pLCB3aGljaCBjb3VsZCBpbmNsdWRlIGAgK1xuICAgICAgICAgICAgICBgYnJlYWtpbmcgY2hhbmdlcy4gSWYgeW91IHdhbnQgdG8gYXBwbHkgdGhpcyB1cGRhdGUsIHJlLXJ1biB3aXRoIC0tdW5zYWZlYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlVmVyID0gdW5zYWZlICYmIHVwZGF0ZS51bnNhZmVVcGRhdGUgPyB1cGRhdGUudW5zYWZlVXBkYXRlIDogdXBkYXRlLnNhZmVVcGRhdGU7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKFxuICAgICAgICAgIHRoaXMuaXNKc29uT3V0cHV0LFxuICAgICAgICAgIGBVcGRhdGluZyBkcml2ZXIgJyR7ZX0nIGZyb20gJHt1cGRhdGUuY3VycmVudH0gdG8gJHt1cGRhdGVWZXJ9YCxcbiAgICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnVwZGF0ZUV4dGVuc2lvbihlLCB1cGRhdGVWZXIpXG4gICAgICAgICk7XG4gICAgICAgIHVwZGF0ZXNbZV0gPSB7ZnJvbTogdXBkYXRlLmN1cnJlbnQsIHRvOiB1cGRhdGVWZXJ9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGVycm9yc1tlXSA9IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxvZy5pbmZvKCdVcGRhdGUgcmVwb3J0OicpO1xuXG4gICAgZm9yIChjb25zdCBbZSwgdXBkYXRlXSBvZiBfLnRvUGFpcnModXBkYXRlcykpIHtcbiAgICAgIHRoaXMubG9nLm9rKGAgIC0gJHt0aGlzLnR5cGV9ICR7ZX0gdXBkYXRlZDogJHt1cGRhdGUuZnJvbX0gPT4gJHt1cGRhdGUudG99YC5ncmVlbik7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZSwgZXJyXSBvZiBfLnRvUGFpcnMoZXJyb3JzKSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdFVwZGF0YWJsZUVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oXG4gICAgICAgICAgYCAgLSAnJHtlfScgd2FzIG5vdCBpbnN0YWxsZWQgdmlhIG5wbSwgc28gd2UgY291bGQgbm90IGNoZWNrIGAgKyBgZm9yIHVwZGF0ZXNgLnllbGxvd1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBOb1VwZGF0ZXNBdmFpbGFibGVFcnJvcikge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGAgIC0gJyR7ZX0nIGhhZCBubyB1cGRhdGVzIGF2YWlsYWJsZWAueWVsbG93KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSwgbWFrZSBpdCBwb3Agd2l0aCByZWQhXG4gICAgICAgIHRoaXMubG9nLmVycm9yKGAgIC0gJyR7ZX0nIGZhaWxlZCB0byB1cGRhdGU6ICR7ZXJyfWAucmVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt1cGRhdGVzLCBlcnJvcnN9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGFuIGV4dGVuc2lvbiBuYW1lLCBmaWd1cmUgb3V0IHdoYXQgaXRzIGhpZ2hlc3QgcG9zc2libGUgdmVyc2lvbiB1cGdyYWRlIGlzLCBhbmQgYWxzbyB0aGVcbiAgICogaGlnaGVzdCBwb3NzaWJsZSBzYWZlIHVwZ3JhZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHQgLSBuYW1lIG9mIGV4dGVuc2lvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFBvc3NpYmxlVXBkYXRlcz59XG4gICAqL1xuICBhc3luYyBjaGVja0ZvckV4dGVuc2lvblVwZGF0ZShleHQpIHtcbiAgICAvLyBUT0RPIGRlY2lkZSBob3cgd2Ugd2FudCB0byBoYW5kbGUgYmV0YSB2ZXJzaW9ucz9cbiAgICAvLyB0aGlzIGlzIGEgaGVscGVyIG1ldGhvZCwgJ2V4dCcgaXMgYXNzdW1lZCB0byBhbHJlYWR5IGJlIGluc3RhbGxlZCBoZXJlLCBhbmQgb2YgdGhlIG5wbVxuICAgIC8vIGluc3RhbGwgdHlwZVxuICAgIGNvbnN0IHt2ZXJzaW9uLCBwa2dOYW1lfSA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0XTtcbiAgICBsZXQgdW5zYWZlVXBkYXRlID0gYXdhaXQgbnBtLmdldExhdGVzdFZlcnNpb24odGhpcy5jb25maWcuYXBwaXVtSG9tZSwgcGtnTmFtZSk7XG4gICAgbGV0IHNhZmVVcGRhdGUgPSBhd2FpdCBucG0uZ2V0TGF0ZXN0U2FmZVVwZ3JhZGVWZXJzaW9uKFxuICAgICAgdGhpcy5jb25maWcuYXBwaXVtSG9tZSxcbiAgICAgIHBrZ05hbWUsXG4gICAgICB2ZXJzaW9uXG4gICAgKTtcbiAgICBpZiAoIXV0aWwuY29tcGFyZVZlcnNpb25zKHVuc2FmZVVwZGF0ZSwgJz4nLCB2ZXJzaW9uKSkge1xuICAgICAgLy8gdGhlIGxhdGVzdCB2ZXJzaW9uIGlzIG5vdCBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgdmVyc2lvbiwgc28gdGhlcmUncyBubyBwb3NzaWJsZSB1cGRhdGVcbiAgICAgIHVuc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgICBzYWZlVXBkYXRlID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHVuc2FmZVVwZGF0ZSAmJiB1bnNhZmVVcGRhdGUgPT09IHNhZmVVcGRhdGUpIHtcbiAgICAgIC8vIHRoZSBsYXRlc3QgdXBkYXRlIGlzIHRoZSBzYW1lIGFzIHRoZSBzYWZlIHVwZGF0ZSwgd2hpY2ggbWVhbnMgaXQncyBub3QgYWN0dWFsbHkgdW5zYWZlXG4gICAgICB1bnNhZmVVcGRhdGUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoc2FmZVVwZGF0ZSAmJiAhdXRpbC5jb21wYXJlVmVyc2lvbnMoc2FmZVVwZGF0ZSwgJz4nLCB2ZXJzaW9uKSkge1xuICAgICAgLy8gZXZlbiB0aGUgc2FmZSB1cGRhdGUgaXMgbm90IGxhdGVyIHRoYW4gdGhlIGN1cnJlbnQsIHNvIGl0IGlzIG5vdCBhY3R1YWxseSBhbiB1cGRhdGVcbiAgICAgIHNhZmVVcGRhdGUgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge2N1cnJlbnQ6IHZlcnNpb24sIHNhZmVVcGRhdGUsIHVuc2FmZVVwZGF0ZX07XG4gIH1cblxuICAvKipcbiAgICogQWN0dWFsbHkgdXBkYXRlIGFuIGV4dGVuc2lvbiBpbnN0YWxsZWQgYnkgTlBNLCB1c2luZyB0aGUgTlBNIGNsaS4gQW5kIHVwZGF0ZSB0aGUgaW5zdGFsbGF0aW9uXG4gICAqIG1hbmlmZXN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5zdGFsbFNwZWMgLSBuYW1lIG9mIGV4dGVuc2lvbiB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSB2ZXJzaW9uIHN0cmluZyBpZGVudGlmaWVyIHRvIHVwZGF0ZSBleHRlbnNpb24gdG9cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB1cGRhdGVFeHRlbnNpb24oaW5zdGFsbFNwZWMsIHZlcnNpb24pIHtcbiAgICBjb25zdCB7cGtnTmFtZX0gPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2luc3RhbGxTcGVjXTtcbiAgICBjb25zdCBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKHtcbiAgICAgIGluc3RhbGxTcGVjLFxuICAgICAgcGtnTmFtZSxcbiAgICAgIHBrZ1ZlcjogdmVyc2lvbixcbiAgICB9KTtcbiAgICBkZWxldGUgZXh0RGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8gKGAke3RoaXMudHlwZX1OYW1lYCldO1xuICAgIGF3YWl0IHRoaXMuY29uZmlnLnVwZGF0ZUV4dGVuc2lvbihpbnN0YWxsU3BlYywgZXh0RGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIHNjcmlwdCBjYWNoZWQgaW5zaWRlIHRoZSBcInNjcmlwdHNcIiBmaWVsZCB1bmRlciBcImFwcGl1bVwiXG4gICAqIGluc2lkZSBvZiB0aGUgZHJpdmVyL3BsdWdpbnMgXCJwYWNrYWdlLmpzb25cIiBmaWxlLiBXaWxsIHRocm93XG4gICAqIGFuIGVycm9yIGlmIHRoZSBkcml2ZXIvcGx1Z2luIGRvZXMgbm90IGNvbnRhaW4gYSBcInNjcmlwdHNcIiBmaWVsZFxuICAgKiB1bmRlcm5lYXRoIHRoZSBcImFwcGl1bVwiIGZpZWxkIGluIGl0cyBwYWNrYWdlLmpzb24sIGlmIHRoZVxuICAgKiBcInNjcmlwdHNcIiBmaWVsZCBpcyBub3QgYSBwbGFpbiBvYmplY3QsIG9yIGlmIHRoZSBzY3JpcHROYW1lIGlzXG4gICAqIG5vdCBmb3VuZCB3aXRoaW4gXCJzY3JpcHRzXCIgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge1J1bk9wdGlvbnN9IG9wdHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxSdW5PdXRwdXQ+fVxuICAgKi9cbiAgYXN5bmMgX3J1bih7aW5zdGFsbFNwZWMsIHNjcmlwdE5hbWV9KSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChpbnN0YWxsU3BlYykpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gXCIke2luc3RhbGxTcGVjfVwiIGlzIG5vdCBpbnN0YWxsZWRgKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRDb25maWcgPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2luc3RhbGxTcGVjXTtcblxuICAgIC8vIG5vdGU6IFRTIGNhbm5vdCB1bmRlcnN0YW5kIHRoYXQgXy5oYXMoKSBpcyBhIHR5cGUgZ3VhcmRcbiAgICBpZiAoIWV4dENvbmZpZy5zY3JpcHRzKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKFxuICAgICAgICBgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtpbnN0YWxsU3BlY30nIGRvZXMgbm90IGNvbnRhaW4gdGhlIGAgK1xuICAgICAgICAgIGBcInNjcmlwdHNcIiBmaWVsZCB1bmRlcm5lYXRoIHRoZSBcImFwcGl1bVwiIGZpZWxkIGluIGl0cyBwYWNrYWdlLmpzb25gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dFNjcmlwdHMgPSBleHRDb25maWcuc2NyaXB0cztcblxuICAgIGlmICghXy5pc1BsYWluT2JqZWN0KGV4dFNjcmlwdHMpKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKFxuICAgICAgICBgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtpbnN0YWxsU3BlY30nIFwic2NyaXB0c1wiIGZpZWxkIG11c3QgYmUgYSBwbGFpbiBvYmplY3RgXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghXy5oYXMoZXh0U2NyaXB0cywgc2NyaXB0TmFtZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgIGBUaGUgJHt0aGlzLnR5cGV9IG5hbWVkICcke2luc3RhbGxTcGVjfScgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc2NyaXB0OiAnJHtzY3JpcHROYW1lfSdgXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBTdWJQcm9jZXNzKHByb2Nlc3MuZXhlY1BhdGgsIFtleHRTY3JpcHRzW3NjcmlwdE5hbWVdXSwge1xuICAgICAgY3dkOiB0aGlzLmNvbmZpZy5nZXRJbnN0YWxsUGF0aChpbnN0YWxsU3BlYyksXG4gICAgfSk7XG5cbiAgICBjb25zdCBvdXRwdXQgPSBuZXcgUmluZ0J1ZmZlcig1MCk7XG5cbiAgICBydW5uZXIub24oJ3N0cmVhbS1saW5lJywgKGxpbmUpID0+IHtcbiAgICAgIG91dHB1dC5lbnF1ZXVlKGxpbmUpO1xuICAgICAgdGhpcy5sb2cubG9nKGxpbmUpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgcnVubmVyLnN0YXJ0KDApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJ1bm5lci5qb2luKCk7XG4gICAgICB0aGlzLmxvZy5vayhgJHtzY3JpcHROYW1lfSBzdWNjZXNzZnVsbHkgcmFuYC5ncmVlbik7XG4gICAgICByZXR1cm4ge291dHB1dDogb3V0cHV0LmdldEJ1ZmYoKX07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvcihgRW5jb3VudGVyZWQgYW4gZXJyb3Igd2hlbiBydW5uaW5nICcke3NjcmlwdE5hbWV9JzogJHtlcnIubWVzc2FnZX1gLnJlZCk7XG4gICAgICByZXR1cm4ge2Vycm9yOiBlcnIubWVzc2FnZSwgb3V0cHV0OiBvdXRwdXQuZ2V0QnVmZigpfTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRXh0ZW5zaW9uQ29tbWFuZDtcbmV4cG9ydCB7RXh0ZW5zaW9uQ29tbWFuZH07XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZH0gY29uc3RydWN0b3JcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYgRXh0ZW5zaW9uQ29tbWFuZE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7RXh0ZW5zaW9uQ29uZmlnPEV4dFR5cGU+fSBjb25maWcgLSB0aGUgYERyaXZlckNvbmZpZ2Agb3IgYFBsdWdpbkNvbmZpZ2AgaW5zdGFuY2UgdXNlZCBmb3IgdGhpcyBjb21tYW5kXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGpzb24gLSB3aGV0aGVyIHRoZSBvdXRwdXQgb2YgdGhpcyBjb21tYW5kIHNob3VsZCBiZSBKU09OIG9yIHRleHRcbiAqL1xuXG4vKipcbiAqIEV4dHJhIHN0dWZmIGFib3V0IGV4dGVuc2lvbnM7IHVzZWQgaW5kaXJlY3RseSBieSB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQubGlzdH0uXG4gKlxuICogQHR5cGVkZWYgRXh0ZW5zaW9uTWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaW5zdGFsbGVkIC0gSWYgYHRydWVgLCB0aGUgZXh0ZW5zaW9uIGlzIGluc3RhbGxlZFxuICogQHByb3BlcnR5IHtzdHJpbmc/fSB1cGRhdGVWZXJzaW9uIC0gSWYgdGhlIGV4dGVuc2lvbiBpcyBpbnN0YWxsZWQsIHRoZSB2ZXJzaW9uIGl0IGNhbiBiZSB1cGRhdGVkIHRvXG4gKiBAcHJvcGVydHkge3N0cmluZz99IHVuc2FmZVVwZGF0ZVZlcnNpb24gLSBTYW1lIGFzIGFib3ZlLCBidXQgYSBtYWpvciB2ZXJzaW9uIGJ1bXBcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXBUb0RhdGUgLSBJZiB0aGUgZXh0ZW5zaW9uIGlzIGluc3RhbGxlZCBhbmQgdGhlIGxhdGVzdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkV4dGVuc2lvblR5cGV9IEV4dGVuc2lvblR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJUeXBlfSBEcml2ZXJUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuUGx1Z2luVHlwZX0gUGx1Z2luVHlwZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5FeHRSZWNvcmQ8RXh0VHlwZT59IEV4dFJlY29yZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZycpLkV4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn0gRXh0ZW5zaW9uQ29uZmlnXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkV4dE1ldGFkYXRhPEV4dFR5cGU+fSBFeHRNZXRhZGF0YVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5FeHRNYW5pZmVzdDxFeHRUeXBlPn0gRXh0TWFuaWZlc3RcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuRXh0UGFja2FnZUpzb248RXh0VHlwZT59IEV4dFBhY2thZ2VKc29uXG4gKi9cblxuLyoqXG4gKiBQb3NzaWJsZSByZXR1cm4gdmFsdWUgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fVxuICogQHR5cGVkZWYgVW5pbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBrZ05hbWVcbiAqIEBwcm9wZXJ0eSB7ZmFsc2V9IGluc3RhbGxlZFxuICovXG5cbi8qKlxuICogUG9zc2libGUgcmV0dXJuIHZhbHVlIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQubGlzdH1cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkludGVybmFsTWV0YWRhdGEgJiBFeHRlbnNpb25NZXRhZGF0YX0gSW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGFcbiAqL1xuXG4vKipcbiAqIFJldHVybiB2YWx1ZSBvZiB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQubGlzdH0uXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZyxJbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YXxVbmluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhPn0gRXh0ZW5zaW9uTGlzdERhdGFcbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fcnVufS5cbiAqIEB0eXBlZGVmIFJ1bk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0byBydW4gYSBzY3JpcHQgZnJvbVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNjcmlwdE5hbWUgLSBuYW1lIG9mIHRoZSBzY3JpcHQgdG8gcnVuXG4gKi9cblxuLyoqXG4gKiBSZXR1cm4gdmFsdWUgb2Yge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl9ydW59XG4gKlxuICogQHR5cGVkZWYgUnVuT3V0cHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Vycm9yXSAtIGVycm9yIG1lc3NhZ2UgaWYgc2NyaXB0IHJhbiB1bnN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlIHVuZGVmaW5lZFxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gb3V0cHV0IC0gc2NyaXB0IG91dHB1dFxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl91cGRhdGV9LlxuICogQHR5cGVkZWYgRXh0ZW5zaW9uVXBkYXRlT3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGluc3RhbGxTcGVjIC0gdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0byB1cGRhdGVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdW5zYWZlIC0gaWYgdHJ1ZSwgd2lsbCBwZXJmb3JtIHVuc2FmZSB1cGRhdGVzIHBhc3QgbWFqb3IgcmV2aXNpb24gYm91bmRhcmllc1xuICovXG5cbi8qKlxuICogUmV0dXJuIHZhbHVlIG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fdXBkYXRlfS5cbiAqIEB0eXBlZGVmIEV4dGVuc2lvblVwZGF0ZVJlc3VsdFxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLEVycm9yPn0gZXJyb3JzIC0gbWFwIG9mIGV4dCBuYW1lcyB0byBlcnJvciBvYmplY3RzXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsVXBkYXRlUmVwb3J0Pn0gdXBkYXRlcyAtIG1hcCBvZiBleHQgbmFtZXMgdG8ge0BsaW5rY29kZSBVcGRhdGVSZXBvcnR9c1xuICovXG5cbi8qKlxuICogUGFydCBvZiByZXN1bHQgb2Yge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl91cGRhdGV9LlxuICogQHR5cGVkZWYgVXBkYXRlUmVwb3J0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gZnJvbSAtIHZlcnNpb24gdGhlIGV4dGVuc2lvbiB3YXMgdXBkYXRlZCBmcm9tXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdG8gLSB2ZXJzaW9uIHRoZSBleHRlbnNpb24gd2FzIHVwZGF0ZWQgdG9cbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fdW5pbnN0YWxsfS5cbiAqIEB0eXBlZGVmIFVuaW5zdGFsbE9wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIHRoZSBuYW1lIG9yIHNwZWMgb2YgYW4gZXh0ZW5zaW9uIHRvIHVuaW5zdGFsbFxuICovXG5cbi8qKlxuICogVXNlZCBieSB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuZ2V0UG9zdEluc3RhbGxUZXh0fVxuICogQHR5cGVkZWYgRXh0ZW5zaW9uQXJnc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dE5hbWUgLSB0aGUgbmFtZSBvZiBhbiBleHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBleHREYXRhIC0gdGhlIGRhdGEgZm9yIGFuIGluc3RhbGxlZCBleHRlbnNpb25cbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5pbnN0YWxsVmlhTnBtfVxuICogQHR5cGVkZWYgSW5zdGFsbFZpYU5wbUFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIHRoZSBuYW1lIG9yIHNwZWMgb2YgYW4gZXh0ZW5zaW9uIHRvIGluc3RhbGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwa2dOYW1lIC0gdGhlIE5QTSBwYWNrYWdlIG5hbWUgb2YgdGhlIGV4dGVuc2lvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwa2dWZXJdIC0gdGhlIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIE5QTSBwYWNrYWdlXG4gKi9cblxuLyoqXG4gKiBPYmplY3QgcmV0dXJuZWQgYnkge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlfVxuICogQHR5cGVkZWYgUG9zc2libGVVcGRhdGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY3VycmVudCAtIGN1cnJlbnQgdmVyc2lvblxuICogQHByb3BlcnR5IHtzdHJpbmc/fSBzYWZlVXBkYXRlIC0gdmVyc2lvbiB3ZSBjYW4gc2FmZWx5IHVwZGF0ZSB0byBpZiBpdCBleGlzdHMsIG9yIG51bGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gdW5zYWZlVXBkYXRlIC0gdmVyc2lvbiB3ZSBjYW4gdW5zYWZlbHkgdXBkYXRlIHRvIGlmIGl0IGV4aXN0cywgb3IgbnVsbFxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl9pbnN0YWxsfVxuICogQHR5cGVkZWYgSW5zdGFsbEFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIHRoZSBuYW1lIG9yIHNwZWMgb2YgYW4gZXh0ZW5zaW9uIHRvIGluc3RhbGxcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5JbnN0YWxsVHlwZX0gaW5zdGFsbFR5cGUgLSBob3cgdG8gaW5zdGFsbCB0aGlzIGV4dGVuc2lvbi4gT25lIG9mIHRoZSBJTlNUQUxMX1RZUEVTXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BhY2thZ2VOYW1lXSAtIGZvciBnaXQvZ2l0aHViIGluc3RhbGxzLCB0aGUgZXh0ZW5zaW9uIG5vZGUgcGFja2FnZSBuYW1lXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5lZCBieSB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuZ2V0RXh0ZW5zaW9uRmllbGRzfVxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7RXh0TWV0YWRhdGE8RXh0VHlwZT4gJiB7IHBrZ05hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCBhcHBpdW1WZXJzaW9uOiBzdHJpbmcgfSAmIGltcG9ydCgnYXBwaXVtL3R5cGVzJykuQ29tbW9uRXh0TWV0YWRhdGF9IEV4dGVuc2lvbkZpZWxkc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7RXh0VHlwZSBleHRlbmRzIERyaXZlclR5cGUgPyB0eXBlb2YgaW1wb3J0KCcuLi9jb25zdGFudHMnKS5LTk9XTl9EUklWRVJTIDogRXh0VHlwZSBleHRlbmRzIFBsdWdpblR5cGUgPyB0eXBlb2YgaW1wb3J0KCcuLi9jb25zdGFudHMnKS5LTk9XTl9QTFVHSU5TIDogbmV2ZXJ9IEtub3duRXh0ZW5zaW9uc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGlzdE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc2hvd0luc3RhbGxlZCAtIHdoZXRoZXIgc2hvdWxkIHNob3cgb25seSBpbnN0YWxsZWQgZXh0ZW5zaW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBzaG93VXBkYXRlcyAtIHdoZXRoZXIgc2hvdWxkIHNob3cgYXZhaWxhYmxlIHVwZGF0ZXNcbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQU1BOztBQUVBLE1BQU1BLFVBQVUsR0FBRyxXQUFuQjs7QUFFQSxNQUFNQyxpQkFBTixTQUFnQ0MsS0FBaEMsQ0FBc0M7O0FBQ3RDLE1BQU1DLHVCQUFOLFNBQXNDRCxLQUF0QyxDQUE0Qzs7QUFLNUMsTUFBTUUsZ0JBQU4sQ0FBdUI7RUFLckJDLE1BQU07RUFNTkMsZUFBZTtFQU1mQyxZQUFZOztFQU1aQyxXQUFXLENB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
|