appium 2.0.0-beta.4 → 2.0.0-beta.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -11
- package/build/lib/appium.d.ts +204 -0
- package/build/lib/appium.d.ts.map +1 -0
- package/build/lib/appium.js +256 -131
- package/build/lib/cli/args.d.ts +17 -0
- package/build/lib/cli/args.d.ts.map +1 -0
- package/build/lib/cli/args.js +96 -282
- package/build/lib/cli/driver-command.d.ts +37 -0
- package/build/lib/cli/driver-command.d.ts.map +1 -0
- package/build/lib/cli/driver-command.js +27 -18
- package/build/lib/cli/extension-command.d.ts +376 -0
- package/build/lib/cli/extension-command.d.ts.map +1 -0
- package/build/lib/cli/extension-command.js +287 -156
- package/build/lib/cli/extension.d.ts +22 -0
- package/build/lib/cli/extension.d.ts.map +1 -0
- package/build/lib/cli/extension.js +31 -17
- package/build/lib/cli/parser.d.ts +84 -0
- package/build/lib/cli/parser.d.ts.map +1 -0
- package/build/lib/cli/parser.js +164 -94
- package/build/lib/cli/plugin-command.d.ts +34 -0
- package/build/lib/cli/plugin-command.d.ts.map +1 -0
- package/build/lib/cli/plugin-command.js +26 -19
- package/build/lib/cli/utils.d.ts +29 -0
- package/build/lib/cli/utils.d.ts.map +1 -0
- package/build/lib/cli/utils.js +27 -3
- package/build/lib/config-file.d.ts +100 -0
- package/build/lib/config-file.d.ts.map +1 -0
- package/build/lib/config-file.js +136 -0
- package/build/lib/config.d.ts +49 -0
- package/build/lib/config.d.ts.map +1 -0
- package/build/lib/config.js +119 -96
- package/build/lib/constants.d.ts +48 -0
- package/build/lib/constants.d.ts.map +1 -0
- package/build/lib/constants.js +60 -0
- package/build/lib/extension/driver-config.d.ts +81 -0
- package/build/lib/extension/driver-config.d.ts.map +1 -0
- package/build/lib/extension/driver-config.js +177 -0
- package/build/lib/extension/extension-config.d.ts +242 -0
- package/build/lib/extension/extension-config.d.ts.map +1 -0
- package/build/lib/extension/extension-config.js +436 -0
- package/build/lib/extension/index.d.ts +48 -0
- package/build/lib/extension/index.d.ts.map +1 -0
- package/build/lib/extension/index.js +75 -0
- package/build/lib/extension/manifest.d.ts +174 -0
- package/build/lib/extension/manifest.d.ts.map +1 -0
- package/build/lib/extension/manifest.js +256 -0
- package/build/lib/extension/package-changed.d.ts +11 -0
- package/build/lib/extension/package-changed.d.ts.map +1 -0
- package/build/lib/extension/package-changed.js +66 -0
- package/build/lib/extension/plugin-config.d.ts +57 -0
- package/build/lib/extension/plugin-config.d.ts.map +1 -0
- package/build/lib/extension/plugin-config.js +78 -0
- package/build/lib/grid-register.d.ts +10 -0
- package/build/lib/grid-register.d.ts.map +1 -0
- package/build/lib/grid-register.js +21 -25
- package/build/lib/logger.d.ts +3 -0
- package/build/lib/logger.d.ts.map +1 -0
- package/build/lib/logger.js +4 -6
- package/build/lib/logsink.d.ts +4 -0
- package/build/lib/logsink.d.ts.map +1 -0
- package/build/lib/logsink.js +14 -17
- package/build/lib/main.d.ts +55 -0
- package/build/lib/main.d.ts.map +1 -0
- package/build/lib/main.js +183 -91
- package/build/lib/schema/arg-spec.d.ts +143 -0
- package/build/lib/schema/arg-spec.d.ts.map +1 -0
- package/build/lib/schema/arg-spec.js +119 -0
- package/build/lib/schema/cli-args.d.ts +19 -0
- package/build/lib/schema/cli-args.d.ts.map +1 -0
- package/build/lib/schema/cli-args.js +178 -0
- package/build/lib/schema/cli-transformers.d.ts +5 -0
- package/build/lib/schema/cli-transformers.d.ts.map +1 -0
- package/build/lib/schema/cli-transformers.js +74 -0
- package/build/lib/schema/index.d.ts +3 -0
- package/build/lib/schema/index.d.ts.map +1 -0
- package/build/lib/schema/index.js +34 -0
- package/build/lib/schema/keywords.d.ts +24 -0
- package/build/lib/schema/keywords.d.ts.map +1 -0
- package/build/lib/schema/keywords.js +70 -0
- package/build/lib/schema/schema.d.ts +259 -0
- package/build/lib/schema/schema.d.ts.map +1 -0
- package/build/lib/schema/schema.js +450 -0
- package/build/lib/utils.d.ts +66 -0
- package/build/lib/utils.d.ts.map +1 -0
- package/build/lib/utils.js +35 -139
- package/build/tsconfig.tsbuildinfo +1 -0
- package/build/types/appium-manifest.d.ts +59 -0
- package/build/types/appium-manifest.d.ts.map +1 -0
- package/build/types/cli.d.ts +123 -0
- package/build/types/cli.d.ts.map +1 -0
- package/build/types/extension-manifest.d.ts +55 -0
- package/build/types/extension-manifest.d.ts.map +1 -0
- package/build/types/index.d.ts +16 -0
- package/build/types/index.d.ts.map +1 -0
- package/driver.d.ts +1 -0
- package/driver.js +14 -0
- package/index.js +11 -0
- package/lib/appium.js +520 -186
- package/lib/cli/args.js +267 -422
- package/lib/cli/driver-command.js +58 -23
- package/lib/cli/extension-command.js +613 -260
- package/lib/cli/extension.js +47 -17
- package/lib/cli/parser.js +263 -83
- package/lib/cli/plugin-command.js +48 -20
- package/lib/cli/utils.js +24 -10
- package/lib/config-file.js +219 -0
- package/lib/config.js +243 -110
- package/lib/constants.js +69 -0
- package/lib/extension/driver-config.js +249 -0
- package/lib/extension/extension-config.js +677 -0
- package/lib/extension/index.js +116 -0
- package/lib/extension/manifest.js +475 -0
- package/lib/extension/package-changed.js +64 -0
- package/lib/extension/plugin-config.js +113 -0
- package/lib/grid-register.js +49 -35
- package/lib/logger.js +1 -2
- package/lib/logsink.js +38 -33
- package/lib/main.js +308 -100
- package/lib/schema/arg-spec.js +229 -0
- package/lib/schema/cli-args.js +238 -0
- package/lib/schema/cli-transformers.js +115 -0
- package/lib/schema/index.js +2 -0
- package/lib/schema/keywords.js +136 -0
- package/lib/schema/schema.js +717 -0
- package/lib/utils.js +121 -140
- package/package.json +85 -85
- package/plugin.d.ts +1 -0
- package/plugin.js +13 -0
- package/scripts/autoinstall-extensions.js +185 -0
- package/support.d.ts +1 -0
- package/support.js +13 -0
- package/test.d.ts +7 -0
- package/test.js +13 -0
- package/types/appium-manifest.ts +73 -0
- package/types/cli.ts +150 -0
- package/types/extension-manifest.ts +64 -0
- package/types/index.ts +21 -0
- package/CHANGELOG.md +0 -3515
- package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
- package/build/lib/cli/npm.js +0 -206
- package/build/lib/cli/parser-helpers.js +0 -82
- package/build/lib/driver-config.js +0 -77
- package/build/lib/drivers.js +0 -96
- package/build/lib/extension-config.js +0 -253
- package/build/lib/plugin-config.js +0 -59
- package/build/lib/plugins.js +0 -14
- package/lib/cli/npm.js +0 -183
- package/lib/cli/parser-helpers.js +0 -79
- package/lib/driver-config.js +0 -46
- package/lib/drivers.js +0 -81
- package/lib/extension-config.js +0 -209
- package/lib/plugin-config.js +0 -34
- package/lib/plugins.js +0 -10
|
@@ -5,21 +5,25 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.default = void 0;
|
|
8
|
+
exports.default = exports.ExtensionCommand = void 0;
|
|
9
9
|
|
|
10
10
|
require("source-map-support/register");
|
|
11
11
|
|
|
12
|
-
var
|
|
12
|
+
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
13
13
|
|
|
14
|
-
var
|
|
14
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
15
15
|
|
|
16
16
|
var _path = _interopRequireDefault(require("path"));
|
|
17
17
|
|
|
18
|
-
var
|
|
18
|
+
var _support = require("@appium/support");
|
|
19
19
|
|
|
20
20
|
var _utils = require("./utils");
|
|
21
21
|
|
|
22
|
-
var
|
|
22
|
+
var _teen_process = require("teen_process");
|
|
23
|
+
|
|
24
|
+
var _extensionConfig = require("../extension/extension-config");
|
|
25
|
+
|
|
26
|
+
var _packageChanged = require("../extension/package-changed");
|
|
23
27
|
|
|
24
28
|
const UPDATE_ALL = 'installed';
|
|
25
29
|
|
|
@@ -28,23 +32,34 @@ class NotUpdatableError extends Error {}
|
|
|
28
32
|
class NoUpdatesAvailableError extends Error {}
|
|
29
33
|
|
|
30
34
|
class ExtensionCommand {
|
|
35
|
+
config;
|
|
36
|
+
knownExtensions;
|
|
37
|
+
isJsonOutput;
|
|
38
|
+
|
|
31
39
|
constructor({
|
|
32
40
|
config,
|
|
33
|
-
json
|
|
34
|
-
type
|
|
41
|
+
json
|
|
35
42
|
}) {
|
|
36
43
|
this.config = config;
|
|
37
|
-
this.
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
this.
|
|
44
|
+
this.log = new _support.console.CliConsole({
|
|
45
|
+
jsonMode: json
|
|
46
|
+
});
|
|
47
|
+
this.isJsonOutput = Boolean(json);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
get type() {
|
|
51
|
+
return this.config.extensionType;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
_createFatalError(message) {
|
|
55
|
+
return new Error(this.log.decorate(message, 'error'));
|
|
41
56
|
}
|
|
42
57
|
|
|
43
58
|
async execute(args) {
|
|
44
59
|
const cmd = args[`${this.type}Command`];
|
|
45
60
|
|
|
46
|
-
if (!_lodash.default.isFunction(
|
|
47
|
-
throw
|
|
61
|
+
if (!_lodash.default.isFunction(this[cmd])) {
|
|
62
|
+
throw this._createFatalError(`Cannot handle ${this.type} command ${cmd}`);
|
|
48
63
|
}
|
|
49
64
|
|
|
50
65
|
const executeCmd = this[cmd].bind(this);
|
|
@@ -80,12 +95,7 @@ class ExtensionCommand {
|
|
|
80
95
|
}
|
|
81
96
|
|
|
82
97
|
for (const [ext, data] of _lodash.default.toPairs(exts)) {
|
|
83
|
-
|
|
84
|
-
installed,
|
|
85
|
-
installType
|
|
86
|
-
} = data;
|
|
87
|
-
|
|
88
|
-
if (!installed || installType !== _extensionConfig.INSTALL_TYPE_NPM) {
|
|
98
|
+
if (!data.installed || data.installType !== _extensionConfig.INSTALL_TYPE_NPM) {
|
|
89
99
|
continue;
|
|
90
100
|
}
|
|
91
101
|
|
|
@@ -95,127 +105,178 @@ class ExtensionCommand {
|
|
|
95
105
|
data.upToDate = updates.safeUpdate === null && updates.unsafeUpdate === null;
|
|
96
106
|
}
|
|
97
107
|
});
|
|
108
|
+
const listData = exts;
|
|
98
109
|
|
|
99
110
|
if (this.isJsonOutput) {
|
|
100
|
-
return
|
|
111
|
+
return listData;
|
|
101
112
|
}
|
|
102
113
|
|
|
103
|
-
for (const [name, {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
114
|
+
for (const [name, data] of _lodash.default.toPairs(listData)) {
|
|
115
|
+
let installTxt = ' [not installed]'.grey;
|
|
116
|
+
let updateTxt = '';
|
|
117
|
+
let upToDateTxt = '';
|
|
118
|
+
let unsafeUpdateTxt = '';
|
|
119
|
+
|
|
120
|
+
if (data.installed) {
|
|
121
|
+
const {
|
|
122
|
+
installType,
|
|
123
|
+
installSpec,
|
|
124
|
+
updateVersion,
|
|
125
|
+
unsafeUpdateVersion,
|
|
126
|
+
version,
|
|
127
|
+
upToDate
|
|
128
|
+
} = data;
|
|
129
|
+
let typeTxt;
|
|
130
|
+
|
|
131
|
+
switch (installType) {
|
|
132
|
+
case _extensionConfig.INSTALL_TYPE_GIT:
|
|
133
|
+
case _extensionConfig.INSTALL_TYPE_GITHUB:
|
|
134
|
+
typeTxt = `(cloned from ${installSpec})`.yellow;
|
|
135
|
+
break;
|
|
136
|
+
|
|
137
|
+
case _extensionConfig.INSTALL_TYPE_LOCAL:
|
|
138
|
+
typeTxt = `(linked from ${installSpec})`.magenta;
|
|
139
|
+
break;
|
|
140
|
+
|
|
141
|
+
default:
|
|
142
|
+
typeTxt = '(NPM)';
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
installTxt = `@${version.yellow} ${('[installed ' + typeTxt + ']').green}`;
|
|
146
|
+
|
|
147
|
+
if (showUpdates) {
|
|
148
|
+
if (updateVersion) {
|
|
149
|
+
updateTxt = ` [${updateVersion} available]`.magenta;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (upToDate) {
|
|
153
|
+
upToDateTxt = ` [Up to date]`.green;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (unsafeUpdateVersion) {
|
|
157
|
+
unsafeUpdateTxt = ` [${unsafeUpdateVersion} available (potentially unsafe)]`.cyan;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
126
160
|
}
|
|
127
161
|
|
|
128
|
-
|
|
129
|
-
const updateTxt = showUpdates && updateVersion ? ` [${updateVersion} available]`.magenta : '';
|
|
130
|
-
const upToDateTxt = showUpdates && upToDate ? ` [Up to date]`.green : '';
|
|
131
|
-
const unsafeUpdateTxt = showUpdates && unsafeUpdateVersion ? ` [${unsafeUpdateVersion} available (potentially unsafe)]`.cyan : '';
|
|
132
|
-
console.log(`- ${name.yellow}${installTxt}${updateTxt}${upToDateTxt}${unsafeUpdateTxt}`);
|
|
162
|
+
this.log.log(`- ${name.yellow}${installTxt}${updateTxt}${upToDateTxt}${unsafeUpdateTxt}`);
|
|
133
163
|
}
|
|
134
164
|
|
|
135
|
-
return
|
|
165
|
+
return listData;
|
|
136
166
|
}
|
|
137
167
|
|
|
138
|
-
async
|
|
139
|
-
|
|
168
|
+
async _install({
|
|
169
|
+
installSpec,
|
|
140
170
|
installType,
|
|
141
171
|
packageName
|
|
142
172
|
}) {
|
|
143
|
-
(0, _utils.log)(this.isJsonOutput, `Attempting to find and install ${this.type} '${ext}'`);
|
|
144
173
|
let extData;
|
|
145
|
-
let installSpec = ext;
|
|
146
174
|
|
|
147
175
|
if (packageName && [_extensionConfig.INSTALL_TYPE_LOCAL, _extensionConfig.INSTALL_TYPE_NPM].includes(installType)) {
|
|
148
|
-
throw
|
|
176
|
+
throw this._createFatalError(`When using --source=${installType}, cannot also use --package`);
|
|
149
177
|
}
|
|
150
178
|
|
|
151
179
|
if (!packageName && [_extensionConfig.INSTALL_TYPE_GIT, _extensionConfig.INSTALL_TYPE_GITHUB].includes(installType)) {
|
|
152
|
-
throw
|
|
180
|
+
throw this._createFatalError(`When using --source=${installType}, must also use --package`);
|
|
153
181
|
}
|
|
154
182
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
extData.installPath = extData.pkgName;
|
|
160
|
-
} else if (installType === _extensionConfig.INSTALL_TYPE_GITHUB) {
|
|
183
|
+
let installOpts;
|
|
184
|
+
let probableExtName = '';
|
|
185
|
+
|
|
186
|
+
if (installType === _extensionConfig.INSTALL_TYPE_GITHUB) {
|
|
161
187
|
if (installSpec.split('/').length !== 2) {
|
|
162
|
-
throw
|
|
188
|
+
throw this._createFatalError(`Github ${this.type} spec ${installSpec} appeared to be invalid; ` + 'it should be of the form <org>/<repo>');
|
|
163
189
|
}
|
|
164
190
|
|
|
165
|
-
|
|
166
|
-
|
|
191
|
+
installOpts = {
|
|
192
|
+
installSpec,
|
|
167
193
|
pkgName: packageName
|
|
168
|
-
}
|
|
194
|
+
};
|
|
195
|
+
probableExtName = installSpec;
|
|
169
196
|
} else if (installType === _extensionConfig.INSTALL_TYPE_GIT) {
|
|
170
197
|
installSpec = installSpec.replace(/\.git$/, '');
|
|
171
|
-
|
|
172
|
-
|
|
198
|
+
installOpts = {
|
|
199
|
+
installSpec,
|
|
173
200
|
pkgName: packageName
|
|
174
|
-
}
|
|
201
|
+
};
|
|
202
|
+
probableExtName = installSpec;
|
|
175
203
|
} else {
|
|
176
|
-
let
|
|
177
|
-
const splits = installSpec.split('@');
|
|
204
|
+
let pkgName, pkgVer;
|
|
178
205
|
|
|
179
|
-
if (
|
|
180
|
-
|
|
206
|
+
if (installType === _extensionConfig.INSTALL_TYPE_LOCAL) {
|
|
207
|
+
pkgName = _path.default.isAbsolute(installSpec) ? installSpec : _path.default.resolve(installSpec);
|
|
181
208
|
} else {
|
|
182
|
-
|
|
183
|
-
|
|
209
|
+
let name;
|
|
210
|
+
const splits = installSpec.split('@');
|
|
184
211
|
|
|
185
|
-
|
|
212
|
+
if (installSpec[0] === '@') {
|
|
213
|
+
[name, pkgVer] = [`@${splits[1]}`, splits[2]];
|
|
214
|
+
} else {
|
|
215
|
+
[name, pkgVer] = splits;
|
|
216
|
+
}
|
|
186
217
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
218
|
+
if (installType === _extensionConfig.INSTALL_TYPE_NPM) {
|
|
219
|
+
pkgName = name;
|
|
220
|
+
} else {
|
|
221
|
+
const knownNames = Object.keys(this.knownExtensions);
|
|
191
222
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
223
|
+
if (!_lodash.default.includes(knownNames, name)) {
|
|
224
|
+
const msg = `Could not resolve ${this.type}; are you sure it's in the list ` + `of supported ${this.type}s? ${JSON.stringify(knownNames)}`;
|
|
225
|
+
throw this._createFatalError(msg);
|
|
226
|
+
}
|
|
196
227
|
|
|
197
|
-
|
|
198
|
-
|
|
228
|
+
probableExtName = name;
|
|
229
|
+
pkgName = this.knownExtensions[name];
|
|
230
|
+
installType = _extensionConfig.INSTALL_TYPE_NPM;
|
|
231
|
+
}
|
|
199
232
|
}
|
|
200
233
|
|
|
201
|
-
|
|
202
|
-
|
|
234
|
+
installOpts = {
|
|
235
|
+
installSpec,
|
|
203
236
|
pkgName,
|
|
204
237
|
pkgVer
|
|
205
|
-
}
|
|
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".`);
|
|
206
243
|
}
|
|
207
244
|
|
|
245
|
+
extData = await this.installViaNpm(installOpts);
|
|
208
246
|
const extName = extData[`${this.type}Name`];
|
|
209
|
-
delete extData[`${this.type}Name`];
|
|
210
247
|
|
|
211
248
|
if (this.config.isInstalled(extName)) {
|
|
212
|
-
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".`);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
delete extData[`${this.type}Name`];
|
|
253
|
+
const extManifest = { ...extData,
|
|
254
|
+
installType,
|
|
255
|
+
installSpec
|
|
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'));
|
|
213
271
|
}
|
|
214
272
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
await this.config.
|
|
218
|
-
|
|
273
|
+
await this.config.addExtension(extName, extManifest);
|
|
274
|
+
|
|
275
|
+
if (await _support.env.hasAppiumDependency(this.config.appiumHome)) {
|
|
276
|
+
await (0, _packageChanged.packageDidChange)(this.config.appiumHome);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
this.log.info(this.getPostInstallText({
|
|
219
280
|
extName,
|
|
220
281
|
extData
|
|
221
282
|
}));
|
|
@@ -223,81 +284,101 @@ class ExtensionCommand {
|
|
|
223
284
|
}
|
|
224
285
|
|
|
225
286
|
async installViaNpm({
|
|
226
|
-
|
|
287
|
+
installSpec,
|
|
227
288
|
pkgName,
|
|
228
289
|
pkgVer
|
|
229
290
|
}) {
|
|
230
291
|
const npmSpec = `${pkgName}${pkgVer ? '@' + pkgVer : ''}`;
|
|
231
|
-
const specMsg = npmSpec ===
|
|
232
|
-
const msg = `Installing '${
|
|
292
|
+
const specMsg = npmSpec === installSpec ? '' : ` using NPM install spec '${npmSpec}'`;
|
|
293
|
+
const msg = `Installing '${installSpec}'${specMsg}`;
|
|
233
294
|
|
|
234
295
|
try {
|
|
235
|
-
const pkgJsonData = await (0, _utils.spinWith)(this.isJsonOutput, msg, async () =>
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
return
|
|
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
|
+
});
|
|
303
|
+
return this.getExtensionFields(pkgJsonData);
|
|
243
304
|
} catch (err) {
|
|
244
|
-
throw
|
|
305
|
+
throw this._createFatalError(`Encountered an error when installing package: ${err.message}`);
|
|
245
306
|
}
|
|
246
307
|
}
|
|
247
308
|
|
|
248
|
-
getPostInstallText() {
|
|
249
|
-
throw
|
|
309
|
+
getPostInstallText(args) {
|
|
310
|
+
throw this._createFatalError('Must be implemented in final class');
|
|
250
311
|
}
|
|
251
312
|
|
|
252
|
-
getExtensionFields(
|
|
253
|
-
if (!pkgJsonData.appium) {
|
|
254
|
-
throw new Error(`Installed driver did not have an 'appium' section in its ` + `package.json file as expected`);
|
|
255
|
-
}
|
|
256
|
-
|
|
313
|
+
getExtensionFields(pkgJson) {
|
|
257
314
|
const {
|
|
258
315
|
appium,
|
|
259
316
|
name,
|
|
260
|
-
version
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
317
|
+
version,
|
|
318
|
+
peerDependencies
|
|
319
|
+
} = pkgJson;
|
|
320
|
+
const result = { ...appium,
|
|
264
321
|
pkgName: name,
|
|
265
|
-
version
|
|
322
|
+
version,
|
|
323
|
+
appiumVersion: peerDependencies === null || peerDependencies === void 0 ? void 0 : peerDependencies.appium
|
|
266
324
|
};
|
|
325
|
+
return result;
|
|
267
326
|
}
|
|
268
327
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
328
|
+
validatePackageJson(pkgJson, installSpec) {
|
|
329
|
+
const {
|
|
330
|
+
appium,
|
|
331
|
+
name,
|
|
332
|
+
version
|
|
333
|
+
} = pkgJson;
|
|
272
334
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
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');
|
|
278
339
|
}
|
|
279
340
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
}
|
|
283
|
-
|
|
341
|
+
if (!version) {
|
|
342
|
+
throw createMissingFieldError('version');
|
|
343
|
+
}
|
|
344
|
+
|
|
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`);
|
|
284
362
|
}
|
|
285
363
|
|
|
286
|
-
|
|
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);
|
|
287
368
|
return this.config.installedExtensions;
|
|
288
369
|
}
|
|
289
370
|
|
|
290
|
-
async
|
|
291
|
-
|
|
371
|
+
async _update({
|
|
372
|
+
installSpec,
|
|
292
373
|
unsafe
|
|
293
374
|
}) {
|
|
294
|
-
const shouldUpdateAll =
|
|
375
|
+
const shouldUpdateAll = installSpec === UPDATE_ALL;
|
|
295
376
|
|
|
296
|
-
if (!shouldUpdateAll && !this.config.isInstalled(
|
|
297
|
-
throw
|
|
377
|
+
if (!shouldUpdateAll && !this.config.isInstalled(installSpec)) {
|
|
378
|
+
throw this._createFatalError(`The ${this.type} "${installSpec}" was not installed, so can't be updated`);
|
|
298
379
|
}
|
|
299
380
|
|
|
300
|
-
const extsToUpdate = shouldUpdateAll ? Object.keys(this.config.installedExtensions) : [
|
|
381
|
+
const extsToUpdate = shouldUpdateAll ? Object.keys(this.config.installedExtensions) : [installSpec];
|
|
301
382
|
const errors = {};
|
|
302
383
|
const updates = {};
|
|
303
384
|
|
|
@@ -319,7 +400,7 @@ class ExtensionCommand {
|
|
|
319
400
|
});
|
|
320
401
|
|
|
321
402
|
if (!unsafe && !update.safeUpdate) {
|
|
322
|
-
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`);
|
|
323
404
|
}
|
|
324
405
|
|
|
325
406
|
const updateVer = unsafe && update.unsafeUpdate ? update.unsafeUpdate : update.safeUpdate;
|
|
@@ -333,19 +414,19 @@ class ExtensionCommand {
|
|
|
333
414
|
}
|
|
334
415
|
}
|
|
335
416
|
|
|
336
|
-
|
|
417
|
+
this.log.info('Update report:');
|
|
337
418
|
|
|
338
419
|
for (const [e, update] of _lodash.default.toPairs(updates)) {
|
|
339
|
-
|
|
420
|
+
this.log.ok(` - ${this.type} ${e} updated: ${update.from} => ${update.to}`.green);
|
|
340
421
|
}
|
|
341
422
|
|
|
342
423
|
for (const [e, err] of _lodash.default.toPairs(errors)) {
|
|
343
424
|
if (err instanceof NotUpdatableError) {
|
|
344
|
-
|
|
425
|
+
this.log.warn(` - '${e}' was not installed via npm, so we could not check ` + `for updates`.yellow);
|
|
345
426
|
} else if (err instanceof NoUpdatesAvailableError) {
|
|
346
|
-
|
|
427
|
+
this.log.info(` - '${e}' had no updates available`.yellow);
|
|
347
428
|
} else {
|
|
348
|
-
|
|
429
|
+
this.log.error(` - '${e}' failed to update: ${err}`.red);
|
|
349
430
|
}
|
|
350
431
|
}
|
|
351
432
|
|
|
@@ -360,10 +441,10 @@ class ExtensionCommand {
|
|
|
360
441
|
version,
|
|
361
442
|
pkgName
|
|
362
443
|
} = this.config.installedExtensions[ext];
|
|
363
|
-
let unsafeUpdate = await
|
|
364
|
-
let safeUpdate = await
|
|
444
|
+
let unsafeUpdate = await _support.npm.getLatestVersion(this.config.appiumHome, pkgName);
|
|
445
|
+
let safeUpdate = await _support.npm.getLatestSafeUpgradeVersion(this.config.appiumHome, pkgName, version);
|
|
365
446
|
|
|
366
|
-
if (!
|
|
447
|
+
if (!_support.util.compareVersions(unsafeUpdate, '>', version)) {
|
|
367
448
|
unsafeUpdate = null;
|
|
368
449
|
safeUpdate = null;
|
|
369
450
|
}
|
|
@@ -372,7 +453,7 @@ class ExtensionCommand {
|
|
|
372
453
|
unsafeUpdate = null;
|
|
373
454
|
}
|
|
374
455
|
|
|
375
|
-
if (safeUpdate && !
|
|
456
|
+
if (safeUpdate && !_support.util.compareVersions(safeUpdate, '>', version)) {
|
|
376
457
|
safeUpdate = null;
|
|
377
458
|
}
|
|
378
459
|
|
|
@@ -383,22 +464,72 @@ class ExtensionCommand {
|
|
|
383
464
|
};
|
|
384
465
|
}
|
|
385
466
|
|
|
386
|
-
async updateExtension(
|
|
467
|
+
async updateExtension(installSpec, version) {
|
|
387
468
|
const {
|
|
388
469
|
pkgName
|
|
389
|
-
} = this.config.installedExtensions[
|
|
390
|
-
await this.installViaNpm({
|
|
391
|
-
|
|
470
|
+
} = this.config.installedExtensions[installSpec];
|
|
471
|
+
const extData = await this.installViaNpm({
|
|
472
|
+
installSpec,
|
|
392
473
|
pkgName,
|
|
393
474
|
pkgVer: version
|
|
394
475
|
});
|
|
395
|
-
this.
|
|
396
|
-
await this.config.
|
|
476
|
+
delete extData[`${this.type}Name`];
|
|
477
|
+
await this.config.updateExtension(installSpec, extData);
|
|
397
478
|
}
|
|
398
479
|
|
|
399
|
-
|
|
480
|
+
async _run({
|
|
481
|
+
installSpec,
|
|
482
|
+
scriptName,
|
|
483
|
+
extraArgs = []
|
|
484
|
+
}) {
|
|
485
|
+
if (!this.config.isInstalled(installSpec)) {
|
|
486
|
+
throw this._createFatalError(`The ${this.type} "${installSpec}" is not installed`);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
const extConfig = this.config.installedExtensions[installSpec];
|
|
490
|
+
|
|
491
|
+
if (!extConfig.scripts) {
|
|
492
|
+
throw this._createFatalError(`The ${this.type} named '${installSpec}' does not contain the ` + `"scripts" field underneath the "appium" field in its package.json`);
|
|
493
|
+
}
|
|
400
494
|
|
|
401
|
-
|
|
495
|
+
const extScripts = extConfig.scripts;
|
|
402
496
|
|
|
497
|
+
if (!_lodash.default.isPlainObject(extScripts)) {
|
|
498
|
+
throw this._createFatalError(`The ${this.type} named '${installSpec}' "scripts" field must be a plain object`);
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
if (!_lodash.default.has(extScripts, scriptName)) {
|
|
502
|
+
throw this._createFatalError(`The ${this.type} named '${installSpec}' does not support the script: '${scriptName}'`);
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
const runner = new _teen_process.SubProcess(process.execPath, [extScripts[scriptName], ...extraArgs], {
|
|
506
|
+
cwd: this.config.getInstallPath(installSpec)
|
|
507
|
+
});
|
|
508
|
+
const output = new _utils.RingBuffer(50);
|
|
509
|
+
runner.on('stream-line', line => {
|
|
510
|
+
output.enqueue(line);
|
|
511
|
+
this.log.log(line);
|
|
512
|
+
});
|
|
513
|
+
await runner.start(0);
|
|
514
|
+
|
|
515
|
+
try {
|
|
516
|
+
await runner.join();
|
|
517
|
+
this.log.ok(`${scriptName} successfully ran`.green);
|
|
518
|
+
return {
|
|
519
|
+
output: output.getBuff()
|
|
520
|
+
};
|
|
521
|
+
} catch (err) {
|
|
522
|
+
this.log.error(`Encountered an error when running '${scriptName}': ${err.message}`.red);
|
|
523
|
+
return {
|
|
524
|
+
error: err.message,
|
|
525
|
+
output: output.getBuff()
|
|
526
|
+
};
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
}
|
|
403
531
|
|
|
404
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQuanMiXSwibmFtZXMiOlsiVVBEQVRFX0FMTCIsIk5vdFVwZGF0YWJsZUVycm9yIiwiRXJyb3IiLCJOb1VwZGF0ZXNBdmFpbGFibGVFcnJvciIsIkV4dGVuc2lvbkNvbW1hbmQiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsImpzb24iLCJ0eXBlIiwiaXNKc29uT3V0cHV0IiwibnBtIiwiTlBNIiwiYXBwaXVtSG9tZSIsImtub3duRXh0ZW5zaW9ucyIsImV4ZWN1dGUiLCJhcmdzIiwiY21kIiwiXyIsImlzRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJleGVjdXRlQ21kIiwiYmluZCIsImxpc3QiLCJzaG93SW5zdGFsbGVkIiwic2hvd1VwZGF0ZXMiLCJsc01zZyIsImluc3RhbGxlZE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJrbm93bk5hbWVzIiwiZXh0cyIsInJlZHVjZSIsImFjYyIsIm5hbWUiLCJpbmNsdWRlcyIsImluc3RhbGxlZCIsInBrZ05hbWUiLCJleHQiLCJkYXRhIiwidG9QYWlycyIsImluc3RhbGxUeXBlIiwiSU5TVEFMTF9UWVBFX05QTSIsInVwZGF0ZXMiLCJjaGVja0ZvckV4dGVuc2lvblVwZGF0ZSIsInVwZGF0ZVZlcnNpb24iLCJzYWZlVXBkYXRlIiwidW5zYWZlVXBkYXRlVmVyc2lvbiIsInVuc2FmZVVwZGF0ZSIsInVwVG9EYXRlIiwiaW5zdGFsbFNwZWMiLCJ2ZXJzaW9uIiwidHlwZVR4dCIsIklOU1RBTExfVFlQRV9HSVQiLCJJTlNUQUxMX1RZUEVfR0lUSFVCIiwieWVsbG93IiwiSU5TVEFMTF9UWVBFX0xPQ0FMIiwibWFnZW50YSIsImluc3RhbGxUeHQiLCJncmVlbiIsImdyZXkiLCJ1cGRhdGVUeHQiLCJ1cFRvRGF0ZVR4dCIsInVuc2FmZVVwZGF0ZVR4dCIsImN5YW4iLCJjb25zb2xlIiwibG9nIiwiaW5zdGFsbCIsInBhY2thZ2VOYW1lIiwiZXh0RGF0YSIsIm1zZyIsInBrZ0pzb25EYXRhIiwibGlua1BhY2thZ2UiLCJnZXRFeHRlbnNpb25GaWVsZHMiLCJpbnN0YWxsUGF0aCIsInNwbGl0IiwibGVuZ3RoIiwiaW5zdGFsbFZpYU5wbSIsInJlcGxhY2UiLCJwa2dWZXIiLCJzcGxpdHMiLCJKU09OIiwic3RyaW5naWZ5IiwiZXh0TmFtZSIsImlzSW5zdGFsbGVkIiwiYWRkRXh0ZW5zaW9uIiwiZ2V0UG9zdEluc3RhbGxUZXh0IiwibnBtU3BlYyIsInNwZWNNc2ciLCJpbnN0YWxsUGFja2FnZSIsInBrZ0RpciIsInBhdGgiLCJyZXNvbHZlIiwiZXJyIiwibWVzc2FnZSIsImFwcGl1bSIsInZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzIiwidW5pbnN0YWxsIiwiZnMiLCJyaW1yYWYiLCJnZXRJbnN0YWxsUGF0aCIsInJlbW92ZUV4dGVuc2lvbiIsInVwZGF0ZSIsInVuc2FmZSIsInNob3VsZFVwZGF0ZUFsbCIsImV4dHNUb1VwZGF0ZSIsImVycm9ycyIsImUiLCJjdXJyZW50IiwidXBkYXRlVmVyIiwidXBkYXRlRXh0ZW5zaW9uIiwiZnJvbSIsInRvIiwicmVkIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsImdldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbiIsInV0aWwiLCJjb21wYXJlVmVyc2lvbnMiLCJ3cml0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNQSxVQUFVLEdBQUcsV0FBbkI7O0FBRUEsTUFBTUMsaUJBQU4sU0FBZ0NDLEtBQWhDLENBQXNDOztBQUN0QyxNQUFNQyx1QkFBTixTQUFzQ0QsS0FBdEMsQ0FBNEM7O0FBRTdCLE1BQU1FLGdCQUFOLENBQXVCO0FBZXBDQyxFQUFBQSxXQUFXLENBQUU7QUFBQ0MsSUFBQUEsTUFBRDtBQUFTQyxJQUFBQSxJQUFUO0FBQWVDLElBQUFBO0FBQWYsR0FBRixFQUF3QjtBQUNqQyxTQUFLRixNQUFMLEdBQWNBLE1BQWQ7QUFDQSxT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TUFBQUEsT0FBTjtBQUFlMEMsTUFBQUEsTUFBTSxFQUFFNUI7QUFBdkIsS0FBbkIsQ0FBTjtBQUNBLFNBQUs3QyxNQUFMLENBQVl1QixtQkFBWixDQUFnQ1MsR0FBaEMsRUFBcUNhLE9BQXJDLEdBQStDQSxPQUEvQztBQUNBLFVBQU0sS0FBSzdDLE1BQUwsQ0FBWWdILEtBQVosRUFBTjtBQUNEOztBQXhkbUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgTlBNIGZyb20gJy4vbnBtJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZnMsIHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyBsb2csIHNwaW5XaXRoIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBJTlNUQUxMX1RZUEVfTlBNLCBJTlNUQUxMX1RZUEVfR0lULCBJTlNUQUxMX1RZUEVfR0lUSFVCLFxuICAgICAgICAgSU5TVEFMTF9UWVBFX0xPQ0FMIH0gZnJvbSAnLi4vZXh0ZW5zaW9uLWNvbmZpZyc7XG5cbmNvbnN0IFVQREFURV9BTEwgPSAnaW5zdGFsbGVkJztcblxuY2xhc3MgTm90VXBkYXRhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuY2xhc3MgTm9VcGRhdGVzQXZhaWxhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFeHRlbnNpb25Db21tYW5kIHtcblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXh0ZW5zaW9uQ29tbWFuZENvbnN0cnVjdG9yXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWcgLSB0aGUgRHJpdmVyQ29uZmlnIG9yIFBsdWdpbkNvbmZpZyBvYmplY3QgdXNlZCBmb3IgdGhpcyBjb21tYW5kXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0ganNvbiAtIHdoZXRoZXIgdGhlIG91dHB1dCBvZiB0aGlzIGNvbW1hbmQgc2hvdWxkIGJlIEpTT04gb3IgdGV4dFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSAtIERSSVZFUl9UWVBFIG9yIFBMVUdJTl9UWVBFXG4gICAqL1xuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiBFeHRlbnNpb25Db21tYW5kXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uQ29tbWFuZENvbnN0cnVjdG9yfSBvcHRzXG4gICAqIEByZXR1cm4ge0V4dGVuc2lvbkNvbW1hbmR9XG4gICAqL1xuICBjb25zdHJ1Y3RvciAoe2NvbmZpZywganNvbiwgdHlwZX0pIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMuaXNKc29uT3V0cHV0ID0ganNvbjtcbiAgICB0aGlzLm5wbSA9IG5ldyBOUE0odGhpcy5jb25maWcuYXBwaXVtSG9tZSk7XG4gICAgdGhpcy5rbm93bkV4dGVuc2lvbnMgPSB7fTsgLy8gdGhpcyBuZWVkcyB0byBiZSBvdmVycmlkZGVuIGluIGZpbmFsIGNsYXNzXG4gIH1cblxuICAvKipcbiAgICogVGFrZSBhIENMSSBwYXJzZSBhbmQgcnVuIGFuIGV4dGVuc2lvbiBjb21tYW5kIGJhc2VkIG9uIGl0cyB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gYSBrZXkvdmFsdWUgb2JqZWN0IHdpdGggQ0xJIGZsYWdzIGFuZCB2YWx1ZXNcbiAgICogQHJldHVybiB7b2JqZWN0fSB0aGUgcmVzdWx0IG9mIHRoZSBzcGVjaWZpYyBjb21tYW5kIHdoaWNoIGlzIGV4ZWN1dGVkXG4gICAqL1xuICBhc3luYyBleGVjdXRlIChhcmdzKSB7XG4gICAgY29uc3QgY21kID0gYXJnc1tgJHt0aGlzLnR5cGV9Q29tbWFuZGBdO1xuICAgIGlmICghXy5pc0Z1bmN0aW9uKEV4dGVuc2lvbkNvbW1hbmQucHJvdG90eXBlW2NtZF0pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBoYW5kbGUgJHt0aGlzLnR5cGV9IGNvbW1hbmQgJHtjbWR9YCk7XG4gICAgfVxuICAgIGNvbnN0IGV4ZWN1dGVDbWQgPSB0aGlzW2NtZF0uYmluZCh0aGlzKTtcbiAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZUNtZChhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0QXJnc1xuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IHNob3dJbnN0YWxsZWQgLSB3aGV0aGVyIHNob3VsZCBzaG93IG9ubHkgaW5zdGFsbGVkIGV4dGVuc2lvbnNcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBzaG93VXBkYXRlcyAtIHdoZXRoZXIgc2hvdWxkIHNob3cgYXZhaWxhYmxlIHVwZGF0ZXNcbiAgICovXG5cbiAgLyoqXG4gICAqIExpc3QgZXh0ZW5zaW9uc1xuICAgKlxuICAgKiBAcGFyYW0ge0xpc3RBcmdzfSBhcmdzXG4gICAqIEByZXR1cm4ge29iamVjdH0gbWFwIG9mIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgbGlzdCAoe3Nob3dJbnN0YWxsZWQsIHNob3dVcGRhdGVzfSkge1xuICAgIGNvbnN0IGxzTXNnID0gYExpc3RpbmcgJHtzaG93SW5zdGFsbGVkID8gJ2luc3RhbGxlZCcgOiAnYXZhaWxhYmxlJ30gJHt0aGlzLnR5cGV9c2A7XG4gICAgY29uc3QgaW5zdGFsbGVkTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zKTtcbiAgICBjb25zdCBrbm93bk5hbWVzID0gT2JqZWN0LmtleXModGhpcy5rbm93bkV4dGVuc2lvbnMpO1xuICAgIGNvbnN0IGV4dHMgPSBbLi4uaW5zdGFsbGVkTmFtZXMsIC4uLmtub3duTmFtZXNdLnJlZHVjZSgoYWNjLCBuYW1lKSA9PiB7XG4gICAgICBpZiAoIWFjY1tuYW1lXSkge1xuICAgICAgICBpZiAoaW5zdGFsbGVkTmFtZXMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgICBhY2NbbmFtZV0gPSB7Li4udGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tuYW1lXSwgaW5zdGFsbGVkOiB0cnVlfTtcbiAgICAgICAgfSBlbHNlIGlmICghc2hvd0luc3RhbGxlZCkge1xuICAgICAgICAgIGFjY1tuYW1lXSA9IHtwa2dOYW1lOiB0aGlzLmtub3duRXh0ZW5zaW9uc1tuYW1lXSwgaW5zdGFsbGVkOiBmYWxzZX07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuXG4gICAgLy8gaWYgd2Ugd2FudCB0byBzaG93IHdoZXRoZXIgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLCBwdXQgdGhhdCBiZWhpbmQgYSBzcGlubmVyXG4gICAgYXdhaXQgc3BpbldpdGgodGhpcy5pc0pzb25PdXRwdXQsIGxzTXNnLCBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXNob3dVcGRhdGVzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgW2V4dCwgZGF0YV0gb2YgXy50b1BhaXJzKGV4dHMpKSB7XG4gICAgICAgIGNvbnN0IHtpbnN0YWxsZWQsIGluc3RhbGxUeXBlfSA9IGRhdGE7XG4gICAgICAgIGlmICghaW5zdGFsbGVkIHx8IGluc3RhbGxUeXBlICE9PSBJTlNUQUxMX1RZUEVfTlBNKSB7XG4gICAgICAgICAgLy8gZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgdXBkYXRlcyBvbiBleHRzIHRoYXQgYXJlbid0IGluc3RhbGxlZFxuICAgICAgICAgIC8vIGFsc28gZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgdXBkYXRlcyBvbiBub24tbnBtIGV4dHNcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cGRhdGVzID0gYXdhaXQgdGhpcy5jaGVja0ZvckV4dGVuc2lvblVwZGF0ZShleHQpO1xuICAgICAgICBkYXRhLnVwZGF0ZVZlcnNpb24gPSB1cGRhdGVzLnNhZmVVcGRhdGU7XG4gICAgICAgIGRhdGEudW5zYWZlVXBkYXRlVmVyc2lvbiA9IHVwZGF0ZXMudW5zYWZlVXBkYXRlO1xuICAgICAgICBkYXRhLnVwVG9EYXRlID0gdXBkYXRlcy5zYWZlVXBkYXRlID09PSBudWxsICYmIHVwZGF0ZXMudW5zYWZlVXBkYXRlID09PSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gaWYgd2UncmUganVzdCBnZXR0aW5nIHRoZSBkYXRhLCBzaG9ydCBjaXJjdWl0IHJldHVybiBoZXJlIHNpbmNlIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55XG4gICAgLy8gZm9ybWF0dGluZyBsb2dpY1xuICAgIGlmICh0aGlzLmlzSnNvbk91dHB1dCkge1xuICAgICAgcmV0dXJuIGV4dHM7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbXG4gICAgICBuYW1lLFxuICAgICAge2luc3RhbGxUeXBlLCBpbnN0YWxsU3BlYywgaW5zdGFsbGVkLCB1cGRhdGVWZXJzaW9uLCB1bnNhZmVVcGRhdGVWZXJzaW9uLCB2ZXJzaW9uLCB1cFRvRGF0ZX1cbiAgICBdIG9mIF8udG9QYWlycyhleHRzKSkge1xuICAgICAgbGV0IHR5cGVUeHQ7XG4gICAgICBzd2l0Y2ggKGluc3RhbGxUeXBlKSB7XG4gICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0dJVDpcbiAgICAgICAgY2FzZSBJTlNUQUxMX1RZUEVfR0lUSFVCOlxuICAgICAgICAgIHR5cGVUeHQgPSBgKGNsb25lZCBmcm9tICR7aW5zdGFsbFNwZWN9KWAueWVsbG93O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9MT0NBTDpcbiAgICAgICAgICB0eXBlVHh0ID0gYChsaW5rZWQgZnJvbSAke2luc3RhbGxTcGVjfSlgLm1hZ2VudGE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdHlwZVR4dCA9ICcoTlBNKSc7XG4gICAgICB9XG4gICAgICBjb25zdCBpbnN0YWxsVHh0ID0gaW5zdGFsbGVkID9cbiAgICAgICAgYEAke3ZlcnNpb24ueWVsbG93fSAkeygnW2luc3RhbGxlZCAnICsgdHlwZVR4dCArICddJykuZ3JlZW59YCA6XG4gICAgICAgICcgW25vdCBpbnN0YWxsZWRdJy5ncmV5O1xuICAgICAgY29uc3QgdXBkYXRlVHh0ID0gc2hvd1VwZGF0ZXMgJiYgdXBkYXRlVmVyc2lvbiA/XG4gICAgICAgIGAgWyR7dXBkYXRlVmVyc2lvbn0gYXZhaWxhYmxlXWAubWFnZW50YSA6XG4gICAgICAgICcnO1xuICAgICAgY29uc3QgdXBUb0RhdGVUeHQgPSBzaG93VXBkYXRlcyAmJiB1cFRvRGF0ZSA/XG4gICAgICAgIGAgW1VwIHRvIGRhdGVdYC5ncmVlbiA6XG4gICAgICAgICcnO1xuICAgICAgY29uc3QgdW5zYWZlVXBkYXRlVHh0ID0gc2hvd1VwZGF0ZXMgJiYgdW5zYWZlVXBkYXRlVmVyc2lvbiA/XG4gICAgICAgIGAgWyR7dW5zYWZlVXBkYXRlVmVyc2lvbn0gYXZhaWxhYmxlIChwb3RlbnRpYWxseSB1bnNhZmUpXWAuY3lhbiA6XG4gICAgICAgICcnO1xuXG4gICAgICBjb25zb2xlLmxvZyhgLSAke25hbWUueWVsbG93fSR7aW5zdGFsbFR4dH0ke3VwZGF0ZVR4dH0ke3VwVG9EYXRlVHh0fSR7dW5zYWZlVXBkYXRlVHh0fWApO1xuICAgIH1cblxuICAgIHJldHVybiBleHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEluc3RhbGxBcmdzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHQgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byBpbnN0YWxsXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsVHlwZSAtIGhvdyB0byBpbnN0YWxsIHRoaXMgZXh0ZW5zaW9uLiBPbmUgb2YgdGhlIElOU1RBTExfVFlQRVNcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYWNrYWdlTmFtZV0gLSBmb3IgZ2l0L2dpdGh1YiBpbnN0YWxscywgdGhlIGV4dGVuc2lvbiBub2RlIHBhY2thZ2UgbmFtZVxuICAgKi9cblxuICAvKipcbiAgICogSW5zdGFsbCBhbiBleHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtJbnN0YWxsQXJnc30gYXJnc1xuICAgKiBAcmV0dXJuIHtvYmplY3R9IG1hcCBvZiBhbGwgaW5zdGFsbGVkIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgaW5zdGFsbCAoe2V4dCwgaW5zdGFsbFR5cGUsIHBhY2thZ2VOYW1lfSkge1xuICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYEF0dGVtcHRpbmcgdG8gZmluZCBhbmQgaW5zdGFsbCAke3RoaXMudHlwZX0gJyR7ZXh0fSdgKTtcblxuICAgIGxldCBleHREYXRhO1xuICAgIGxldCBpbnN0YWxsU3BlYyA9IGV4dDtcblxuICAgIGlmIChwYWNrYWdlTmFtZSAmJiBbSU5TVEFMTF9UWVBFX0xPQ0FMLCBJTlNUQUxMX1RZUEVfTlBNXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgV2hlbiB1c2luZyAtLXNvdXJjZT0ke2luc3RhbGxUeXBlfSwgY2Fubm90IGFsc28gdXNlIC0tcGFja2FnZWApO1xuICAgIH1cblxuICAgIGlmICghcGFja2FnZU5hbWUgJiYgW0lOU1RBTExfVFlQRV9HSVQsIElOU1RBTExfVFlQRV9HSVRIVUJdLmluY2x1ZGVzKGluc3RhbGxUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBXaGVuIHVzaW5nIC0tc291cmNlPSR7aW5zdGFsbFR5cGV9LCBtdXN0IGFsc28gdXNlIC0tcGFja2FnZWApO1xuICAgIH1cblxuICAgIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX0xPQ0FMKSB7XG4gICAgICBjb25zdCBtc2cgPSBgTGlua2luZyAke3RoaXMudHlwZX0gZnJvbSBsb2NhbCBwYXRoYDtcbiAgICAgIGNvbnN0IHBrZ0pzb25EYXRhID0gYXdhaXQgc3BpbldpdGgodGhpcy5pc0pzb25PdXRwdXQsIG1zZywgYXN5bmMgKCkgPT4gKFxuICAgICAgICBhd2FpdCB0aGlzLm5wbS5saW5rUGFja2FnZShpbnN0YWxsU3BlYykpXG4gICAgICApO1xuICAgICAgZXh0RGF0YSA9IHRoaXMuZ2V0RXh0ZW5zaW9uRmllbGRzKHBrZ0pzb25EYXRhKTtcbiAgICAgIGV4dERhdGEuaW5zdGFsbFBhdGggPSBleHREYXRhLnBrZ05hbWU7XG4gICAgfSBlbHNlIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX0dJVEhVQikge1xuICAgICAgaWYgKGluc3RhbGxTcGVjLnNwbGl0KCcvJykubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgR2l0aHViICR7dGhpcy50eXBlfSBzcGVjICR7aW5zdGFsbFNwZWN9IGFwcGVhcmVkIHRvIGJlIGludmFsaWQ7IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2l0IHNob3VsZCBiZSBvZiB0aGUgZm9ybSA8b3JnPi88cmVwbz4nKTtcbiAgICAgIH1cbiAgICAgIGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe2V4dDogaW5zdGFsbFNwZWMsIHBrZ05hbWU6IHBhY2thZ2VOYW1lfSk7XG4gICAgfSBlbHNlIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX0dJVCkge1xuICAgICAgLy8gZ2l0IHVybHMgY2FuIGhhdmUgJy5naXQnIGF0IHRoZSBlbmQsIGJ1dCB0aGlzIGlzIG5vdCBuZWNlc3NhcnkgYW5kIHdvdWxkIGNvbXBsaWNhdGUgdGhlXG4gICAgICAvLyB3YXkgd2UgZG93bmxvYWQgYW5kIG5hbWUgZGlyZWN0b3JpZXMsIHNvIHdlIGNhbiBqdXN0IHJlbW92ZSBpdFxuICAgICAgaW5zdGFsbFNwZWMgPSBpbnN0YWxsU3BlYy5yZXBsYWNlKC9cXC5naXQkLywgJycpO1xuICAgICAgZXh0RGF0YSA9IGF3YWl0IHRoaXMuaW5zdGFsbFZpYU5wbSh7ZXh0OiBpbnN0YWxsU3BlYywgcGtnTmFtZTogcGFja2FnZU5hbWV9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYXQgdGhpcyBwb2ludCB3ZSBoYXZlIGVpdGhlciBhbiBucG0gcGFja2FnZSBvciBhbiBhcHBpdW0gdmVyaWZpZWQgZXh0ZW5zaW9uXG4gICAgICAvLyBuYW1lLiBib3RoIG9mIHdoaWNoIHdpbGwgYmUgaW5zdGFsbGVkIHZpYSBucG0uXG4gICAgICAvLyBleHRlbnNpb25zIGluc3RhbGxlZCB2aWEgbnBtIGNhbiBpbmNsdWRlIHZlcnNpb25zIG9yIHRhZ3MgYWZ0ZXIgdGhlICdAJ1xuICAgICAgLy8gc2lnbiwgc28gY2hlY2sgZm9yIHRoYXQuIFdlIGFsc28gbmVlZCB0byBiZSBjYXJlZnVsIHRoYXQgcGFja2FnZSBuYW1lcyB0aGVtc2VsdmVzIGNhblxuICAgICAgLy8gY29udGFpbiB0aGUgJ0AnIHN5bWJvbCwgYXMgaW4gYG5wbSBpbnN0YWxsIEBhcHBpdW0vZmFrZS1kcml2ZXJAMS4yLjBgXG4gICAgICBsZXQgbmFtZSwgcGtnVmVyO1xuICAgICAgY29uc3Qgc3BsaXRzID0gaW5zdGFsbFNwZWMuc3BsaXQoJ0AnKTtcbiAgICAgIGlmIChpbnN0YWxsU3BlY1swXSA9PT0gJ0AnKSB7XG4gICAgICAgIC8vIHRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBhbiBucG0gb3JnIGluY2x1ZGVkIGluIHRoZSBwYWNrYWdlIG5hbWVcbiAgICAgICAgW25hbWUsIHBrZ1Zlcl0gPSBbYEAke3NwbGl0c1sxXX1gLCBzcGxpdHNbMl1dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgY2FzZSB3aXRob3V0IGFuIG5wbSBvcmdcbiAgICAgICAgW25hbWUsIHBrZ1Zlcl0gPSBzcGxpdHM7XG4gICAgICB9XG4gICAgICBsZXQgcGtnTmFtZTtcblxuICAgICAgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfTlBNKSB7XG4gICAgICAgIC8vIGlmIHdlJ3JlIGluc3RhbGxpbmcgYSBuYW1lZCBwYWNrYWdlIGZyb20gbnBtLCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrXG4gICAgICAgIC8vIGFnYWluc3QgdGhlIGFwcGl1bSBleHRlbnNpb24gbGlzdDsganVzdCB1c2UgdGhlIGluc3RhbGxTcGVjIGFzIGlzXG4gICAgICAgIHBrZ05hbWUgPSBuYW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgd2UncmUgaW5zdGFsbGluZyBhIG5hbWVkIGFwcGl1bSBkcml2ZXIgKGxpa2UgJ3hjdWl0ZXN0Jykgd2UgbmVlZCB0b1xuICAgICAgICAvLyBkZXJlZmVyZW5jZSB0aGUgYWN0dWFsIG5wbSBwYWNrYWdlICgnYXBwaXVwbS14Y3VpdGVzdC1kcml2ZXInKSwgc29cbiAgICAgICAgLy8gY2hlY2sgaXQgZXhpc3RzIGFuZCBnZXQgdGhlIGNvcnJlY3QgcGFja2FnZVxuICAgICAgICBjb25zdCBrbm93bk5hbWVzID0gT2JqZWN0LmtleXModGhpcy5rbm93bkV4dGVuc2lvbnMpO1xuICAgICAgICBpZiAoIV8uaW5jbHVkZXMoa25vd25OYW1lcywgbmFtZSkpIHtcbiAgICAgICAgICBjb25zdCBtc2cgPSBgQ291bGQgbm90IHJlc29sdmUgJHt0aGlzLnR5cGV9OyBhcmUgeW91IHN1cmUgaXQncyBpbiB0aGUgbGlzdCBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgb2Ygc3VwcG9ydGVkICR7dGhpcy50eXBlfXM/ICR7SlNPTi5zdHJpbmdpZnkoa25vd25OYW1lcyl9YDtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgICAgfVxuICAgICAgICBwa2dOYW1lID0gdGhpcy5rbm93bkV4dGVuc2lvbnNbbmFtZV07XG4gICAgICAgIC8vIGdpdmVuIHRoYXQgd2UnbGwgdXNlIHRoZSBpbnN0YWxsIHR5cGUgaW4gdGhlIGRyaXZlciBqc29uLCBzdG9yZSBpdCBhc1xuICAgICAgICAvLyAnbnBtJyBub3dcbiAgICAgICAgaW5zdGFsbFR5cGUgPSBJTlNUQUxMX1RZUEVfTlBNO1xuICAgICAgfVxuXG4gICAgICBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKHtleHQsIHBrZ05hbWUsIHBrZ1Zlcn0pO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dE5hbWUgPSBleHREYXRhW2Ake3RoaXMudHlwZX1OYW1lYF07XG4gICAgZGVsZXRlIGV4dERhdGFbYCR7dGhpcy50eXBlfU5hbWVgXTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChleHROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBICR7dGhpcy50eXBlfSBuYW1lZCAnJHtleHROYW1lfScgaXMgYWxyZWFkeSBpbnN0YWxsZWQuIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBEaWQgeW91IG1lYW4gdG8gdXBkYXRlPyAnYXBwaXVtICR7dGhpcy50eXBlfSB1cGRhdGUnLiBTZWUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYGluc3RhbGxlZCAke3RoaXMudHlwZX1zIHdpdGggJ2FwcGl1bSAke3RoaXMudHlwZX0gbGlzdCAtLWluc3RhbGxlZCcuYCk7XG4gICAgfVxuXG4gICAgZXh0RGF0YS5pbnN0YWxsVHlwZSA9IGluc3RhbGxUeXBlO1xuICAgIGV4dERhdGEuaW5zdGFsbFNwZWMgPSBpbnN0YWxsU3BlYztcbiAgICBhd2FpdCB0aGlzLmNvbmZpZy5hZGRFeHRlbnNpb24oZXh0TmFtZSwgZXh0RGF0YSk7XG5cbiAgICAvLyBsb2cgaW5mbyBmb3IgdGhlIHVzZXJcbiAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIHRoaXMuZ2V0UG9zdEluc3RhbGxUZXh0KHtleHROYW1lLCBleHREYXRhfSkpO1xuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbFZpYU5wbUFyZ3NcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dCAtIHRoZSBuYW1lIG9yIHNwZWMgb2YgYW4gZXh0ZW5zaW9uIHRvIGluc3RhbGxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHBrZ05hbWUgLSB0aGUgTlBNIHBhY2thZ2UgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGtnVmVyXSAtIHRoZSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBOUE0gcGFja2FnZVxuICAgKi9cblxuICAvKipcbiAgICogSW5zdGFsbCBhbiBleHRlbnNpb24gdmlhIE5QTVxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxWaWFOcG1BcmdzfSBhcmdzXG4gICAqL1xuICBhc3luYyBpbnN0YWxsVmlhTnBtICh7ZXh0LCBwa2dOYW1lLCBwa2dWZXJ9KSB7XG4gICAgY29uc3QgbnBtU3BlYyA9IGAke3BrZ05hbWV9JHtwa2dWZXIgPyAnQCcgKyBwa2dWZXIgOiAnJ31gO1xuICAgIGNvbnN0IHNwZWNNc2cgPSBucG1TcGVjID09PSBleHQgPyAnJyA6IGAgdXNpbmcgTlBNIGluc3RhbGwgc3BlYyAnJHtucG1TcGVjfSdgO1xuICAgIGNvbnN0IG1zZyA9IGBJbnN0YWxsaW5nICcke2V4dH0nJHtzcGVjTXNnfWA7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBrZ0pzb25EYXRhID0gYXdhaXQgc3BpbldpdGgodGhpcy5pc0pzb25PdXRwdXQsIG1zZywgYXN5bmMgKCkgPT4gKFxuICAgICAgICBhd2FpdCB0aGlzLm5wbS5pbnN0YWxsUGFja2FnZSh7XG4gICAgICAgICAgcGtnRGlyOiBwYXRoLnJlc29sdmUodGhpcy5jb25maWcuYXBwaXVtSG9tZSwgcGtnTmFtZSksXG4gICAgICAgICAgcGtnTmFtZSxcbiAgICAgICAgICBwa2dWZXJcbiAgICAgICAgfSlcbiAgICAgICkpO1xuICAgICAgY29uc3QgZXh0RGF0YSA9IHRoaXMuZ2V0RXh0ZW5zaW9uRmllbGRzKHBrZ0pzb25EYXRhKTtcbiAgICAgIGV4dERhdGEuaW5zdGFsbFBhdGggPSBwa2dOYW1lO1xuICAgICAgcmV0dXJuIGV4dERhdGE7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVuY291bnRlcmVkIGFuIGVycm9yIHdoZW4gaW5zdGFsbGluZyBwYWNrYWdlOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBFeHRlbnNpb25BcmdzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHROYW1lIC0gdGhlIG5hbWUgb2YgYW4gZXh0ZW5zaW9uXG4gICAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBleHREYXRhIC0gdGhlIGRhdGEgZm9yIGFuIGluc3RhbGxlZCBleHRlbnNpb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdGV4dCB3aGljaCBzaG91bGQgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGFmdGVyIGFuIGV4dGVuc2lvbiBoYXMgYmVlbiBpbnN0YWxsZWQuIFRoaXNcbiAgICogaXMgZGVzaWduZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSBkcml2ZXJzL3BsdWdpbnMgd2l0aCB0aGVpciBvd24gcGFydGljdWxhciB0ZXh0LlxuICAgKlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvbkFyZ3N9IGFyZ3NcbiAgICovXG4gIGdldFBvc3RJbnN0YWxsVGV4dCAoLyp7ZXh0TmFtZSwgZXh0RGF0YX0qLykge1xuICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBmaW5hbCBjbGFzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYW4gTlBNIG1vZHVsZSdzIHBhY2thZ2UuanNvbiBhbmQgZXh0cmFjdCBBcHBpdW0gZHJpdmVyIGluZm9ybWF0aW9uIGZyb20gYSBzcGVjaWFsXG4gICAqICdhcHBpdW0nIGZpZWxkIGluIHRoZSBKU09OIGRhdGEuIFdlIG5lZWQgdGhpcyBpbmZvcm1hdGlvbiB0byBlLmcuIGRldGVybWluZSB3aGljaCBjbGFzcyB0b1xuICAgKiBsb2FkIGFzIHRoZSBtYWluIGRyaXZlciBjbGFzcywgb3IgdG8gYmUgYWJsZSB0byBkZXRlY3QgaW5jb21wYXRpYmlsaXRpZXMgYmV0d2VlbiBkcml2ZXIgYW5kXG4gICAqIGFwcGl1bSB2ZXJzaW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHBrZ0pzb25EYXRhIC0gdGhlIHBhY2thZ2UuanNvbiBkYXRhIGZvciBhIGRyaXZlciBtb2R1bGUsIGFzIGlmIGl0IGhhZCBiZWVuXG4gICAqIHN0cmFpZ2h0Zm9yd2FyZGx5ICdyZXF1aXJlJ2RcbiAgICovXG4gIGdldEV4dGVuc2lvbkZpZWxkcyAocGtnSnNvbkRhdGEpIHtcbiAgICBpZiAoIXBrZ0pzb25EYXRhLmFwcGl1bSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnN0YWxsZWQgZHJpdmVyIGRpZCBub3QgaGF2ZSBhbiAnYXBwaXVtJyBzZWN0aW9uIGluIGl0cyBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgcGFja2FnZS5qc29uIGZpbGUgYXMgZXhwZWN0ZWRgKTtcbiAgICB9XG4gICAgY29uc3Qge2FwcGl1bSwgbmFtZSwgdmVyc2lvbn0gPSBwa2dKc29uRGF0YTtcbiAgICB0aGlzLnZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzKGFwcGl1bSk7XG5cbiAgICByZXR1cm4gey4uLmFwcGl1bSwgcGtnTmFtZTogbmFtZSwgdmVyc2lvbn07XG4gIH1cblxuICAvKipcbiAgICogRm9yIGFueSBwYWNrYWdlLmpzb24gZmllbGRzIHdoaWNoIGEgcGFydGljdWxhciB0eXBlIG9mIGV4dGVuc2lvbiByZXF1aXJlcywgdmFsaWRhdGUgdGhlXG4gICAqIHByZXNlbmNlIGFuZCBmb3JtIG9mIHRob3NlIGZpZWxkcyBvbiB0aGUgcGFja2FnZS5qc29uIGRhdGEsIHRocm93aW5nIGFuIGVycm9yIGlmIGFueXRoaW5nIGlzXG4gICAqIGFtaXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXBwaXVtUGtnRGF0YSAtIHRoZSBkYXRhIGluIHRoZSBcImFwcGl1bVwiIGZpZWxkIG9mIHBhY2thZ2UuanNvbiBmb3IgYW5cbiAgICogZXh0ZW5zaW9uXG4gICAqL1xuICB2YWxpZGF0ZUV4dGVuc2lvbkZpZWxkcyAoLyphcHBpdW1Qa2dEYXRhKi8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYmUgaW1wbGVtZW50ZWQgaW4gZmluYWwgY2xhc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBVbmluc3RhbGxBcmdzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHQgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byB1bmluc3RhbGxcbiAgICovXG5cbiAgLyoqXG4gICAqIFVuaW5zdGFsbCBhbiBleHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtVbmluc3RhbGxBcmdzfSBhcmdzXG4gICAqIEByZXR1cm4ge29iamVjdH0gbWFwIG9mIGFsbCBpbnN0YWxsZWQgZXh0ZW5zaW9uIG5hbWVzIHRvIGV4dGVuc2lvbiBkYXRhXG4gICAqL1xuICBhc3luYyB1bmluc3RhbGwgKHtleHR9KSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChleHQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHVuaW5zdGFsbCAke3RoaXMudHlwZX0gJyR7ZXh0fSc7IGl0IGlzIG5vdCBpbnN0YWxsZWRgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZih0aGlzLmNvbmZpZy5nZXRJbnN0YWxsUGF0aChleHQpKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5jb25maWcucmVtb3ZlRXh0ZW5zaW9uKGV4dCk7XG4gICAgfVxuICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYFN1Y2Nlc3NmdWxseSB1bmluc3RhbGxlZCAke3RoaXMudHlwZX0gJyR7ZXh0fSdgLmdyZWVuKTtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBFeHRlbnNpb25VcGRhdGVPcHRzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHQgLSB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHRvIHVwZGF0ZVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IHVuc2FmZSAtIGlmIHRydWUsIHdpbGwgcGVyZm9ybSB1bnNhZmUgdXBkYXRlcyBwYXN0IG1ham9yIHJldmlzaW9uXG4gICAqIGJvdW5kYXJpZXNcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IFVwZGF0ZVJlcG9ydFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZnJvbSAtIHZlcnNpb24gdXBkYXRlZCBmcm9tXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0byAtIHZlcnNpb24gdXBkYXRlZCB0b1xuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXh0ZW5zaW9uVXBkYXRlUmVzdWx0XG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBlcnJvcnMgLSBtYXAgb2YgZXh0IG5hbWVzIHRvIGVycm9yIG9iamVjdHNcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHVwZGF0ZXMgLSBtYXAgb2YgZXh0IG5hbWVzIHRvIHtAbGluayBVcGRhdGVSZXBvcnR9c1xuICAgKi9cblxuICAvKipcbiAgICogQXR0ZW1wdCB0byB1cGRhdGUgb25lIG9yIG1vcmUgZHJpdmVycyB1c2luZyBOUE1cbiAgICpcbiAgICogQHBhcmFtIHtFeHRlbnNpb25VcGRhdGVPcHRzfSB1cGRhdGVTcGVjXG4gICAqIEByZXR1cm4ge0V4dGVuc2lvblVwZGF0ZVJlc3VsdH1cbiAgICovXG4gIGFzeW5jIHVwZGF0ZSAoe2V4dCwgdW5zYWZlfSkge1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUFsbCA9IGV4dCA9PT0gVVBEQVRFX0FMTDtcbiAgICAvLyBpZiB3ZSdyZSBzcGVjaWZpY2FsbHkgcmVxdWVzdGluZyBhbiB1cGRhdGUgZm9yIGFuIGV4dGVuc2lvbiwgbWFrZSBzdXJlIGl0J3MgaW5zdGFsbGVkXG4gICAgaWYgKCFzaG91bGRVcGRhdGVBbGwgJiYgIXRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKGV4dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSAnJHtleHR9JyB3YXMgbm90IGluc3RhbGxlZCwgc28gY2FuJ3QgYmUgdXBkYXRlZGApO1xuICAgIH1cbiAgICBjb25zdCBleHRzVG9VcGRhdGUgPSBzaG91bGRVcGRhdGVBbGwgPyBPYmplY3Qua2V5cyh0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zKSA6IFtleHRdO1xuXG4gICAgLy8gJ2Vycm9ycycgd2lsbCBoYXZlIGV4dCBuYW1lcyBhcyBrZXlzIGFuZCBlcnJvciBvYmplY3RzIGFzIHZhbHVlc1xuICAgIGNvbnN0IGVycm9ycyA9IHt9O1xuXG4gICAgLy8gJ3VwZGF0ZXMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgdXBkYXRlIG9iamVjdHMgYXMgdmFsdWVzLCB3aGVyZSBhbiB1cGRhdGVcbiAgICAvLyBvYmplY3QgaXMgb2YgdGhlIGZvcm0ge2Zyb206IHZlcnNpb25TdHJpbmcsIHRvOiB2ZXJzaW9uU3RyaW5nfVxuICAgIGNvbnN0IHVwZGF0ZXMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgZSBvZiBleHRzVG9VcGRhdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBgQ2hlY2tpbmcgaWYgJHt0aGlzLnR5cGV9ICcke2V9JyBpcyB1cGRhdGFibGVgLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZV0uaW5zdGFsbFR5cGUgIT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RVcGRhdGFibGVFcnJvcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZSA9IGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBgQ2hlY2tpbmcgaWYgJHt0aGlzLnR5cGV9ICcke2V9JyBuZWVkcyBhbiB1cGRhdGVgLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlID0gYXdhaXQgdGhpcy5jaGVja0ZvckV4dGVuc2lvblVwZGF0ZShlKTtcbiAgICAgICAgICBpZiAoISh1cGRhdGUuc2FmZVVwZGF0ZSB8fCB1cGRhdGUudW5zYWZlVXBkYXRlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1cGRhdGU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXVuc2FmZSAmJiAhdXBkYXRlLnNhZmVVcGRhdGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gJyR7ZX0nIGhhcyBhIG1ham9yIHJldmlzaW9uIHVwZGF0ZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYCgke3VwZGF0ZS5jdXJyZW50fSA9PiAke3VwZGF0ZS51bnNhZmVVcGRhdGV9KSwgd2hpY2ggY291bGQgaW5jbHVkZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYGJyZWFraW5nIGNoYW5nZXMuIElmIHlvdSB3YW50IHRvIGFwcGx5IHRoaXMgdXBkYXRlLCByZS1ydW4gd2l0aCAtLXVuc2FmZWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZVZlciA9IHVuc2FmZSAmJiB1cGRhdGUudW5zYWZlVXBkYXRlID8gdXBkYXRlLnVuc2FmZVVwZGF0ZSA6IHVwZGF0ZS5zYWZlVXBkYXRlO1xuICAgICAgICBhd2FpdCBzcGluV2l0aChcbiAgICAgICAgICB0aGlzLmlzSnNvbk91dHB1dCxcbiAgICAgICAgICBgVXBkYXRpbmcgZHJpdmVyICcke2V9JyBmcm9tICR7dXBkYXRlLmN1cnJlbnR9IHRvICR7dXBkYXRlVmVyfWAsXG4gICAgICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy51cGRhdGVFeHRlbnNpb24oZSwgdXBkYXRlVmVyKVxuICAgICAgICApO1xuICAgICAgICB1cGRhdGVzW2VdID0ge2Zyb206IHVwZGF0ZS5jdXJyZW50LCB0bzogdXBkYXRlVmVyfTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBlcnJvcnNbZV0gPSBlcnI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCAnVXBkYXRlIHJlcG9ydDonKTtcbiAgICBmb3IgKGNvbnN0IFtlLCB1cGRhdGVdIG9mIF8udG9QYWlycyh1cGRhdGVzKSkge1xuICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgLSAke3RoaXMudHlwZX0gJHtlfSB1cGRhdGVkOiAke3VwZGF0ZS5mcm9tfSA9PiAke3VwZGF0ZS50b31gLmdyZWVuKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbZSwgZXJyXSBvZiBfLnRvUGFpcnMoZXJyb3JzKSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdFVwZGF0YWJsZUVycm9yKSB7XG4gICAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYC0gJyR7ZX0nIHdhcyBub3QgaW5zdGFsbGVkIHZpYSBucG0sIHNvIHdlIGNvdWxkIG5vdCBjaGVjayBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZm9yIHVwZGF0ZXNgLnllbGxvdyk7XG4gICAgICB9IGVsc2UgaWYgKGVyciBpbnN0YW5jZW9mIE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yKSB7XG4gICAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYC0gJyR7ZX0nIGhhZCBubyB1cGRhdGVzIGF2YWlsYWJsZWAueWVsbG93KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSwgbWFrZSBpdCBwb3Agd2l0aCByZWQhXG4gICAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYC0gJyR7ZX0nIGZhaWxlZCB0byB1cGRhdGU6ICR7ZXJyfWAucmVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge3VwZGF0ZXMsIGVycm9yc307XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYgUG9zc2libGVVcGRhdGVzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjdXJyZW50IC0gY3VycmVudCB2ZXJzaW9uXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IHNhZmVVcGRhdGUgLSB2ZXJzaW9uIHdlIGNhbiBzYWZlbHkgdXBkYXRlIHRvIGlmIGl0IGV4aXN0cywgb3IgbnVsbFxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSB1bnNhZmVVcGRhdGUgLSB2ZXJzaW9uIHdlIGNhbiB1bnNhZmVseSB1cGRhdGUgdG8gaWYgaXQgZXhpc3RzLCBvciBudWxsXG4gICAqL1xuXG4gIC8qKlxuICAgKiBHaXZlbiBhbiBleHRlbnNpb24gbmFtZSwgZmlndXJlIG91dCB3aGF0IGl0cyBoaWdoZXN0IHBvc3NpYmxlIHZlcnNpb24gdXBncmFkZSBpcywgYW5kIGFsc28gdGhlXG4gICAqIGhpZ2hlc3QgcG9zc2libGUgc2FmZSB1cGdyYWRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0IC0gbmFtZSBvZiBleHRlbnNpb25cbiAgICogQHJldHVybiB7UG9zc2libGVVcGRhdGVzfVxuICAgKi9cbiAgYXN5bmMgY2hlY2tGb3JFeHRlbnNpb25VcGRhdGUgKGV4dCkge1xuICAgIC8vIFRPRE8gZGVjaWRlIGhvdyB3ZSB3YW50IHRvIGhhbmRsZSBiZXRhIHZlcnNpb25zP1xuICAgIC8vIHRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kLCAnZXh0JyBpcyBhc3N1bWVkIHRvIGFscmVhZHkgYmUgaW5zdGFsbGVkIGhlcmUsIGFuZCBvZiB0aGUgbnBtXG4gICAgLy8gaW5zdGFsbCB0eXBlXG4gICAgY29uc3Qge3ZlcnNpb24sIHBrZ05hbWV9ID0gdGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHRdO1xuICAgIGxldCB1bnNhZmVVcGRhdGUgPSBhd2FpdCB0aGlzLm5wbS5nZXRMYXRlc3RWZXJzaW9uKHBrZ05hbWUpO1xuICAgIGxldCBzYWZlVXBkYXRlID0gYXdhaXQgdGhpcy5ucG0uZ2V0TGF0ZXN0U2FmZVVwZ3JhZGVWZXJzaW9uKHBrZ05hbWUsIHZlcnNpb24pO1xuICAgIGlmICghdXRpbC5jb21wYXJlVmVyc2lvbnModW5zYWZlVXBkYXRlLCAnPicsIHZlcnNpb24pKSB7XG4gICAgICAvLyB0aGUgbGF0ZXN0IHZlcnNpb24gaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB2ZXJzaW9uLCBzbyB0aGVyZSdzIG5vIHBvc3NpYmxlIHVwZGF0ZVxuICAgICAgdW5zYWZlVXBkYXRlID0gbnVsbDtcbiAgICAgIHNhZmVVcGRhdGUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodW5zYWZlVXBkYXRlICYmIHVuc2FmZVVwZGF0ZSA9PT0gc2FmZVVwZGF0ZSkge1xuICAgICAgLy8gdGhlIGxhdGVzdCB1cGRhdGUgaXMgdGhlIHNhbWUgYXMgdGhlIHNhZmUgdXBkYXRlLCB3aGljaCBtZWFucyBpdCdzIG5vdCBhY3R1YWxseSB1bnNhZmVcbiAgICAgIHVuc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChzYWZlVXBkYXRlICYmICF1dGlsLmNvbXBhcmVWZXJzaW9ucyhzYWZlVXBkYXRlLCAnPicsIHZlcnNpb24pKSB7XG4gICAgICAvLyBldmVuIHRoZSBzYWZlIHVwZGF0ZSBpcyBub3QgbGF0ZXIgdGhhbiB0aGUgY3VycmVudCwgc28gaXQgaXMgbm90IGFjdHVhbGx5IGFuIHVwZGF0ZVxuICAgICAgc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7Y3VycmVudDogdmVyc2lvbiwgc2FmZVVwZGF0ZSwgdW5zYWZlVXBkYXRlfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3R1YWxseSB1cGRhdGUgYW4gZXh0ZW5zaW9uIGluc3RhbGxlZCBieSBOUE0sIHVzaW5nIHRoZSBOUE0gY2xpLiBBbmQgdXBkYXRlIHRoZSBpbnN0YWxsYXRpb25cbiAgICogbWFuaWZlc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHQgLSBuYW1lIG9mIGV4dGVuc2lvbiB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSB2ZXJzaW9uIHN0cmluZyBpZGVudGlmaWVyIHRvIHVwZGF0ZSBleHRlbnNpb24gdG9cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUV4dGVuc2lvbiAoZXh0LCB2ZXJzaW9uKSB7XG4gICAgY29uc3Qge3BrZ05hbWV9ID0gdGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHRdO1xuICAgIGF3YWl0IHRoaXMuaW5zdGFsbFZpYU5wbSh7ZXh0LCBwa2dOYW1lLCBwa2dWZXI6IHZlcnNpb259KTtcbiAgICB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dF0udmVyc2lvbiA9IHZlcnNpb247XG4gICAgYXdhaXQgdGhpcy5jb25maWcud3JpdGUoKTtcbiAgfVxufVxuIl0sImZpbGUiOiJsaWIvY2xpL2V4dGVuc2lvbi1jb21tYW5kLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|
|
532
|
+
exports.ExtensionCommand = ExtensionCommand;
|
|
533
|
+
var _default = ExtensionCommand;
|
|
534
|
+
exports.default = _default;
|
|
535
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJVUERBVEVfQUxMIiwiTm90VXBkYXRhYmxlRXJyb3IiLCJFcnJvciIsIk5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIiwiRXh0ZW5zaW9uQ29tbWFuZCIsImNvbmZpZyIsImtub3duRXh0ZW5zaW9ucyIsImlzSnNvbk91dHB1dCIsImNvbnN0cnVjdG9yIiwianNvbiIsImxvZyIsImNvbnNvbGUiLCJDbGlDb25zb2xlIiwianNvbk1vZGUiLCJCb29sZWFuIiwidHlwZSIsImV4dGVuc2lvblR5cGUiLCJfY3JlYXRlRmF0YWxFcnJvciIsIm1lc3NhZ2UiLCJkZWNvcmF0ZSIsImV4ZWN1dGUiLCJhcmdzIiwiY21kIiwiXyIsImlzRnVuY3Rpb24iLCJleGVjdXRlQ21kIiwiYmluZCIsImxpc3QiLCJzaG93SW5zdGFsbGVkIiwic2hvd1VwZGF0ZXMiLCJsc01zZyIsImluc3RhbGxlZE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJrbm93bk5hbWVzIiwiZXh0cyIsInJlZHVjZSIsImFjYyIsIm5hbWUiLCJpbmNsdWRlcyIsImluc3RhbGxlZCIsInBrZ05hbWUiLCJzcGluV2l0aCIsImV4dCIsImRhdGEiLCJ0b1BhaXJzIiwiaW5zdGFsbFR5cGUiLCJJTlNUQUxMX1RZUEVfTlBNIiwidXBkYXRlcyIsImNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlIiwidXBkYXRlVmVyc2lvbiIsInNhZmVVcGRhdGUiLCJ1bnNhZmVVcGRhdGVWZXJzaW9uIiwidW5zYWZlVXBkYXRlIiwidXBUb0RhdGUiLCJsaXN0RGF0YSIsImluc3RhbGxUeHQiLCJncmV5IiwidXBkYXRlVHh0IiwidXBUb0RhdGVUeHQiLCJ1bnNhZmVVcGRhdGVUeHQiLCJpbnN0YWxsU3BlYyIsInZlcnNpb24iLCJ0eXBlVHh0IiwiSU5TVEFMTF9UWVBFX0dJVCIsIklOU1RBTExfVFlQRV9HSVRIVUIiLCJ5ZWxsb3ciLCJJTlNUQUxMX1RZUEVfTE9DQUwiLCJtYWdlbnRhIiwiZ3JlZW4iLCJjeWFuIiwiX2luc3RhbGwiLCJwYWNrYWdlTmFtZSIsImV4dERhdGEiLCJpbnN0YWxsT3B0cyIsInByb2JhYmxlRXh0TmFtZSIsInNwbGl0IiwibGVuZ3RoIiwicmVwbGFjZSIsInBrZ1ZlciIsInBhdGgiLCJpc0Fic29sdXRlIiwicmVzb2x2ZSIsInNwbGl0cyIsIm1zZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJpc0luc3RhbGxlZCIsImluc3RhbGxWaWFOcG0iLCJleHROYW1lIiwiZXh0TWFuaWZlc3QiLCJlcnJvcnMiLCJ3YXJuaW5ncyIsIkIiLCJhbGwiLCJnZXRQcm9ibGVtcyIsImdldFdhcm5pbmdzIiwiZXJyb3JNYXAiLCJNYXAiLCJ3YXJuaW5nTWFwIiwiZXJyb3JTdW1tYXJpZXMiLCJ3YXJuaW5nU3VtbWFyaWVzIiwiZ2V0VmFsaWRhdGlvblJlc3VsdFN1bW1hcmllcyIsImlzRW1wdHkiLCJqb2luIiwid2FybiIsImFkZEV4dGVuc2lvbiIsImVudiIsImhhc0FwcGl1bURlcGVuZGVuY3kiLCJhcHBpdW1Ib21lIiwicGFja2FnZURpZENoYW5nZSIsImluZm8iLCJnZXRQb3N0SW5zdGFsbFRleHQiLCJucG1TcGVjIiwic3BlY01zZyIsInBrZ0pzb25EYXRhIiwibnBtIiwiaW5zdGFsbFBhY2thZ2UiLCJ2YWxpZGF0ZVBhY2thZ2VKc29uIiwiZ2V0RXh0ZW5zaW9uRmllbGRzIiwiZXJyIiwicGtnSnNvbiIsImFwcGl1bSIsInBlZXJEZXBlbmRlbmNpZXMiLCJyZXN1bHQiLCJhcHBpdW1WZXJzaW9uIiwiY3JlYXRlTWlzc2luZ0ZpZWxkRXJyb3IiLCJmaWVsZCIsIlJlZmVyZW5jZUVycm9yIiwidmFsaWRhdGVFeHRlbnNpb25GaWVsZHMiLCJleHRNZXRhZGF0YSIsIl91bmluc3RhbGwiLCJ1bmluc3RhbGxQYWNrYWdlIiwicmVtb3ZlRXh0ZW5zaW9uIiwib2siLCJfdXBkYXRlIiwidW5zYWZlIiwic2hvdWxkVXBkYXRlQWxsIiwiZXh0c1RvVXBkYXRlIiwiZSIsInVwZGF0ZSIsImN1cnJlbnQiLCJ1cGRhdGVWZXIiLCJ1cGRhdGVFeHRlbnNpb24iLCJmcm9tIiwidG8iLCJlcnJvciIsInJlZCIsImdldExhdGVzdFZlcnNpb24iLCJnZXRMYXRlc3RTYWZlVXBncmFkZVZlcnNpb24iLCJ1dGlsIiwiY29tcGFyZVZlcnNpb25zIiwiX3J1biIsInNjcmlwdE5hbWUiLCJleHRyYUFyZ3MiLCJleHRDb25maWciLCJzY3JpcHRzIiwiZXh0U2NyaXB0cyIsImlzUGxhaW5PYmplY3QiLCJoYXMiLCJydW5uZXIiLCJTdWJQcm9jZXNzIiwicHJvY2VzcyIsImV4ZWNQYXRoIiwiY3dkIiwiZ2V0SW5zdGFsbFBhdGgiLCJvdXRwdXQiLCJSaW5nQnVmZmVyIiwib24iLCJsaW5lIiwiZW5xdWV1ZSIsInN0YXJ0IiwiZ2V0QnVmZiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtucG0sIHV0aWwsIGVudiwgY29uc29sZX0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7c3BpbldpdGgsIFJpbmdCdWZmZXJ9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtTdWJQcm9jZXNzfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHtcbiAgSU5TVEFMTF9UWVBFX05QTSxcbiAgSU5TVEFMTF9UWVBFX0dJVCxcbiAgSU5TVEFMTF9UWVBFX0dJVEhVQixcbiAgSU5TVEFMTF9UWVBFX0xPQ0FMLFxufSBmcm9tICcuLi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQge3BhY2thZ2VEaWRDaGFuZ2V9IGZyb20gJy4uL2V4dGVuc2lvbi9wYWNrYWdlLWNoYW5nZWQnO1xuXG5jb25zdCBVUERBVEVfQUxMID0gJ2luc3RhbGxlZCc7XG5cbmNsYXNzIE5vdFVwZGF0YWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cbmNsYXNzIE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqL1xuY2xhc3MgRXh0ZW5zaW9uQ29tbWFuZCB7XG4gIC8qKlxuICAgKiBUaGlzIGlzIHRoZSBgRHJpdmVyQ29uZmlnYCBvciBgUGx1Z2luQ29uZmlnYCwgZGVwZW5kaW5nIG9uIGBFeHRUeXBlYC5cbiAgICogQHR5cGUge0V4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn1cbiAgICovXG4gIGNvbmZpZztcblxuICAvKipcbiAgICoge0BsaW5rY29kZSBSZWNvcmR9IG9mIG9mZmljaWFsIHBsdWdpbnMgb3IgZHJpdmVycy5cbiAgICogQHR5cGUge0tub3duRXh0ZW5zaW9uczxFeHRUeXBlPn1cbiAgICovXG4gIGtub3duRXh0ZW5zaW9ucztcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBjb21tYW5kIG91dHB1dCBoYXMgYmVlbiByZXF1ZXN0ZWQgYXMgSlNPTi5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBpc0pzb25PdXRwdXQ7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIEV4dGVuc2lvbkNvbW1hbmRcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Db21tYW5kT3B0aW9uczxFeHRUeXBlPn0gb3B0c1xuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZywganNvbn0pIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLmxvZyA9IG5ldyBjb25zb2xlLkNsaUNvbnNvbGUoe2pzb25Nb2RlOiBqc29ufSk7XG4gICAgdGhpcy5pc0pzb25PdXRwdXQgPSBCb29sZWFuKGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIGBkcml2ZXJgIG9yIGBwbHVnaW5gLCBkZXBlbmRpbmcgb24gdGhlIGBFeHRlbnNpb25Db25maWdgLlxuICAgKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmV4dGVuc2lvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBhIG1lc3NhZ2UgYW5kIHJldHVybnMgYW4ge0BsaW5rY29kZSBFcnJvcn0gdG8gdGhyb3cuXG4gICAqXG4gICAqIEZvciBUUyB0byB1bmRlcnN0YW5kIHRoYXQgYSBmdW5jdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uLCBpdCBtdXN0IGFjdHVhbGx5IHRocm93IGFuIGV4Y2VwdGlvbi0tXG4gICAqIGluIG90aGVyIHdvcmRzLCBfY2FsbGluZ18gYSBmdW5jdGlvbiB3aGljaCBpcyBndWFyYW50ZWVkIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBpcyBub3QgZW5vdWdoLS1cbiAgICogbm9yIGlzIHNvbWV0aGluZyBsaWtlIGBAcmV0dXJucyB7bmV2ZXJ9YCB3aGljaCBkb2VzIG5vdCBpbXBseSBhIHRocm93biBleGNlcHRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHJldHVybnMge0Vycm9yfVxuICAgKi9cbiAgX2NyZWF0ZUZhdGFsRXJyb3IobWVzc2FnZSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IodGhpcy5sb2cuZGVjb3JhdGUobWVzc2FnZSwgJ2Vycm9yJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYSBDTEkgcGFyc2UgYW5kIHJ1biBhbiBleHRlbnNpb24gY29tbWFuZCBiYXNlZCBvbiBpdHMgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIGEga2V5L3ZhbHVlIG9iamVjdCB3aXRoIENMSSBmbGFncyBhbmQgdmFsdWVzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8b2JqZWN0Pn0gdGhlIHJlc3VsdCBvZiB0aGUgc3BlY2lmaWMgY29tbWFuZCB3aGljaCBpcyBleGVjdXRlZFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShhcmdzKSB7XG4gICAgY29uc3QgY21kID0gYXJnc1tgJHt0aGlzLnR5cGV9Q29tbWFuZGBdO1xuICAgIGlmICghXy5pc0Z1bmN0aW9uKHRoaXNbY21kXSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYENhbm5vdCBoYW5kbGUgJHt0aGlzLnR5cGV9IGNvbW1hbmQgJHtjbWR9YCk7XG4gICAgfVxuICAgIGNvbnN0IGV4ZWN1dGVDbWQgPSB0aGlzW2NtZF0uYmluZCh0aGlzKTtcbiAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZUNtZChhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGV4dGVuc2lvbnNcbiAgICpcbiAgICogQHBhcmFtIHtMaXN0T3B0aW9uc30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dGVuc2lvbkxpc3REYXRhPn0gbWFwIG9mIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgbGlzdCh7c2hvd0luc3RhbGxlZCwgc2hvd1VwZGF0ZXN9KSB7XG4gICAgY29uc3QgbHNNc2cgPSBgTGlzdGluZyAke3Nob3dJbnN0YWxsZWQgPyAnaW5zdGFsbGVkJyA6ICdhdmFpbGFibGUnfSAke3RoaXMudHlwZX1zYDtcbiAgICBjb25zdCBpbnN0YWxsZWROYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnMpO1xuICAgIGNvbnN0IGtub3duTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmtub3duRXh0ZW5zaW9ucyk7XG4gICAgY29uc3QgZXh0cyA9IFsuLi5pbnN0YWxsZWROYW1lcywgLi4ua25vd25OYW1lc10ucmVkdWNlKFxuICAgICAgKGFjYywgbmFtZSkgPT4ge1xuICAgICAgICBpZiAoIWFjY1tuYW1lXSkge1xuICAgICAgICAgIGlmIChpbnN0YWxsZWROYW1lcy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgICAgYWNjW25hbWVdID0ge1xuICAgICAgICAgICAgICAuLi50aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW25hbWVdLFxuICAgICAgICAgICAgICBpbnN0YWxsZWQ6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXNob3dJbnN0YWxsZWQpIHtcbiAgICAgICAgICAgIGFjY1tuYW1lXSA9IHtwa2dOYW1lOiB0aGlzLmtub3duRXh0ZW5zaW9uc1tuYW1lXSwgaW5zdGFsbGVkOiBmYWxzZX07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBUaGlzIGFjY3VtdWxhdG9yIGNvbnRhaW5zIGVpdGhlciB7QGxpbmtjb2RlIFVuaW5zdGFsbGVkRXh0ZW5zaW9uTElzdERhdGF9IF9vcl9cbiAgICAgICAqIHtAbGlua2NvZGUgSW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGF9IHdpdGhvdXQgdXBncmFkZSBpbmZvcm1hdGlvbiAod2hpY2ggaXMgYWRkZWQgYnkgdGhlIGJlbG93IGNvZGUgYmxvY2spXG4gICAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxQYXJ0aWFsPEluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhPnxVbmluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhPn1cbiAgICAgICAqLyAoe30pXG4gICAgKTtcblxuICAgIC8vIGlmIHdlIHdhbnQgdG8gc2hvdyB3aGV0aGVyIHVwZGF0ZXMgYXJlIGF2YWlsYWJsZSwgcHV0IHRoYXQgYmVoaW5kIGEgc3Bpbm5lclxuICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBsc01zZywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzaG93VXBkYXRlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtleHQsIGRhdGFdIG9mIF8udG9QYWlycyhleHRzKSkge1xuICAgICAgICBpZiAoIWRhdGEuaW5zdGFsbGVkIHx8IGRhdGEuaW5zdGFsbFR5cGUgIT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAvLyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzIG9uIGV4dHMgdGhhdCBhcmVuJ3QgaW5zdGFsbGVkXG4gICAgICAgICAgLy8gYWxzbyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzIG9uIG5vbi1ucG0gZXh0c1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZXMgPSBhd2FpdCB0aGlzLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlKGV4dCk7XG4gICAgICAgIGRhdGEudXBkYXRlVmVyc2lvbiA9IHVwZGF0ZXMuc2FmZVVwZGF0ZTtcbiAgICAgICAgZGF0YS51bnNhZmVVcGRhdGVWZXJzaW9uID0gdXBkYXRlcy51bnNhZmVVcGRhdGU7XG4gICAgICAgIGRhdGEudXBUb0RhdGUgPSB1cGRhdGVzLnNhZmVVcGRhdGUgPT09IG51bGwgJiYgdXBkYXRlcy51bnNhZmVVcGRhdGUgPT09IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBsaXN0RGF0YSA9IC8qKiBAdHlwZSB7RXh0ZW5zaW9uTGlzdERhdGF9ICovIChleHRzKTtcblxuICAgIC8vIGlmIHdlJ3JlIGp1c3QgZ2V0dGluZyB0aGUgZGF0YSwgc2hvcnQgY2lyY3VpdCByZXR1cm4gaGVyZSBzaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueVxuICAgIC8vIGZvcm1hdHRpbmcgbG9naWNcbiAgICBpZiAodGhpcy5pc0pzb25PdXRwdXQpIHtcbiAgICAgIHJldHVybiBsaXN0RGF0YTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBkYXRhXSBvZiBfLnRvUGFpcnMobGlzdERhdGEpKSB7XG4gICAgICBsZXQgaW5zdGFsbFR4dCA9ICcgW25vdCBpbnN0YWxsZWRdJy5ncmV5O1xuICAgICAgbGV0IHVwZGF0ZVR4dCA9ICcnO1xuICAgICAgbGV0IHVwVG9EYXRlVHh0ID0gJyc7XG4gICAgICBsZXQgdW5zYWZlVXBkYXRlVHh0ID0gJyc7XG4gICAgICBpZiAoZGF0YS5pbnN0YWxsZWQpIHtcbiAgICAgICAgY29uc3Qge2luc3RhbGxUeXBlLCBpbnN0YWxsU3BlYywgdXBkYXRlVmVyc2lvbiwgdW5zYWZlVXBkYXRlVmVyc2lvbiwgdmVyc2lvbiwgdXBUb0RhdGV9ID1cbiAgICAgICAgICBkYXRhO1xuICAgICAgICBsZXQgdHlwZVR4dDtcbiAgICAgICAgc3dpdGNoIChpbnN0YWxsVHlwZSkge1xuICAgICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0dJVDpcbiAgICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9HSVRIVUI6XG4gICAgICAgICAgICB0eXBlVHh0ID0gYChjbG9uZWQgZnJvbSAke2luc3RhbGxTcGVjfSlgLnllbGxvdztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0xPQ0FMOlxuICAgICAgICAgICAgdHlwZVR4dCA9IGAobGlua2VkIGZyb20gJHtpbnN0YWxsU3BlY30pYC5tYWdlbnRhO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHR5cGVUeHQgPSAnKE5QTSknO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbGxUeHQgPSBgQCR7dmVyc2lvbi55ZWxsb3d9ICR7KCdbaW5zdGFsbGVkICcgKyB0eXBlVHh0ICsgJ10nKS5ncmVlbn1gO1xuXG4gICAgICAgIGlmIChzaG93VXBkYXRlcykge1xuICAgICAgICAgIGlmICh1cGRhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgICB1cGRhdGVUeHQgPSBgIFske3VwZGF0ZVZlcnNpb259IGF2YWlsYWJsZV1gLm1hZ2VudGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1cFRvRGF0ZSkge1xuICAgICAgICAgICAgdXBUb0RhdGVUeHQgPSBgIFtVcCB0byBkYXRlXWAuZ3JlZW47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1bnNhZmVVcGRhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgICB1bnNhZmVVcGRhdGVUeHQgPSBgIFske3Vuc2FmZVVwZGF0ZVZlcnNpb259IGF2YWlsYWJsZSAocG90ZW50aWFsbHkgdW5zYWZlKV1gLmN5YW47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nLmxvZyhgLSAke25hbWUueWVsbG93fSR7aW5zdGFsbFR4dH0ke3VwZGF0ZVR4dH0ke3VwVG9EYXRlVHh0fSR7dW5zYWZlVXBkYXRlVHh0fWApO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0RGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGFuIGV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxBcmdzfSBhcmdzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RXh0UmVjb3JkPEV4dFR5cGU+Pn0gbWFwIG9mIGFsbCBpbnN0YWxsZWQgZXh0ZW5zaW9uIG5hbWVzIHRvIGV4dGVuc2lvbiBkYXRhXG4gICAqL1xuICBhc3luYyBfaW5zdGFsbCh7aW5zdGFsbFNwZWMsIGluc3RhbGxUeXBlLCBwYWNrYWdlTmFtZX0pIHtcbiAgICAvKiogQHR5cGUge0V4dGVuc2lvbkZpZWxkczxFeHRUeXBlPn0gKi9cbiAgICBsZXQgZXh0RGF0YTtcblxuICAgIGlmIChwYWNrYWdlTmFtZSAmJiBbSU5TVEFMTF9UWVBFX0xPQ0FMLCBJTlNUQUxMX1RZUEVfTlBNXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYFdoZW4gdXNpbmcgLS1zb3VyY2U9JHtpbnN0YWxsVHlwZX0sIGNhbm5vdCBhbHNvIHVzZSAtLXBhY2thZ2VgKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhY2thZ2VOYW1lICYmIFtJTlNUQUxMX1RZUEVfR0lULCBJTlNUQUxMX1RZUEVfR0lUSFVCXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYFdoZW4gdXNpbmcgLS1zb3VyY2U9JHtpbnN0YWxsVHlwZX0sIG11c3QgYWxzbyB1c2UgLS1wYWNrYWdlYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0luc3RhbGxWaWFOcG1BcmdzfVxuICAgICAqL1xuICAgIGxldCBpbnN0YWxsT3B0cztcblxuICAgIC8qKlxuICAgICAqIFRoZSBwcm9iYWJsZSAoPykgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGRlcml2ZWQgZnJvbSB0aGUgaW5zdGFsbCBzcGVjLlxuICAgICAqXG4gICAgICogSWYgdXNpbmcgYSBsb2NhbCBpbnN0YWxsIHR5cGUsIHRoaXMgd2lsbCByZW1haW4gZW1wdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBsZXQgcHJvYmFibGVFeHROYW1lID0gJyc7XG5cbiAgICAvLyBkZXBlbmRpbmcgb24gYGluc3RhbGxUeXBlYCwgYnVpbGQgdGhlIG9wdGlvbnMgdG8gcGFzcyBpbnRvIGBpbnN0YWxsVmlhTnBtYFxuICAgIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX0dJVEhVQikge1xuICAgICAgaWYgKGluc3RhbGxTcGVjLnNwbGl0KCcvJykubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgICAgYEdpdGh1YiAke3RoaXMudHlwZX0gc3BlYyAke2luc3RhbGxTcGVjfSBhcHBlYXJlZCB0byBiZSBpbnZhbGlkOyBgICtcbiAgICAgICAgICAgICdpdCBzaG91bGQgYmUgb2YgdGhlIGZvcm0gPG9yZz4vPHJlcG8+J1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaW5zdGFsbE9wdHMgPSB7XG4gICAgICAgIGluc3RhbGxTcGVjLFxuICAgICAgICBwa2dOYW1lOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhY2thZ2VOYW1lKSxcbiAgICAgIH07XG4gICAgICBwcm9iYWJsZUV4dE5hbWUgPSBpbnN0YWxsU3BlYztcbiAgICB9IGVsc2UgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfR0lUKSB7XG4gICAgICAvLyBnaXQgdXJscyBjYW4gaGF2ZSAnLmdpdCcgYXQgdGhlIGVuZCwgYnV0IHRoaXMgaXMgbm90IG5lY2Vzc2FyeSBhbmQgd291bGQgY29tcGxpY2F0ZSB0aGVcbiAgICAgIC8vIHdheSB3ZSBkb3dubG9hZCBhbmQgbmFtZSBkaXJlY3Rvcmllcywgc28gd2UgY2FuIGp1c3QgcmVtb3ZlIGl0XG4gICAgICBpbnN0YWxsU3BlYyA9IGluc3RhbGxTcGVjLnJlcGxhY2UoL1xcLmdpdCQvLCAnJyk7XG4gICAgICBpbnN0YWxsT3B0cyA9IHtcbiAgICAgICAgaW5zdGFsbFNwZWMsXG4gICAgICAgIHBrZ05hbWU6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGFja2FnZU5hbWUpLFxuICAgICAgfTtcbiAgICAgIHByb2JhYmxlRXh0TmFtZSA9IGluc3RhbGxTcGVjO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcGtnTmFtZSwgcGtnVmVyO1xuICAgICAgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfTE9DQUwpIHtcbiAgICAgICAgcGtnTmFtZSA9IHBhdGguaXNBYnNvbHV0ZShpbnN0YWxsU3BlYykgPyBpbnN0YWxsU3BlYyA6IHBhdGgucmVzb2x2ZShpbnN0YWxsU3BlYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhdCB0aGlzIHBvaW50IHdlIGhhdmUgZWl0aGVyIGFuIG5wbSBwYWNrYWdlIG9yIGFuIGFwcGl1bSB2ZXJpZmllZCBleHRlbnNpb25cbiAgICAgICAgLy8gbmFtZSBvciBhIGxvY2FsIHBhdGguIGJvdGggb2Ygd2hpY2ggd2lsbCBiZSBpbnN0YWxsZWQgdmlhIG5wbS5cbiAgICAgICAgLy8gZXh0ZW5zaW9ucyBpbnN0YWxsZWQgdmlhIG5wbSBjYW4gaW5jbHVkZSB2ZXJzaW9ucyBvciB0YWdzIGFmdGVyIHRoZSAnQCdcbiAgICAgICAgLy8gc2lnbiwgc28gY2hlY2sgZm9yIHRoYXQuIFdlIGFsc28gbmVlZCB0byBiZSBjYXJlZnVsIHRoYXQgcGFja2FnZSBuYW1lcyB0aGVtc2VsdmVzIGNhblxuICAgICAgICAvLyBjb250YWluIHRoZSAnQCcgc3ltYm9sLCBhcyBpbiBgbnBtIGluc3RhbGwgQGFwcGl1bS9mYWtlLWRyaXZlckAxLjIuMGBcbiAgICAgICAgbGV0IG5hbWU7XG4gICAgICAgIGNvbnN0IHNwbGl0cyA9IGluc3RhbGxTcGVjLnNwbGl0KCdAJyk7XG4gICAgICAgIGlmIChpbnN0YWxsU3BlY1swXSA9PT0gJ0AnKSB7XG4gICAgICAgICAgLy8gdGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIGFuIG5wbSBvcmcgaW5jbHVkZWQgaW4gdGhlIHBhY2thZ2UgbmFtZVxuICAgICAgICAgIFtuYW1lLCBwa2dWZXJdID0gW2BAJHtzcGxpdHNbMV19YCwgc3BsaXRzWzJdXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBjYXNlIHdpdGhvdXQgYW4gbnBtIG9yZ1xuICAgICAgICAgIFtuYW1lLCBwa2dWZXJdID0gc3BsaXRzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfTlBNKSB7XG4gICAgICAgICAgLy8gaWYgd2UncmUgaW5zdGFsbGluZyBhIG5hbWVkIHBhY2thZ2UgZnJvbSBucG0sIHdlIGRvbid0IG5lZWQgdG8gY2hlY2tcbiAgICAgICAgICAvLyBhZ2FpbnN0IHRoZSBhcHBpdW0gZXh0ZW5zaW9uIGxpc3Q7IGp1c3QgdXNlIHRoZSBpbnN0YWxsU3BlYyBhcyBpc1xuICAgICAgICAgIHBrZ05hbWUgPSBuYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGlmIHdlJ3JlIGluc3RhbGxpbmcgYSBuYW1lZCBhcHBpdW0gZHJpdmVyIChsaWtlICd4Y3VpdGVzdCcpIHdlIG5lZWQgdG9cbiAgICAgICAgICAvLyBkZXJlZmVyZW5jZSB0aGUgYWN0dWFsIG5wbSBwYWNrYWdlICgnYXBwaXVwbS14Y3VpdGVzdC1kcml2ZXInKSwgc29cbiAgICAgICAgICAvLyBjaGVjayBpdCBleGlzdHMgYW5kIGdldCB0aGUgY29ycmVjdCBwYWNrYWdlXG4gICAgICAgICAgY29uc3Qga25vd25OYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMua25vd25FeHRlbnNpb25zKTtcbiAgICAgICAgICBpZiAoIV8uaW5jbHVkZXMoa25vd25OYW1lcywgbmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9XG4gICAgICAgICAgICAgIGBDb3VsZCBub3QgcmVzb2x2ZSAke3RoaXMudHlwZX07IGFyZSB5b3Ugc3VyZSBpdCdzIGluIHRoZSBsaXN0IGAgK1xuICAgICAgICAgICAgICBgb2Ygc3VwcG9ydGVkICR7dGhpcy50eXBlfXM/ICR7SlNPTi5zdHJpbmdpZnkoa25vd25OYW1lcyl9YDtcbiAgICAgICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IobXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJvYmFibGVFeHROYW1lID0gbmFtZTtcbiAgICAgICAgICBwa2dOYW1lID0gdGhpcy5rbm93bkV4dGVuc2lvbnNbbmFtZV07XG4gICAgICAgICAgLy8gZ2l2ZW4gdGhhdCB3ZSdsbCB1c2UgdGhlIGluc3RhbGwgdHlwZSBpbiB0aGUgZHJpdmVyIGpzb24sIHN0b3JlIGl0IGFzXG4gICAgICAgICAgLy8gJ25wbScgbm93XG4gICAgICAgICAgaW5zdGFsbFR5cGUgPSBJTlNUQUxMX1RZUEVfTlBNO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpbnN0YWxsT3B0cyA9IHtpbnN0YWxsU3BlYywgcGtnTmFtZSwgcGtnVmVyfTtcbiAgICB9XG5cbiAgICAvLyBmYWlsIGZhc3QgaGVyZSBpZiB3ZSBjYW5cbiAgICBpZiAocHJvYmFibGVFeHROYW1lICYmIHRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKHByb2JhYmxlRXh0TmFtZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgIGBBICR7dGhpcy50eXBlfSBuYW1lZCBcIiR7cHJvYmFibGVFeHROYW1lfVwiIGlzIGFscmVhZHkgaW5zdGFsbGVkLiBgICtcbiAgICAgICAgICBgRGlkIHlvdSBtZWFuIHRvIHVwZGF0ZT8gUnVuIFwiYXBwaXVtICR7dGhpcy50eXBlfSB1cGRhdGVcIi4gU2VlIGAgK1xuICAgICAgICAgIGBpbnN0YWxsZWQgJHt0aGlzLnR5cGV9cyB3aXRoIFwiYXBwaXVtICR7dGhpcy50eXBlfSBsaXN0IC0taW5zdGFsbGVkXCIuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKGluc3RhbGxPcHRzKTtcblxuICAgIC8vIHRoaXMgX3Nob3VsZF8gYmUgdGhlIHNhbWUgYXMgYHByb2JhYmx5RXh0TmFtZWAgYXMgdGhlIG9uZSBkZXJpdmVkIGFib3ZlIHVubGVzc1xuICAgIC8vIGluc3RhbGwgdHlwZSBpcyBsb2NhbC5cbiAgICBjb25zdCBleHROYW1lID0gZXh0RGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8gKGAke3RoaXMudHlwZX1OYW1lYCldO1xuXG4gICAgLy8gY2hlY2sgX2Egc2Vjb25kIHRpbWVfIHdpdGggdGhlIG1vcmUtYWNjdXJhdGUgZXh0TmFtZVxuICAgIGlmICh0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChleHROYW1lKSkge1xuICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRmF0YWxFcnJvcihcbiAgICAgICAgYEEgJHt0aGlzLnR5cGV9IG5hbWVkIFwiJHtleHROYW1lfVwiIGlzIGFscmVhZHkgaW5zdGFsbGVkLiBgICtcbiAgICAgICAgICBgRGlkIHlvdSBtZWFuIHRvIHVwZGF0ZT8gUnVuIFwiYXBwaXVtICR7dGhpcy50eXBlfSB1cGRhdGVcIi4gU2VlIGAgK1xuICAgICAgICAgIGBpbnN0YWxsZWQgJHt0aGlzLnR5cGV9cyB3aXRoIFwiYXBwaXVtICR7dGhpcy50eXBlfSBsaXN0IC0taW5zdGFsbGVkXCIuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGZpZWxkIGRvZXMgbm90IGV4aXN0IGFzIHN1Y2ggaW4gdGhlIG1hbmlmZXN0IChpdCdzIHVzZWQgYXMgYSBwcm9wZXJ0eSBuYW1lIGluc3RlYWQpXG4gICAgLy8gc28gdGhhdCdzIHdoeSBpdCdzIGJlaW5nIHJlbW92ZWQgaGVyZS5cbiAgICBkZWxldGUgZXh0RGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8gKGAke3RoaXMudHlwZX1OYW1lYCldO1xuXG4gICAgLyoqIEB0eXBlIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gKi9cbiAgICBjb25zdCBleHRNYW5pZmVzdCA9IHsuLi5leHREYXRhLCBpbnN0YWxsVHlwZSwgaW5zdGFsbFNwZWN9O1xuICAgIGNvbnN0IFtlcnJvcnMsIHdhcm5pbmdzXSA9IGF3YWl0IEIuYWxsKFtcbiAgICAgIHRoaXMuY29uZmlnLmdldFByb2JsZW1zKGV4dE5hbWUsIGV4dE1hbmlmZXN0KSxcbiAgICAgIHRoaXMuY29uZmlnLmdldFdhcm5pbmdzKGV4dE5hbWUsIGV4dE1hbmlmZXN0KSxcbiAgICBdKTtcbiAgICBjb25zdCBlcnJvck1hcCA9IG5ldyBNYXAoW1tleHROYW1lLCBlcnJvcnNdXSk7XG4gICAgY29uc3Qgd2FybmluZ01hcCA9IG5ldyBNYXAoW1tleHROYW1lLCB3YXJuaW5nc11dKTtcbiAgICBjb25zdCB7ZXJyb3JTdW1tYXJpZXMsIHdhcm5pbmdTdW1tYXJpZXN9ID0gdGhpcy5jb25maWcuZ2V0VmFsaWRhdGlvblJlc3VsdFN1bW1hcmllcyhcbiAgICAgIGVycm9yTWFwLFxuICAgICAgd2FybmluZ01hcFxuICAgICk7XG5cbiAgICBpZiAoIV8uaXNFbXB0eShlcnJvclN1bW1hcmllcykpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoZXJyb3JTdW1tYXJpZXMuam9pbignXFxuJykpO1xuICAgIH1cblxuICAgIC8vIG5vdGUgdGhhdCB3ZSB3b24ndCBzaG93IGFueSB3YXJuaW5ncyBpZiB0aGVyZSB3ZXJlIGVycm9ycy5cbiAgICBpZiAoIV8uaXNFbXB0eSh3YXJuaW5nU3VtbWFyaWVzKSkge1xuICAgICAgdGhpcy5sb2cud2Fybih3YXJuaW5nU3VtbWFyaWVzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmNvbmZpZy5hZGRFeHRlbnNpb24oZXh0TmFtZSwgZXh0TWFuaWZlc3QpO1xuXG4gICAgLy8gdXBkYXRlIHRoZSBpZiB3ZSd2ZSBjaGFuZ2VkIHRoZSBsb2NhbCBgcGFja2FnZS5qc29uYFxuICAgIGlmIChhd2FpdCBlbnYuaGFzQXBwaXVtRGVwZW5kZW5jeSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lKSkge1xuICAgICAgYXdhaXQgcGFja2FnZURpZENoYW5nZSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lKTtcbiAgICB9XG5cbiAgICAvLyBsb2cgaW5mbyBmb3IgdGhlIHVzZXJcbiAgICB0aGlzLmxvZy5pbmZvKHRoaXMuZ2V0UG9zdEluc3RhbGxUZXh0KHtleHROYW1lLCBleHREYXRhfSkpO1xuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhbiBleHRlbnNpb24gdmlhIE5QTVxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxWaWFOcG1BcmdzfSBhcmdzXG4gICAqL1xuICBhc3luYyBpbnN0YWxsVmlhTnBtKHtpbnN0YWxsU3BlYywgcGtnTmFtZSwgcGtnVmVyfSkge1xuICAgIGNvbnN0IG5wbVNwZWMgPSBgJHtwa2dOYW1lfSR7cGtnVmVyID8gJ0AnICsgcGtnVmVyIDogJyd9YDtcbiAgICBjb25zdCBzcGVjTXNnID0gbnBtU3BlYyA9PT0gaW5zdGFsbFNwZWMgPyAnJyA6IGAgdXNpbmcgTlBNIGluc3RhbGwgc3BlYyAnJHtucG1TcGVjfSdgO1xuICAgIGNvbnN0IG1zZyA9IGBJbnN0YWxsaW5nICcke2luc3RhbGxTcGVjfScke3NwZWNNc2d9YDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGtnSnNvbkRhdGEgPSBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgbXNnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBrZ0pzb25EYXRhID0gYXdhaXQgbnBtLmluc3RhbGxQYWNrYWdlKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUsIHtcbiAgICAgICAgICBwa2dWZXIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnZhbGlkYXRlUGFja2FnZUpzb24ocGtnSnNvbkRhdGEsIGluc3RhbGxTcGVjKTtcbiAgICAgICAgcmV0dXJuIHBrZ0pzb25EYXRhO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0aGlzLmdldEV4dGVuc2lvbkZpZWxkcyhwa2dKc29uRGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKGBFbmNvdW50ZXJlZCBhbiBlcnJvciB3aGVuIGluc3RhbGxpbmcgcGFja2FnZTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB0ZXh0IHdoaWNoIHNob3VsZCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgYWZ0ZXIgYW4gZXh0ZW5zaW9uIGhhcyBiZWVuIGluc3RhbGxlZC4gVGhpc1xuICAgKiBpcyBkZXNpZ25lZCB0byBiZSBvdmVycmlkZGVuIGJ5IGRyaXZlcnMvcGx1Z2lucyB3aXRoIHRoZWlyIG93biBwYXJ0aWN1bGFyIHRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uQXJnc30gYXJnc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIGdldFBvc3RJbnN0YWxsVGV4dChhcmdzKSB7XG4gICAgdGhyb3cgdGhpcy5fY3JlYXRlRmF0YWxFcnJvcignTXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBmaW5hbCBjbGFzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYW4gTlBNIG1vZHVsZSdzIHBhY2thZ2UuanNvbiBhbmQgZXh0cmFjdCBBcHBpdW0gZHJpdmVyIGluZm9ybWF0aW9uIGZyb20gYSBzcGVjaWFsXG4gICAqICdhcHBpdW0nIGZpZWxkIGluIHRoZSBKU09OIGRhdGEuIFdlIG5lZWQgdGhpcyBpbmZvcm1hdGlvbiB0byBlLmcuIGRldGVybWluZSB3aGljaCBjbGFzcyB0b1xuICAgKiBsb2FkIGFzIHRoZSBtYWluIGRyaXZlciBjbGFzcywgb3IgdG8gYmUgYWJsZSB0byBkZXRlY3QgaW5jb21wYXRpYmlsaXRpZXMgYmV0d2VlbiBkcml2ZXIgYW5kXG4gICAqIGFwcGl1bSB2ZXJzaW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRQYWNrYWdlSnNvbjxFeHRUeXBlPn0gcGtnSnNvbiAtIHRoZSBwYWNrYWdlLmpzb24gZGF0YSBmb3IgYSBkcml2ZXIgbW9kdWxlLCBhcyBpZiBpdCBoYWQgYmVlbiBzdHJhaWdodGZvcndhcmRseSAncmVxdWlyZSdkXG4gICAqIEByZXR1cm5zIHtFeHRlbnNpb25GaWVsZHM8RXh0VHlwZT59XG4gICAqL1xuICBnZXRFeHRlbnNpb25GaWVsZHMocGtnSnNvbikge1xuICAgIGNvbnN0IHthcHBpdW0sIG5hbWUsIHZlcnNpb24sIHBlZXJEZXBlbmRlbmNpZXN9ID0gcGtnSnNvbjtcblxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAuLi5hcHBpdW0sXG4gICAgICBwa2dOYW1lOiBuYW1lLFxuICAgICAgdmVyc2lvbixcbiAgICAgIGFwcGl1bVZlcnNpb246IHBlZXJEZXBlbmRlbmNpZXM/LmFwcGl1bSxcbiAgICB9O1xuICAgIHJldHVybiAvKiogQHR5cGUge0V4dGVuc2lvbkZpZWxkczxFeHRUeXBlPn0gKi8gKHJlc3VsdCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBfcmVxdWlyZWRfIHJvb3QgZmllbGRzIG9mIGFuIGV4dGVuc2lvbidzIGBwYWNrYWdlLmpzb25gIGZpbGUuXG4gICAqXG4gICAqIFRoZXNlIHJlcXVpcmVkIGZpZWxkcyBhcmU6XG4gICAqIC0gYG5hbWVgXG4gICAqIC0gYHZlcnNpb25gXG4gICAqIC0gYGFwcGl1bWBcbiAgICogQHBhcmFtIHtpbXBvcnQoJ3R5cGUtZmVzdCcpLlBhY2thZ2VKc29ufSBwa2dKc29uIC0gYHBhY2thZ2UuanNvbmAgb2YgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIEV4dGVuc2lvbiBuYW1lL3NwZWNcbiAgICogQHRocm93cyB7UmVmZXJlbmNlRXJyb3J9IElmIGBwYWNrYWdlLmpzb25gIGhhcyBhIG1pc3Npbmcgb3IgaW52YWxpZCBmaWVsZFxuICAgKiBAcmV0dXJucyB7cGtnSnNvbiBpcyBFeHRQYWNrYWdlSnNvbjxFeHRUeXBlPn1cbiAgICovXG4gIHZhbGlkYXRlUGFja2FnZUpzb24ocGtnSnNvbiwgaW5zdGFsbFNwZWMpIHtcbiAgICBjb25zdCB7YXBwaXVtLCBuYW1lLCB2ZXJzaW9ufSA9IC8qKiBAdHlwZSB7RXh0UGFja2FnZUpzb248RXh0VHlwZT59ICovIChwa2dKc29uKTtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkXG4gICAgICogQHJldHVybnMge1JlZmVyZW5jZUVycm9yfVxuICAgICAqL1xuICAgIGNvbnN0IGNyZWF0ZU1pc3NpbmdGaWVsZEVycm9yID0gKGZpZWxkKSA9PlxuICAgICAgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICBgJHt0aGlzLnR5cGV9IFwiJHtpbnN0YWxsU3BlY31cIiBpbnZhbGlkOyBtaXNzaW5nIGEgXFxgJHtmaWVsZH1cXGAgZmllbGQgb2YgaXRzIFxcYHBhY2thZ2UuanNvblxcYGBcbiAgICAgICk7XG5cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IGNyZWF0ZU1pc3NpbmdGaWVsZEVycm9yKCduYW1lJyk7XG4gICAgfVxuICAgIGlmICghdmVyc2lvbikge1xuICAgICAgdGhyb3cgY3JlYXRlTWlzc2luZ0ZpZWxkRXJyb3IoJ3ZlcnNpb24nKTtcbiAgICB9XG4gICAgaWYgKCFhcHBpdW0pIHtcbiAgICAgIHRocm93IGNyZWF0ZU1pc3NpbmdGaWVsZEVycm9yKCdhcHBpdW0nKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzKGFwcGl1bSwgaW5zdGFsbFNwZWMpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRm9yIGFueSBgcGFja2FnZS5qc29uYCBmaWVsZHMgd2hpY2ggYSBwYXJ0aWN1bGFyIHR5cGUgb2YgZXh0ZW5zaW9uIHJlcXVpcmVzLCB2YWxpZGF0ZSB0aGVcbiAgICogcHJlc2VuY2UgYW5kIGZvcm0gb2YgdGhvc2UgZmllbGRzIG9uIHRoZSBgcGFja2FnZS5qc29uYCBkYXRhLCB0aHJvd2luZyBhbiBlcnJvciBpZiBhbnl0aGluZyBpc1xuICAgKiBhbWlzcy5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRNZXRhZGF0YTxFeHRUeXBlPn0gZXh0TWV0YWRhdGEgLSB0aGUgZGF0YSBpbiB0aGUgXCJhcHBpdW1cIiBmaWVsZCBvZiBgcGFja2FnZS5qc29uYCBmb3IgYW4gZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIEV4dGVuc2lvbiBuYW1lL3NwZWNcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICB2YWxpZGF0ZUV4dGVuc2lvbkZpZWxkcyhleHRNZXRhZGF0YSwgaW5zdGFsbFNwZWMpIHtcbiAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKCdNdXN0IGJlIGltcGxlbWVudGVkIGluIGZpbmFsIGNsYXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogVW5pbnN0YWxsIGFuIGV4dGVuc2lvbi5cbiAgICpcbiAgICogRmlyc3QgdHJpZXMgdG8gZG8gdGhpcyB2aWEgYG5wbSB1bmluc3RhbGxgLCBidXQgaWYgdGhhdCBmYWlscywganVzdCBgcm0gLXJmYCdzIHRoZSBleHRlbnNpb24gZGlyLlxuICAgKlxuICAgKiBXaWxsIG9ubHkgcmVtb3ZlIHRoZSBleHRlbnNpb24gZnJvbSB0aGUgbWFuaWZlc3QgaWYgaXQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7VW5pbnN0YWxsT3B0c30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dFJlY29yZDxFeHRUeXBlPj59IG1hcCBvZiBhbGwgaW5zdGFsbGVkIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YSAod2l0aG91dCB0aGUgZXh0ZW5zaW9uIGp1c3QgdW5pbnN0YWxsZWQpXG4gICAqL1xuICBhc3luYyBfdW5pbnN0YWxsKHtpbnN0YWxsU3BlY30pIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKGluc3RhbGxTcGVjKSkge1xuICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRmF0YWxFcnJvcihcbiAgICAgICAgYENhbid0IHVuaW5zdGFsbCAke3RoaXMudHlwZX0gJyR7aW5zdGFsbFNwZWN9JzsgaXQgaXMgbm90IGluc3RhbGxlZGBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHBrZ05hbWUgPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2luc3RhbGxTcGVjXS5wa2dOYW1lO1xuICAgIGF3YWl0IG5wbS51bmluc3RhbGxQYWNrYWdlKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUpO1xuICAgIGF3YWl0IHRoaXMuY29uZmlnLnJlbW92ZUV4dGVuc2lvbihpbnN0YWxsU3BlYyk7XG4gICAgdGhpcy5sb2cub2soYFN1Y2Nlc3NmdWxseSB1bmluc3RhbGxlZCAke3RoaXMudHlwZX0gJyR7aW5zdGFsbFNwZWN9J2AuZ3JlZW4pO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgdG8gdXBkYXRlIG9uZSBvciBtb3JlIGRyaXZlcnMgdXNpbmcgTlBNXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVXBkYXRlT3B0c30gdXBkYXRlU3BlY1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dGVuc2lvblVwZGF0ZVJlc3VsdD59XG4gICAqL1xuICBhc3luYyBfdXBkYXRlKHtpbnN0YWxsU3BlYywgdW5zYWZlfSkge1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUFsbCA9IGluc3RhbGxTcGVjID09PSBVUERBVEVfQUxMO1xuICAgIC8vIGlmIHdlJ3JlIHNwZWNpZmljYWxseSByZXF1ZXN0aW5nIGFuIHVwZGF0ZSBmb3IgYW4gZXh0ZW5zaW9uLCBtYWtlIHN1cmUgaXQncyBpbnN0YWxsZWRcbiAgICBpZiAoIXNob3VsZFVwZGF0ZUFsbCAmJiAhdGhpcy5jb25maWcuaXNJbnN0YWxsZWQoaW5zdGFsbFNwZWMpKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKFxuICAgICAgICBgVGhlICR7dGhpcy50eXBlfSBcIiR7aW5zdGFsbFNwZWN9XCIgd2FzIG5vdCBpbnN0YWxsZWQsIHNvIGNhbid0IGJlIHVwZGF0ZWRgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleHRzVG9VcGRhdGUgPSBzaG91bGRVcGRhdGVBbGxcbiAgICAgID8gT2JqZWN0LmtleXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucylcbiAgICAgIDogW2luc3RhbGxTcGVjXTtcblxuICAgIC8vICdlcnJvcnMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgZXJyb3Igb2JqZWN0cyBhcyB2YWx1ZXNcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsRXJyb3I+fSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IHt9O1xuXG4gICAgLy8gJ3VwZGF0ZXMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgdXBkYXRlIG9iamVjdHMgYXMgdmFsdWVzLCB3aGVyZSBhbiB1cGRhdGVcbiAgICAvLyBvYmplY3QgaXMgb2YgdGhlIGZvcm0ge2Zyb206IHZlcnNpb25TdHJpbmcsIHRvOiB2ZXJzaW9uU3RyaW5nfVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxVcGRhdGVSZXBvcnQ+fSAqL1xuICAgIGNvbnN0IHVwZGF0ZXMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgZSBvZiBleHRzVG9VcGRhdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBgQ2hlY2tpbmcgaWYgJHt0aGlzLnR5cGV9ICcke2V9JyBpcyB1cGRhdGFibGVgLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZV0uaW5zdGFsbFR5cGUgIT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RVcGRhdGFibGVFcnJvcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZSA9IGF3YWl0IHNwaW5XaXRoKFxuICAgICAgICAgIHRoaXMuaXNKc29uT3V0cHV0LFxuICAgICAgICAgIGBDaGVja2luZyBpZiAke3RoaXMudHlwZX0gJyR7ZX0nIG5lZWRzIGFuIHVwZGF0ZWAsXG4gICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlID0gYXdhaXQgdGhpcy5jaGVja0ZvckV4dGVuc2lvblVwZGF0ZShlKTtcbiAgICAgICAgICAgIGlmICghKHVwZGF0ZS5zYWZlVXBkYXRlIHx8IHVwZGF0ZS51bnNhZmVVcGRhdGUpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBOb1VwZGF0ZXNBdmFpbGFibGVFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGlmICghdW5zYWZlICYmICF1cGRhdGUuc2FmZVVwZGF0ZSkge1xuICAgICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgICAgICBgVGhlICR7dGhpcy50eXBlfSAnJHtlfScgaGFzIGEgbWFqb3IgcmV2aXNpb24gdXBkYXRlIGAgK1xuICAgICAgICAgICAgICBgKCR7dXBkYXRlLmN1cnJlbnR9ID0+ICR7dXBkYXRlLnVuc2FmZVVwZGF0ZX0pLCB3aGljaCBjb3VsZCBpbmNsdWRlIGAgK1xuICAgICAgICAgICAgICBgYnJlYWtpbmcgY2hhbmdlcy4gSWYgeW91IHdhbnQgdG8gYXBwbHkgdGhpcyB1cGRhdGUsIHJlLXJ1biB3aXRoIC0tdW5zYWZlYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlVmVyID0gdW5zYWZlICYmIHVwZGF0ZS51bnNhZmVVcGRhdGUgPyB1cGRhdGUudW5zYWZlVXBkYXRlIDogdXBkYXRlLnNhZmVVcGRhdGU7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKFxuICAgICAgICAgIHRoaXMuaXNKc29uT3V0cHV0LFxuICAgICAgICAgIGBVcGRhdGluZyBkcml2ZXIgJyR7ZX0nIGZyb20gJHt1cGRhdGUuY3VycmVudH0gdG8gJHt1cGRhdGVWZXJ9YCxcbiAgICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnVwZGF0ZUV4dGVuc2lvbihlLCB1cGRhdGVWZXIpXG4gICAgICAgICk7XG4gICAgICAgIHVwZGF0ZXNbZV0gPSB7ZnJvbTogdXBkYXRlLmN1cnJlbnQsIHRvOiB1cGRhdGVWZXJ9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGVycm9yc1tlXSA9IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxvZy5pbmZvKCdVcGRhdGUgcmVwb3J0OicpO1xuXG4gICAgZm9yIChjb25zdCBbZSwgdXBkYXRlXSBvZiBfLnRvUGFpcnModXBkYXRlcykpIHtcbiAgICAgIHRoaXMubG9nLm9rKGAgIC0gJHt0aGlzLnR5cGV9ICR7ZX0gdXBkYXRlZDogJHt1cGRhdGUuZnJvbX0gPT4gJHt1cGRhdGUudG99YC5ncmVlbik7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZSwgZXJyXSBvZiBfLnRvUGFpcnMoZXJyb3JzKSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdFVwZGF0YWJsZUVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oXG4gICAgICAgICAgYCAgLSAnJHtlfScgd2FzIG5vdCBpbnN0YWxsZWQgdmlhIG5wbSwgc28gd2UgY291bGQgbm90IGNoZWNrIGAgKyBgZm9yIHVwZGF0ZXNgLnllbGxvd1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBOb1VwZGF0ZXNBdmFpbGFibGVFcnJvcikge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGAgIC0gJyR7ZX0nIGhhZCBubyB1cGRhdGVzIGF2YWlsYWJsZWAueWVsbG93KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSwgbWFrZSBpdCBwb3Agd2l0aCByZWQhXG4gICAgICAgIHRoaXMubG9nLmVycm9yKGAgIC0gJyR7ZX0nIGZhaWxlZCB0byB1cGRhdGU6ICR7ZXJyfWAucmVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt1cGRhdGVzLCBlcnJvcnN9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGFuIGV4dGVuc2lvbiBuYW1lLCBmaWd1cmUgb3V0IHdoYXQgaXRzIGhpZ2hlc3QgcG9zc2libGUgdmVyc2lvbiB1cGdyYWRlIGlzLCBhbmQgYWxzbyB0aGVcbiAgICogaGlnaGVzdCBwb3NzaWJsZSBzYWZlIHVwZ3JhZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHQgLSBuYW1lIG9mIGV4dGVuc2lvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFBvc3NpYmxlVXBkYXRlcz59XG4gICAqL1xuICBhc3luYyBjaGVja0ZvckV4dGVuc2lvblVwZGF0ZShleHQpIHtcbiAgICAvLyBUT0RPIGRlY2lkZSBob3cgd2Ugd2FudCB0byBoYW5kbGUgYmV0YSB2ZXJzaW9ucz9cbiAgICAvLyB0aGlzIGlzIGEgaGVscGVyIG1ldGhvZCwgJ2V4dCcgaXMgYXNzdW1lZCB0byBhbHJlYWR5IGJlIGluc3RhbGxlZCBoZXJlLCBhbmQgb2YgdGhlIG5wbVxuICAgIC8vIGluc3RhbGwgdHlwZVxuICAgIGNvbnN0IHt2ZXJzaW9uLCBwa2dOYW1lfSA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0XTtcbiAgICBsZXQgdW5zYWZlVXBkYXRlID0gYXdhaXQgbnBtLmdldExhdGVzdFZlcnNpb24odGhpcy5jb25maWcuYXBwaXVtSG9tZSwgcGtnTmFtZSk7XG4gICAgbGV0IHNhZmVVcGRhdGUgPSBhd2FpdCBucG0uZ2V0TGF0ZXN0U2FmZVVwZ3JhZGVWZXJzaW9uKFxuICAgICAgdGhpcy5jb25maWcuYXBwaXVtSG9tZSxcbiAgICAgIHBrZ05hbWUsXG4gICAgICB2ZXJzaW9uXG4gICAgKTtcbiAgICBpZiAoIXV0aWwuY29tcGFyZVZlcnNpb25zKHVuc2FmZVVwZGF0ZSwgJz4nLCB2ZXJzaW9uKSkge1xuICAgICAgLy8gdGhlIGxhdGVzdCB2ZXJzaW9uIGlzIG5vdCBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgdmVyc2lvbiwgc28gdGhlcmUncyBubyBwb3NzaWJsZSB1cGRhdGVcbiAgICAgIHVuc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgICBzYWZlVXBkYXRlID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHVuc2FmZVVwZGF0ZSAmJiB1bnNhZmVVcGRhdGUgPT09IHNhZmVVcGRhdGUpIHtcbiAgICAgIC8vIHRoZSBsYXRlc3QgdXBkYXRlIGlzIHRoZSBzYW1lIGFzIHRoZSBzYWZlIHVwZGF0ZSwgd2hpY2ggbWVhbnMgaXQncyBub3QgYWN0dWFsbHkgdW5zYWZlXG4gICAgICB1bnNhZmVVcGRhdGUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoc2FmZVVwZGF0ZSAmJiAhdXRpbC5jb21wYXJlVmVyc2lvbnMoc2FmZVVwZGF0ZSwgJz4nLCB2ZXJzaW9uKSkge1xuICAgICAgLy8gZXZlbiB0aGUgc2FmZSB1cGRhdGUgaXMgbm90IGxhdGVyIHRoYW4gdGhlIGN1cnJlbnQsIHNvIGl0IGlzIG5vdCBhY3R1YWxseSBhbiB1cGRhdGVcbiAgICAgIHNhZmVVcGRhdGUgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge2N1cnJlbnQ6IHZlcnNpb24sIHNhZmVVcGRhdGUsIHVuc2FmZVVwZGF0ZX07XG4gIH1cblxuICAvKipcbiAgICogQWN0dWFsbHkgdXBkYXRlIGFuIGV4dGVuc2lvbiBpbnN0YWxsZWQgYnkgTlBNLCB1c2luZyB0aGUgTlBNIGNsaS4gQW5kIHVwZGF0ZSB0aGUgaW5zdGFsbGF0aW9uXG4gICAqIG1hbmlmZXN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5zdGFsbFNwZWMgLSBuYW1lIG9mIGV4dGVuc2lvbiB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSB2ZXJzaW9uIHN0cmluZyBpZGVudGlmaWVyIHRvIHVwZGF0ZSBleHRlbnNpb24gdG9cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB1cGRhdGVFeHRlbnNpb24oaW5zdGFsbFNwZWMsIHZlcnNpb24pIHtcbiAgICBjb25zdCB7cGtnTmFtZX0gPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2luc3RhbGxTcGVjXTtcbiAgICBjb25zdCBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKHtcbiAgICAgIGluc3RhbGxTcGVjLFxuICAgICAgcGtnTmFtZSxcbiAgICAgIHBrZ1ZlcjogdmVyc2lvbixcbiAgICB9KTtcbiAgICBkZWxldGUgZXh0RGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8gKGAke3RoaXMudHlwZX1OYW1lYCldO1xuICAgIGF3YWl0IHRoaXMuY29uZmlnLnVwZGF0ZUV4dGVuc2lvbihpbnN0YWxsU3BlYywgZXh0RGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIHNjcmlwdCBjYWNoZWQgaW5zaWRlIHRoZSBcInNjcmlwdHNcIiBmaWVsZCB1bmRlciBcImFwcGl1bVwiXG4gICAqIGluc2lkZSBvZiB0aGUgZHJpdmVyL3BsdWdpbnMgXCJwYWNrYWdlLmpzb25cIiBmaWxlLiBXaWxsIHRocm93XG4gICAqIGFuIGVycm9yIGlmIHRoZSBkcml2ZXIvcGx1Z2luIGRvZXMgbm90IGNvbnRhaW4gYSBcInNjcmlwdHNcIiBmaWVsZFxuICAgKiB1bmRlcm5lYXRoIHRoZSBcImFwcGl1bVwiIGZpZWxkIGluIGl0cyBwYWNrYWdlLmpzb24sIGlmIHRoZVxuICAgKiBcInNjcmlwdHNcIiBmaWVsZCBpcyBub3QgYSBwbGFpbiBvYmplY3QsIG9yIGlmIHRoZSBzY3JpcHROYW1lIGlzXG4gICAqIG5vdCBmb3VuZCB3aXRoaW4gXCJzY3JpcHRzXCIgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge1J1bk9wdGlvbnN9IG9wdHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxSdW5PdXRwdXQ+fVxuICAgKi9cbiAgYXN5bmMgX3J1bih7aW5zdGFsbFNwZWMsIHNjcmlwdE5hbWUsIGV4dHJhQXJncyA9IFtdfSkge1xuICAgIGlmICghdGhpcy5jb25maWcuaXNJbnN0YWxsZWQoaW5zdGFsbFNwZWMpKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKGBUaGUgJHt0aGlzLnR5cGV9IFwiJHtpbnN0YWxsU3BlY31cIiBpcyBub3QgaW5zdGFsbGVkYCk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0Q29uZmlnID0gdGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tpbnN0YWxsU3BlY107XG5cbiAgICAvLyBub3RlOiBUUyBjYW5ub3QgdW5kZXJzdGFuZCB0aGF0IF8uaGFzKCkgaXMgYSB0eXBlIGd1YXJkXG4gICAgaWYgKCFleHRDb25maWcuc2NyaXB0cykge1xuICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRmF0YWxFcnJvcihcbiAgICAgICAgYFRoZSAke3RoaXMudHlwZX0gbmFtZWQgJyR7aW5zdGFsbFNwZWN9JyBkb2VzIG5vdCBjb250YWluIHRoZSBgICtcbiAgICAgICAgICBgXCJzY3JpcHRzXCIgZmllbGQgdW5kZXJuZWF0aCB0aGUgXCJhcHBpdW1cIiBmaWVsZCBpbiBpdHMgcGFja2FnZS5qc29uYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRTY3JpcHRzID0gZXh0Q29uZmlnLnNjcmlwdHM7XG5cbiAgICBpZiAoIV8uaXNQbGFpbk9iamVjdChleHRTY3JpcHRzKSkge1xuICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRmF0YWxFcnJvcihcbiAgICAgICAgYFRoZSAke3RoaXMudHlwZX0gbmFtZWQgJyR7aW5zdGFsbFNwZWN9JyBcInNjcmlwdHNcIiBmaWVsZCBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaGFzKGV4dFNjcmlwdHMsIHNjcmlwdE5hbWUpKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKFxuICAgICAgICBgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtpbnN0YWxsU3BlY30nIGRvZXMgbm90IHN1cHBvcnQgdGhlIHNjcmlwdDogJyR7c2NyaXB0TmFtZX0nYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBydW5uZXIgPSBuZXcgU3ViUHJvY2Vzcyhwcm9jZXNzLmV4ZWNQYXRoLCBbZXh0U2NyaXB0c1tzY3JpcHROYW1lXSwgLi4uZXh0cmFBcmdzXSwge1xuICAgICAgY3dkOiB0aGlzLmNvbmZpZy5nZXRJbnN0YWxsUGF0aChpbnN0YWxsU3BlYyksXG4gICAgfSk7XG5cbiAgICBjb25zdCBvdXRwdXQgPSBuZXcgUmluZ0J1ZmZlcig1MCk7XG5cbiAgICBydW5uZXIub24oJ3N0cmVhbS1saW5lJywgKGxpbmUpID0+IHtcbiAgICAgIG91dHB1dC5lbnF1ZXVlKGxpbmUpO1xuICAgICAgdGhpcy5sb2cubG9nKGxpbmUpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgcnVubmVyLnN0YXJ0KDApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJ1bm5lci5qb2luKCk7XG4gICAgICB0aGlzLmxvZy5vayhgJHtzY3JpcHROYW1lfSBzdWNjZXNzZnVsbHkgcmFuYC5ncmVlbik7XG4gICAgICByZXR1cm4ge291dHB1dDogb3V0cHV0LmdldEJ1ZmYoKX07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvcihgRW5jb3VudGVyZWQgYW4gZXJyb3Igd2hlbiBydW5uaW5nICcke3NjcmlwdE5hbWV9JzogJHtlcnIubWVzc2FnZX1gLnJlZCk7XG4gICAgICByZXR1cm4ge2Vycm9yOiBlcnIubWVzc2FnZSwgb3V0cHV0OiBvdXRwdXQuZ2V0QnVmZigpfTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRXh0ZW5zaW9uQ29tbWFuZDtcbmV4cG9ydCB7RXh0ZW5zaW9uQ29tbWFuZH07XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZH0gY29uc3RydWN0b3JcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYgRXh0ZW5zaW9uQ29tbWFuZE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7RXh0ZW5zaW9uQ29uZmlnPEV4dFR5cGU+fSBjb25maWcgLSB0aGUgYERyaXZlckNvbmZpZ2Agb3IgYFBsdWdpbkNvbmZpZ2AgaW5zdGFuY2UgdXNlZCBmb3IgdGhpcyBjb21tYW5kXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGpzb24gLSB3aGV0aGVyIHRoZSBvdXRwdXQgb2YgdGhpcyBjb21tYW5kIHNob3VsZCBiZSBKU09OIG9yIHRleHRcbiAqL1xuXG4vKipcbiAqIEV4dHJhIHN0dWZmIGFib3V0IGV4dGVuc2lvbnM7IHVzZWQgaW5kaXJlY3RseSBieSB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQubGlzdH0uXG4gKlxuICogQHR5cGVkZWYgRXh0ZW5zaW9uTWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaW5zdGFsbGVkIC0gSWYgYHRydWVgLCB0aGUgZXh0ZW5zaW9uIGlzIGluc3RhbGxlZFxuICogQHByb3BlcnR5IHtzdHJpbmc/fSB1cGRhdGVWZXJzaW9uIC0gSWYgdGhlIGV4dGVuc2lvbiBpcyBpbnN0YWxsZWQsIHRoZSB2ZXJzaW9uIGl0IGNhbiBiZSB1cGRhdGVkIHRvXG4gKiBAcHJvcGVydHkge3N0cmluZz99IHVuc2FmZVVwZGF0ZVZlcnNpb24gLSBTYW1lIGFzIGFib3ZlLCBidXQgYSBtYWpvciB2ZXJzaW9uIGJ1bXBcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXBUb0RhdGUgLSBJZiB0aGUgZXh0ZW5zaW9uIGlzIGluc3RhbGxlZCBhbmQgdGhlIGxhdGVzdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkV4dGVuc2lvblR5cGV9IEV4dGVuc2lvblR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJUeXBlfSBEcml2ZXJUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuUGx1Z2luVHlwZX0gUGx1Z2luVHlwZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5FeHRSZWNvcmQ8RXh0VHlwZT59IEV4dFJlY29yZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZycpLkV4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn0gRXh0ZW5zaW9uQ29uZmlnXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkV4dE1ldGFkYXRhPEV4dFR5cGU+fSBFeHRNZXRhZGF0YVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5FeHRNYW5pZmVzdDxFeHRUeXBlPn0gRXh0TWFuaWZlc3RcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuRXh0UGFja2FnZUpzb248RXh0VHlwZT59IEV4dFBhY2thZ2VKc29uXG4gKi9cblxuLyoqXG4gKiBQb3NzaWJsZSByZXR1cm4gdmFsdWUgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fVxuICogQHR5cGVkZWYgVW5pbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBrZ05hbWVcbiAqIEBwcm9wZXJ0eSB7ZmFsc2V9IGluc3RhbGxlZFxuICovXG5cbi8qKlxuICogUG9zc2libGUgcmV0dXJuIHZhbHVlIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQubGlzdH1cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkludGVybmFsTWV0YWRhdGEgJiBFeHRlbnNpb25NZXRhZGF0YX0gSW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGFcbiAqL1xuXG4vKipcbiAqIFJldHVybiB2YWx1ZSBvZiB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQubGlzdH0uXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZyxJbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YXxVbmluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhPn0gRXh0ZW5zaW9uTGlzdERhdGFcbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fcnVufS5cbiAqIEB0eXBlZGVmIFJ1bk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0byBydW4gYSBzY3JpcHQgZnJvbVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNjcmlwdE5hbWUgLSBuYW1lIG9mIHRoZSBzY3JpcHQgdG8gcnVuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZXh0cmFBcmdzXSAtIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBzY3JpcHRcbiAqL1xuXG4vKipcbiAqIFJldHVybiB2YWx1ZSBvZiB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuX3J1bn1cbiAqXG4gKiBAdHlwZWRlZiBSdW5PdXRwdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXJyb3JdIC0gZXJyb3IgbWVzc2FnZSBpZiBzY3JpcHQgcmFuIHVuc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UgdW5kZWZpbmVkXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBvdXRwdXQgLSBzY3JpcHQgb3V0cHV0XG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuX3VwZGF0ZX0uXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25VcGRhdGVPcHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaW5zdGFsbFNwZWMgLSB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHRvIHVwZGF0ZVxuICogQHByb3BlcnR5IHtib29sZWFufSB1bnNhZmUgLSBpZiB0cnVlLCB3aWxsIHBlcmZvcm0gdW5zYWZlIHVwZGF0ZXMgcGFzdCBtYWpvciByZXZpc2lvbiBib3VuZGFyaWVzXG4gKi9cblxuLyoqXG4gKiBSZXR1cm4gdmFsdWUgb2Yge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl91cGRhdGV9LlxuICogQHR5cGVkZWYgRXh0ZW5zaW9uVXBkYXRlUmVzdWx0XG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsRXJyb3I+fSBlcnJvcnMgLSBtYXAgb2YgZXh0IG5hbWVzIHRvIGVycm9yIG9iamVjdHNcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxVcGRhdGVSZXBvcnQ+fSB1cGRhdGVzIC0gbWFwIG9mIGV4dCBuYW1lcyB0byB7QGxpbmtjb2RlIFVwZGF0ZVJlcG9ydH1zXG4gKi9cblxuLyoqXG4gKiBQYXJ0IG9mIHJlc3VsdCBvZiB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuX3VwZGF0ZX0uXG4gKiBAdHlwZWRlZiBVcGRhdGVSZXBvcnRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmcm9tIC0gdmVyc2lvbiB0aGUgZXh0ZW5zaW9uIHdhcyB1cGRhdGVkIGZyb21cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0byAtIHZlcnNpb24gdGhlIGV4dGVuc2lvbiB3YXMgdXBkYXRlZCB0b1xuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl91bmluc3RhbGx9LlxuICogQHR5cGVkZWYgVW5pbnN0YWxsT3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGluc3RhbGxTcGVjIC0gdGhlIG5hbWUgb3Igc3BlYyBvZiBhbiBleHRlbnNpb24gdG8gdW5pbnN0YWxsXG4gKi9cblxuLyoqXG4gKiBVc2VkIGJ5IHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5nZXRQb3N0SW5zdGFsbFRleHR9XG4gKiBAdHlwZWRlZiBFeHRlbnNpb25BcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXh0TmFtZSAtIHRoZSBuYW1lIG9mIGFuIGV4dGVuc2lvblxuICogQHByb3BlcnR5IHtvYmplY3R9IGV4dERhdGEgLSB0aGUgZGF0YSBmb3IgYW4gaW5zdGFsbGVkIGV4dGVuc2lvblxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmluc3RhbGxWaWFOcG19XG4gKiBAdHlwZWRlZiBJbnN0YWxsVmlhTnBtQXJnc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGluc3RhbGxTcGVjIC0gdGhlIG5hbWUgb3Igc3BlYyBvZiBhbiBleHRlbnNpb24gdG8gaW5zdGFsbFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBrZ05hbWUgLSB0aGUgTlBNIHBhY2thZ2UgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BrZ1Zlcl0gLSB0aGUgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgTlBNIHBhY2thZ2VcbiAqL1xuXG4vKipcbiAqIE9iamVjdCByZXR1cm5lZCBieSB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuY2hlY2tGb3JFeHRlbnNpb25VcGRhdGV9XG4gKiBAdHlwZWRlZiBQb3NzaWJsZVVwZGF0ZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjdXJyZW50IC0gY3VycmVudCB2ZXJzaW9uXG4gKiBAcHJvcGVydHkge3N0cmluZz99IHNhZmVVcGRhdGUgLSB2ZXJzaW9uIHdlIGNhbiBzYWZlbHkgdXBkYXRlIHRvIGlmIGl0IGV4aXN0cywgb3IgbnVsbFxuICogQHByb3BlcnR5IHtzdHJpbmc/fSB1bnNhZmVVcGRhdGUgLSB2ZXJzaW9uIHdlIGNhbiB1bnNhZmVseSB1cGRhdGUgdG8gaWYgaXQgZXhpc3RzLCBvciBudWxsXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuX2luc3RhbGx9XG4gKiBAdHlwZWRlZiBJbnN0YWxsQXJnc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGluc3RhbGxTcGVjIC0gdGhlIG5hbWUgb3Igc3BlYyBvZiBhbiBleHRlbnNpb24gdG8gaW5zdGFsbFxuICogQHByb3BlcnR5IHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkluc3RhbGxUeXBlfSBpbnN0YWxsVHlwZSAtIGhvdyB0byBpbnN0YWxsIHRoaXMgZXh0ZW5zaW9uLiBPbmUgb2YgdGhlIElOU1RBTExfVFlQRVNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGFja2FnZU5hbWVdIC0gZm9yIGdpdC9naXRodWIgaW5zdGFsbHMsIHRoZSBleHRlbnNpb24gbm9kZSBwYWNrYWdlIG5hbWVcbiAqL1xuXG4vKipcbiAqIFJldHVybmVkIGJ5IHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5nZXRFeHRlbnNpb25GaWVsZHN9XG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIHtFeHRNZXRhZGF0YTxFeHRUeXBlPiAmIHsgcGtnTmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIGFwcGl1bVZlcnNpb246IHN0cmluZyB9ICYgaW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5Db21tb25FeHRNZXRhZGF0YX0gRXh0ZW5zaW9uRmllbGRzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIHtFeHRUeXBlIGV4dGVuZHMgRHJpdmVyVHlwZSA/IHR5cGVvZiBpbXBvcnQoJy4uL2NvbnN0YW50cycpLktOT1dOX0RSSVZFUlMgOiBFeHRUeXBlIGV4dGVuZHMgUGx1Z2luVHlwZSA/IHR5cGVvZiBpbXBvcnQoJy4uL2NvbnN0YW50cycpLktOT1dOX1BMVUdJTlMgOiBuZXZlcn0gS25vd25FeHRlbnNpb25zXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMaXN0T3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBzaG93SW5zdGFsbGVkIC0gd2hldGhlciBzaG91bGQgc2hvdyBvbmx5IGluc3RhbGxlZCBleHRlbnNpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHNob3dVcGRhdGVzIC0gd2hldGhlciBzaG91bGQgc2hvdyBhdmFpbGFibGUgdXBkYXRlc1xuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBTUE7O0FBRUEsTUFBTUEsVUFBVSxHQUFHLFdBQW5COztBQUVBLE1BQU1DLGlCQUFOLFNBQWdDQyxLQUFoQyxDQUFz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
|