appium 2.0.0-beta.2 → 2.0.0-beta.23
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 +9 -9
- package/build/check-npm-pack-files.js +23 -0
- package/build/commands-yml/parse.js +319 -0
- package/build/commands-yml/validator.js +130 -0
- package/build/index.js +19 -0
- package/build/lib/appium-config.schema.json +0 -0
- package/build/lib/appium.js +160 -53
- package/build/lib/cli/args.js +115 -279
- package/build/lib/cli/driver-command.js +11 -1
- package/build/lib/cli/extension-command.js +60 -8
- package/build/lib/cli/extension.js +30 -7
- package/build/lib/cli/npm.js +43 -29
- package/build/lib/cli/parser.js +156 -89
- package/build/lib/cli/plugin-command.js +11 -1
- package/build/lib/cli/utils.js +29 -3
- package/build/lib/config-file.js +141 -0
- package/build/lib/config.js +53 -65
- package/build/lib/driver-config.js +42 -19
- package/build/lib/drivers.js +8 -4
- package/build/lib/ext-config-io.js +165 -0
- package/build/lib/extension-config.js +130 -61
- package/build/lib/grid-register.js +22 -24
- package/build/lib/logger.js +3 -3
- package/build/lib/logsink.js +11 -13
- package/build/lib/main.js +197 -77
- package/build/lib/plugin-config.js +21 -11
- package/build/lib/plugins.js +4 -2
- package/build/lib/schema/appium-config-schema.js +253 -0
- package/build/lib/schema/arg-spec.js +120 -0
- package/build/lib/schema/cli-args.js +188 -0
- package/build/lib/schema/cli-transformers.js +76 -0
- package/build/lib/schema/index.js +36 -0
- package/build/lib/schema/keywords.js +72 -0
- package/build/lib/schema/schema.js +357 -0
- package/build/lib/utils.js +44 -99
- package/build/postinstall.js +90 -0
- package/build/test/cli/cli-e2e-specs.js +221 -0
- package/build/test/cli/cli-helpers.js +86 -0
- package/build/test/cli/cli-specs.js +71 -0
- package/build/test/cli/fixtures/test-driver/package.json +27 -0
- package/build/test/cli/schema-args-specs.js +48 -0
- package/build/test/cli/schema-e2e-specs.js +47 -0
- package/build/test/config-e2e-specs.js +112 -0
- package/build/test/config-file-e2e-specs.js +209 -0
- package/build/test/config-file-specs.js +281 -0
- package/build/test/config-specs.js +159 -0
- package/build/test/driver-e2e-specs.js +435 -0
- package/build/test/driver-specs.js +321 -0
- package/build/test/ext-config-io-specs.js +181 -0
- package/build/test/extension-config-specs.js +365 -0
- package/build/test/fixtures/allow-feat.txt +5 -0
- package/build/test/fixtures/caps.json +3 -0
- package/build/test/fixtures/config/allow-insecure.txt +3 -0
- package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +5 -0
- package/build/test/fixtures/config/appium.config.bad.json +32 -0
- package/build/test/fixtures/config/appium.config.ext-good.json +9 -0
- package/build/test/fixtures/config/appium.config.ext-unknown-props.json +10 -0
- package/build/test/fixtures/config/appium.config.good.js +40 -0
- package/build/test/fixtures/config/appium.config.good.json +33 -0
- package/build/test/fixtures/config/appium.config.good.yaml +30 -0
- package/build/test/fixtures/config/appium.config.invalid.json +31 -0
- package/build/test/fixtures/config/appium.config.security-array.json +5 -0
- package/build/test/fixtures/config/appium.config.security-delimited.json +5 -0
- package/build/test/fixtures/config/appium.config.security-path.json +5 -0
- package/build/test/fixtures/config/driver-fake.config.json +8 -0
- package/build/test/fixtures/config/nodeconfig.json +3 -0
- package/build/test/fixtures/config/plugin-fake.config.json +0 -0
- package/build/test/fixtures/default-args.js +35 -0
- package/build/test/fixtures/deny-feat.txt +5 -0
- package/build/test/fixtures/driver.schema.js +20 -0
- package/build/test/fixtures/extensions.yaml +27 -0
- package/build/test/fixtures/flattened-schema.js +504 -0
- package/build/test/fixtures/plugin.schema.js +20 -0
- package/build/test/fixtures/schema-with-extensions.js +28 -0
- package/build/test/grid-register-specs.js +74 -0
- package/build/test/helpers.js +75 -0
- package/build/test/logger-specs.js +76 -0
- package/build/test/npm-specs.js +20 -0
- package/build/test/parser-specs.js +314 -0
- package/build/test/plugin-e2e-specs.js +316 -0
- package/build/test/schema/arg-spec-specs.js +70 -0
- package/build/test/schema/cli-args-specs.js +431 -0
- package/build/test/schema/schema-specs.js +389 -0
- package/build/test/utils-specs.js +266 -0
- package/index.js +11 -0
- package/lib/appium-config.schema.json +278 -0
- package/lib/appium.js +207 -65
- package/lib/cli/args.js +174 -375
- package/lib/cli/driver-command.js +4 -0
- package/lib/cli/extension-command.js +70 -5
- package/lib/cli/extension.js +25 -5
- package/lib/cli/npm.js +86 -18
- package/lib/cli/parser.js +257 -79
- package/lib/cli/plugin-command.js +4 -0
- package/lib/cli/utils.js +21 -1
- package/lib/config-file.js +227 -0
- package/lib/config.js +84 -63
- package/lib/driver-config.js +66 -11
- package/lib/drivers.js +4 -1
- package/lib/ext-config-io.js +287 -0
- package/lib/extension-config.js +225 -67
- package/lib/grid-register.js +27 -24
- package/lib/logger.js +1 -1
- package/lib/logsink.js +10 -7
- package/lib/main.js +214 -77
- package/lib/plugin-config.js +35 -6
- package/lib/plugins.js +1 -0
- package/lib/schema/appium-config-schema.js +287 -0
- package/lib/schema/arg-spec.js +222 -0
- package/lib/schema/cli-args.js +285 -0
- package/lib/schema/cli-transformers.js +123 -0
- package/lib/schema/index.js +2 -0
- package/lib/schema/keywords.js +135 -0
- package/lib/schema/schema.js +577 -0
- package/lib/utils.js +42 -88
- package/package.json +55 -84
- package/postinstall.js +71 -0
- package/types/appium-config.d.ts +197 -0
- package/types/types.d.ts +201 -0
- package/CHANGELOG.md +0 -3515
- package/build/lib/cli/parser-helpers.js +0 -82
- package/lib/cli/parser-helpers.js +0 -79
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.getExtConfigIOInstance = exports.PLUGIN_TYPE = exports.DRIVER_TYPE = void 0;
|
|
9
|
+
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
|
|
12
|
+
require("source-map-support/register");
|
|
13
|
+
|
|
14
|
+
var _support = require("@appium/support");
|
|
15
|
+
|
|
16
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
17
|
+
|
|
18
|
+
var _path = _interopRequireDefault(require("path"));
|
|
19
|
+
|
|
20
|
+
var _yaml = _interopRequireDefault(require("yaml"));
|
|
21
|
+
|
|
22
|
+
const CONFIG_FILE_NAME = 'extensions.yaml';
|
|
23
|
+
const CONFIG_SCHEMA_REV = 2;
|
|
24
|
+
const DRIVER_TYPE = 'driver';
|
|
25
|
+
exports.DRIVER_TYPE = DRIVER_TYPE;
|
|
26
|
+
const PLUGIN_TYPE = 'plugin';
|
|
27
|
+
exports.PLUGIN_TYPE = PLUGIN_TYPE;
|
|
28
|
+
const VALID_EXT_TYPES = new Set([DRIVER_TYPE, PLUGIN_TYPE]);
|
|
29
|
+
const CONFIG_DATA_DRIVER_KEY = `${DRIVER_TYPE}s`;
|
|
30
|
+
const CONFIG_DATA_PLUGIN_KEY = `${PLUGIN_TYPE}s`;
|
|
31
|
+
|
|
32
|
+
class ExtConfigIO {
|
|
33
|
+
constructor(appiumHome) {
|
|
34
|
+
(0, _defineProperty2.default)(this, "_dirty", void 0);
|
|
35
|
+
(0, _defineProperty2.default)(this, "_data", void 0);
|
|
36
|
+
(0, _defineProperty2.default)(this, "_extDataByType", new Map());
|
|
37
|
+
(0, _defineProperty2.default)(this, "_filepath", void 0);
|
|
38
|
+
(0, _defineProperty2.default)(this, "_appiumHome", void 0);
|
|
39
|
+
(0, _defineProperty2.default)(this, "_writing", null);
|
|
40
|
+
(0, _defineProperty2.default)(this, "_reading", null);
|
|
41
|
+
this._filepath = _path.default.resolve(appiumHome, CONFIG_FILE_NAME);
|
|
42
|
+
this._appiumHome = appiumHome;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
_createProxy(extensionType, data) {
|
|
46
|
+
return new Proxy(data[`${extensionType}s`], {
|
|
47
|
+
set: (target, prop, value) => {
|
|
48
|
+
if (value !== target[prop]) {
|
|
49
|
+
this._dirty = true;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
target[prop] = value;
|
|
53
|
+
return Reflect.set(target, prop, value);
|
|
54
|
+
},
|
|
55
|
+
deleteProperty: (target, prop) => {
|
|
56
|
+
if (prop in target) {
|
|
57
|
+
this._dirty = true;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return Reflect.deleteProperty(target, prop);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
get filepath() {
|
|
66
|
+
return this._filepath;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async read(extensionType) {
|
|
70
|
+
if (this._reading) {
|
|
71
|
+
await this._reading;
|
|
72
|
+
return this._extDataByType.get(extensionType);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
this._reading = (async () => {
|
|
76
|
+
if (!VALID_EXT_TYPES.has(extensionType)) {
|
|
77
|
+
throw new TypeError(`Invalid extension type: ${extensionType}. Valid values are: ${[...VALID_EXT_TYPES].join(', ')}`);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (this._extDataByType.has(extensionType)) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
let data;
|
|
85
|
+
let isNewFile = false;
|
|
86
|
+
|
|
87
|
+
try {
|
|
88
|
+
await (0, _support.mkdirp)(this._appiumHome);
|
|
89
|
+
const yaml = await _support.fs.readFile(this.filepath, 'utf8');
|
|
90
|
+
data = _yaml.default.parse(yaml);
|
|
91
|
+
} catch (err) {
|
|
92
|
+
if (err.code === 'ENOENT') {
|
|
93
|
+
data = {
|
|
94
|
+
[CONFIG_DATA_DRIVER_KEY]: {},
|
|
95
|
+
[CONFIG_DATA_PLUGIN_KEY]: {},
|
|
96
|
+
schemaRev: CONFIG_SCHEMA_REV
|
|
97
|
+
};
|
|
98
|
+
isNewFile = true;
|
|
99
|
+
} else {
|
|
100
|
+
throw new Error(`Appium had trouble loading the extension installation ` + `cache file (${this.filepath}). Ensure it exists and is ` + `readable. Specific error: ${err.message}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
this._data = data;
|
|
105
|
+
|
|
106
|
+
this._extDataByType.set(DRIVER_TYPE, this._createProxy(DRIVER_TYPE, data));
|
|
107
|
+
|
|
108
|
+
this._extDataByType.set(PLUGIN_TYPE, this._createProxy(PLUGIN_TYPE, data));
|
|
109
|
+
|
|
110
|
+
if (isNewFile) {
|
|
111
|
+
await this.write(true);
|
|
112
|
+
}
|
|
113
|
+
})();
|
|
114
|
+
|
|
115
|
+
try {
|
|
116
|
+
await this._reading;
|
|
117
|
+
return this._extDataByType.get(extensionType);
|
|
118
|
+
} finally {
|
|
119
|
+
this._reading = null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
async write(force = false) {
|
|
124
|
+
if (this._writing) {
|
|
125
|
+
return this._writing;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
this._writing = (async () => {
|
|
129
|
+
try {
|
|
130
|
+
if (!this._dirty && !force) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (!this._data) {
|
|
135
|
+
throw new ReferenceError('No data to write. Call `read()` first');
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const dataToWrite = { ...this._data,
|
|
139
|
+
[CONFIG_DATA_DRIVER_KEY]: this._extDataByType.get(DRIVER_TYPE),
|
|
140
|
+
[CONFIG_DATA_PLUGIN_KEY]: this._extDataByType.get(PLUGIN_TYPE)
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
try {
|
|
144
|
+
await _support.fs.writeFile(this.filepath, _yaml.default.stringify(dataToWrite), 'utf8');
|
|
145
|
+
this._dirty = false;
|
|
146
|
+
return true;
|
|
147
|
+
} catch {
|
|
148
|
+
throw new Error(`Appium could not parse or write from the Appium Home directory ` + `(${this._appiumHome}). Please ensure it is writable.`);
|
|
149
|
+
}
|
|
150
|
+
} finally {
|
|
151
|
+
this._writing = null;
|
|
152
|
+
}
|
|
153
|
+
})();
|
|
154
|
+
|
|
155
|
+
return await this._writing;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const getExtConfigIOInstance = _lodash.default.memoize(appiumHome => new ExtConfigIO(appiumHome));
|
|
161
|
+
|
|
162
|
+
exports.getExtConfigIOInstance = getExtConfigIOInstance;require('source-map-support').install();
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9leHQtY29uZmlnLWlvLmpzIl0sIm5hbWVzIjpbIkNPTkZJR19GSUxFX05BTUUiLCJDT05GSUdfU0NIRU1BX1JFViIsIkRSSVZFUl9UWVBFIiwiUExVR0lOX1RZUEUiLCJWQUxJRF9FWFRfVFlQRVMiLCJTZXQiLCJDT05GSUdfREFUQV9EUklWRVJfS0VZIiwiQ09ORklHX0RBVEFfUExVR0lOX0tFWSIsIkV4dENvbmZpZ0lPIiwiY29uc3RydWN0b3IiLCJhcHBpdW1Ib21lIiwiTWFwIiwiX2ZpbGVwYXRoIiwicGF0aCIsInJlc29sdmUiLCJfYXBwaXVtSG9tZSIsIl9jcmVhdGVQcm94eSIsImV4dGVuc2lvblR5cGUiLCJkYXRhIiwiUHJveHkiLCJzZXQiLCJ0YXJnZXQiLCJwcm9wIiwidmFsdWUiLCJfZGlydHkiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiLCJmaWxlcGF0aCIsInJlYWQiLCJfcmVhZGluZyIsIl9leHREYXRhQnlUeXBlIiwiZ2V0IiwiaGFzIiwiVHlwZUVycm9yIiwiam9pbiIsImlzTmV3RmlsZSIsInlhbWwiLCJmcyIsInJlYWRGaWxlIiwiWUFNTCIsInBhcnNlIiwiZXJyIiwiY29kZSIsInNjaGVtYVJldiIsIkVycm9yIiwibWVzc2FnZSIsIl9kYXRhIiwid3JpdGUiLCJmb3JjZSIsIl93cml0aW5nIiwiUmVmZXJlbmNlRXJyb3IiLCJkYXRhVG9Xcml0ZSIsIndyaXRlRmlsZSIsInN0cmluZ2lmeSIsImdldEV4dENvbmZpZ0lPSW5zdGFuY2UiLCJfIiwibWVtb2l6ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQU1BOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLGdCQUFnQixHQUFHLGlCQUF6QjtBQUtBLE1BQU1DLGlCQUFpQixHQUFHLENBQTFCO0FBRU8sTUFBTUMsV0FBVyxHQUFHLFFBQXBCOztBQUNBLE1BQU1DLFdBQVcsR0FBRyxRQUFwQjs7QUFNUCxNQUFNQyxlQUFlLEdBQUcsSUFBSUMsR0FBSixDQUFR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Y0FBTUMsV0FBVyxHQUFHLEVBQ2xCLEdBQUcsS0FBS0wsS0FEVTtBQUVsQixXQUFDeEMsc0JBQUQsR0FBMEIsS0FBS3dCLGNBQUwsQ0FBb0JDLEdBQXBCLENBQXdCN0IsV0FBeEIsQ0FGUjtBQUdsQixXQUFDSyxzQkFBRCxHQUEwQixLQUFLdUIsY0FBTCxDQUFvQkMsR0FBcEIsQ0FBd0I1QixXQUF4QjtBQUhSLFNBQXBCOztBQU1BLFlBQUk7QUFDRixnQkFBTWtDLFlBQUdlLFNBQUgsQ0FDSixLQUFLekIsUUFERCxFQUVKWSxjQUFLYyxTQUFMLENBQWVGLFdBQWYsQ0FGSSxFQUdKLE1BSEksQ0FBTjtBQUtBLGVBQUszQixNQUFMLEdBQWMsS0FBZDtBQUNBLGlCQUFPLElBQVA7QUFDRCxTQVJELENBUUUsTUFBTTtBQUNOLGdCQUFNLElBQUlvQixLQUFKLENBQ0gsaUVBQUQsR0FDRyxJQUFHLEtBQUs3QixXQUFZLGtDQUZuQixDQUFOO0FBSUQ7QUFDRixPQTdCRCxTQTZCVTtBQUNSLGFBQUtrQyxRQUFMLEdBQWdCLElBQWhCO0FBQ0Q7QUFDRixLQWpDZSxHQUFoQjs7QUFrQ0EsV0FBTyxNQUFNLEtBQUtBLFFBQWxCO0FBQ0Q7O0FBdk9lOztBQWlQWCxNQUFNSyxzQkFBc0IsR0FBR0MsZ0JBQUVDLE9BQUYsQ0FDbkM5QyxVQUFELElBQWdCLElBQUlGLFdBQUosQ0FBZ0JFLFVBQWhCLENBRG9CLENBQS9CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogTW9kdWxlIGNvbnRhaW5pbmcge0BsaW5rIEV4dENvbmZpZ0lPfSB3aGljaCBoYW5kbGVzIHJlYWRpbmcgJiB3cml0aW5nIG9mIGV4dGVuc2lvbiBjb25maWcgZmlsZXMuXG4gKi9cblxuaW1wb3J0IHsgZnMsIG1rZGlycCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgWUFNTCBmcm9tICd5YW1sJztcblxuY29uc3QgQ09ORklHX0ZJTEVfTkFNRSA9ICdleHRlbnNpb25zLnlhbWwnO1xuXG4vKipcbiAqIEN1cnJlbnQgY29uZmlndXJhdGlvbiBzY2hlbWEgcmV2aXNpb24hXG4gKi9cbmNvbnN0IENPTkZJR19TQ0hFTUFfUkVWID0gMjtcblxuZXhwb3J0IGNvbnN0IERSSVZFUl9UWVBFID0gJ2RyaXZlcic7XG5leHBvcnQgY29uc3QgUExVR0lOX1RZUEUgPSAncGx1Z2luJztcblxuLyoqXG4gKiBTZXQgb2YgdmFsaWQgZXh0ZW5zaW9uIHR5cGVzLlxuICogQHR5cGUge1JlYWRvbmx5PFNldDxFeHRlbnNpb25UeXBlPj59XG4gKi9cbmNvbnN0IFZBTElEX0VYVF9UWVBFUyA9IG5ldyBTZXQoW0RSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRV0pO1xuXG5jb25zdCBDT05GSUdfREFUQV9EUklWRVJfS0VZID0gYCR7RFJJVkVSX1RZUEV9c2A7XG5jb25zdCBDT05GSUdfREFUQV9QTFVHSU5fS0VZID0gYCR7UExVR0lOX1RZUEV9c2A7XG5cbi8qKlxuICogSGFuZGxlcyByZWFkaW5nICYgd3JpdGluZyBvZiBleHRlbnNpb24gY29uZmlnIGZpbGVzLlxuICpcbiAqIE9ubHkgb25lIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZXhpc3RzIHBlciB2YWx1ZSBvZiBgQVBQSVVNX0hPTUVgLlxuICovXG5jbGFzcyBFeHRDb25maWdJTyB7XG4gIC8qKlxuICAgKiBcIkRpcnR5XCIgZmxhZy4gSWYgdHJ1ZSwgdGhlIGRhdGEgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3Qgd3JpdGUuXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2RpcnR5O1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXJlIGNvbnRlbnRzIG9mIGEgcGFyc2VkIFlBTUwgZXh0ZW5zaW9uIGNvbmZpZyBmaWxlLlxuICAgKiBAdHlwZSB7b2JqZWN0P31cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9kYXRhO1xuXG4gIC8qKlxuICAgKiBBIG1hcHBpbmcgb2YgZXh0ZW5zaW9uIHR5cGUgdG8gY29uZmlndXJhdGlvbiBkYXRhLiBDb25maWd1cmF0aW9uIGRhdGEgaXNcbiAgICoga2V5ZWQgb24gZXh0ZW5zaW9uIG5hbWUuXG4gICAqXG4gICAqIENvbnN1bWVycyBnZXQgdGhlIHZhbHVlcyBvZiB0aGlzIGBNYXBgIChjb3JyZXNwb25kaW5nIHRvIHRoZVxuICAgKiBgZXh0ZW5zaW9uVHlwZWAgb2YgdGhlIGNvbnN1bWVyLCB3aGljaCB3aWxsIGJlIGEgc3ViY2xhc3Mgb2ZcbiAgICogYEV4dGVuc2lvbkNvbmZpZ2ApIGFuZCBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGVudGlyZSBkYXRhIG9iamVjdC5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge01hcDxFeHRlbnNpb25UeXBlLG9iamVjdD59XG4gICAqL1xuICBfZXh0RGF0YUJ5VHlwZSA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogUGF0aCB0byBjb25maWcgZmlsZS5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1JlYWRvbmx5PHN0cmluZz59XG4gICAqL1xuICBfZmlsZXBhdGg7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gYEFQUElVTV9IT01FYFxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIF9hcHBpdW1Ib21lO1xuXG4gIC8qKlxuICAgKiBIZWxwcyBhdm9pZCB3cml0aW5nIG11bHRpcGxlIHRpbWVzLlxuICAgKlxuICAgKiBJZiB0aGlzIGlzIGBudWxsYCwgY2FsbGluZyB7QGxpbmsgRXh0Q29uZmlnSU8ud3JpdGV9IHdpbGwgY2F1c2UgaXQgdG8gYmVcbiAgICogc2V0IHRvIGEgYFByb21pc2VgLiBXaGVuIHRoZSBjYWxsIHRvIGB3cml0ZSgpYCBpcyBjb21wbGV0ZSwgdGhlIGBQcm9taXNlYFxuICAgKiB3aWxsIHJlc29sdmUgYW5kIHRoZW4gdGhpcyB2YWx1ZSB3aWxsIGJlIHNldCB0byBgbnVsbGAuICBDb25jdXJyZW50IGNhbGxzXG4gICAqIG1hZGUgd2hpbGUgdGhpcyB2YWx1ZSBpcyBhIGBQcm9taXNlYCB3aWxsIHJldHVybiB0aGUgYFByb21pc2VgIGl0c2VsZi5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1Byb21pc2U8Ym9vbGVhbj4/fVxuICAgKi9cbiAgX3dyaXRpbmcgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBIZWxwcyBhdm9pZCByZWFkaW5nIG11bHRpcGxlIHRpbWVzLlxuICAgKlxuICAgKiBJZiB0aGlzIGlzIGBudWxsYCwgY2FsbGluZyB7QGxpbmsgRXh0Q29uZmlnSU8ucmVhZH0gd2lsbCBjYXVzZSBpdCB0byBiZVxuICAgKiBzZXQgdG8gYSBgUHJvbWlzZWAuIFdoZW4gdGhlIGNhbGwgdG8gYHJlYWQoKWAgaXMgY29tcGxldGUsIHRoZSBgUHJvbWlzZWBcbiAgICogd2lsbCByZXNvbHZlIGFuZCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBzZXQgdG8gYG51bGxgLiAgQ29uY3VycmVudCBjYWxsc1xuICAgKiBtYWRlIHdoaWxlIHRoaXMgdmFsdWUgaXMgYSBgUHJvbWlzZWAgd2lsbCByZXR1cm4gdGhlIGBQcm9taXNlYCBpdHNlbGYuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtQcm9taXNlPHZvaWQ+P31cbiAgICovXG4gIF9yZWFkaW5nID0gbnVsbDtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcGl1bUhvbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yIChhcHBpdW1Ib21lKSB7XG4gICAgdGhpcy5fZmlsZXBhdGggPSBwYXRoLnJlc29sdmUoYXBwaXVtSG9tZSwgQ09ORklHX0ZJTEVfTkFNRSk7XG4gICAgdGhpcy5fYXBwaXVtSG9tZSA9IGFwcGl1bUhvbWU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYWVzIGEgYFByb3h5YCB3aGljaCB3YXRjaGVzIGZvciBjaGFuZ2VzIHRvIHRoZSBleHRlbnNpb24tdHlwZS1zcGVjaWZpY1xuICAgKiBjb25maWcgZGF0YS5cbiAgICpcbiAgICogV2hlbiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCwgaXQgc2V0cyBhIGBfZGlydHlgIGZsYWcuICBUaGUgbmV4dCBjYWxsIHRvXG4gICAqIHtAbGluayBFeHRDb25maWdJTy53cml0ZX0gd2lsbCBjaGVjayBpZiB0aGlzIGZsYWcgaXMgYHRydWVgIGJlZm9yZVxuICAgKiBwcm9jZWVkaW5nLlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dGVuc2lvblR5cGVcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLG9iamVjdD59IGRhdGEgLSBFeHRlbnNpb24gY29uZmlnIGRhdGEsIGtleWVkIGJ5IG5hbWVcbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsb2JqZWN0Pn1cbiAgICovXG4gIF9jcmVhdGVQcm94eSAoZXh0ZW5zaW9uVHlwZSwgZGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJveHkoZGF0YVtgJHtleHRlbnNpb25UeXBlfXNgXSwge1xuICAgICAgc2V0OiAodGFyZ2V0LCBwcm9wLCB2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAodmFsdWUgIT09IHRhcmdldFtwcm9wXSkge1xuICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcCwgdmFsdWUpO1xuICAgICAgfSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiAodGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgIGlmIChwcm9wIGluIHRhcmdldCkge1xuICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3ApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBjb25maWcgZmlsZS5cbiAgICovXG4gIGdldCBmaWxlcGF0aCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGVwYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZGF0YSBmb3IgYW4gZXh0ZW5zaW9uIHR5cGUuICBSZWFkcyB0aGUgY29uZmlnIGZpbGUgaWYgbmVjZXNzYXJ5LlxuICAgKlxuICAgKiBGb3JjZS1yZWFkaW5nIGlzIF9ub3RfIHN1cHBvcnRlZCwgYXMgaXQncyBsaWtlbHkgdG8gYmUgYSBzb3VyY2Ugb2ZcbiAgICogYnVncy0taXQncyBlYXN5IHRvIG11dGF0ZSB0aGUgZGF0YSBhbmQgdGhlbiBvdmVyd3JpdGUgbWVtb3J5IHdpdGggdGhlIGZpbGVcbiAgICogY29udGVudHNcbiAgICpcbiAgICogSWRlYWxseSB0aGlzIHdpbGwgb25seSBldmVyIHJlYWQgdGhlIGZpbGUgX29uY2VfLlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dGVuc2lvblR5cGUgLSBXaGljaCBiaXQgb2YgdGhlIGNvbmZpZyBkYXRhIHdlXG4gICAqIHdhbnRcbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0Pn0gVGhlIGRhdGFcbiAgICovXG4gIGFzeW5jIHJlYWQgKGV4dGVuc2lvblR5cGUpIHtcbiAgICBpZiAodGhpcy5fcmVhZGluZykge1xuICAgICAgYXdhaXQgdGhpcy5fcmVhZGluZztcbiAgICAgIHJldHVybiB0aGlzLl9leHREYXRhQnlUeXBlLmdldChleHRlbnNpb25UeXBlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWFkaW5nID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghVkFMSURfRVhUX1RZUEVTLmhhcyhleHRlbnNpb25UeXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIGV4dGVuc2lvbiB0eXBlOiAke2V4dGVuc2lvblR5cGV9LiBWYWxpZCB2YWx1ZXMgYXJlOiAke1tcbiAgICAgICAgICAgIC4uLlZBTElEX0VYVF9UWVBFUyxcbiAgICAgICAgICBdLmpvaW4oJywgJyl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9leHREYXRhQnlUeXBlLmhhcyhleHRlbnNpb25UeXBlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBkYXRhO1xuICAgICAgbGV0IGlzTmV3RmlsZSA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgbWtkaXJwKHRoaXMuX2FwcGl1bUhvbWUpO1xuICAgICAgICBjb25zdCB5YW1sID0gYXdhaXQgZnMucmVhZEZpbGUodGhpcy5maWxlcGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgZGF0YSA9IFlBTUwucGFyc2UoeWFtbCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICBbQ09ORklHX0RBVEFfRFJJVkVSX0tFWV06IHt9LFxuICAgICAgICAgICAgW0NPTkZJR19EQVRBX1BMVUdJTl9LRVldOiB7fSxcbiAgICAgICAgICAgIHNjaGVtYVJldjogQ09ORklHX1NDSEVNQV9SRVYsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpc05ld0ZpbGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBcHBpdW0gaGFkIHRyb3VibGUgbG9hZGluZyB0aGUgZXh0ZW5zaW9uIGluc3RhbGxhdGlvbiBgICtcbiAgICAgICAgICAgICAgYGNhY2hlIGZpbGUgKCR7dGhpcy5maWxlcGF0aH0pLiBFbnN1cmUgaXQgZXhpc3RzIGFuZCBpcyBgICtcbiAgICAgICAgICAgICAgYHJlYWRhYmxlLiBTcGVjaWZpYyBlcnJvcjogJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgICB0aGlzLl9leHREYXRhQnlUeXBlLnNldChcbiAgICAgICAgRFJJVkVSX1RZUEUsXG4gICAgICAgIHRoaXMuX2NyZWF0ZVByb3h5KERSSVZFUl9UWVBFLCBkYXRhKSxcbiAgICAgICk7XG4gICAgICB0aGlzLl9leHREYXRhQnlUeXBlLnNldChcbiAgICAgICAgUExVR0lOX1RZUEUsXG4gICAgICAgIHRoaXMuX2NyZWF0ZVByb3h5KFBMVUdJTl9UWVBFLCBkYXRhKSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChpc05ld0ZpbGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy53cml0ZSh0cnVlKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9yZWFkaW5nO1xuICAgICAgcmV0dXJuIHRoaXMuX2V4dERhdGFCeVR5cGUuZ2V0KGV4dGVuc2lvblR5cGUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9yZWFkaW5nID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBkYXRhIGlmIGl0IG5lZWRzIHdyaXRpbmcuXG4gICAqXG4gICAqIElmIHRoZSBgc2NoZW1hUmV2YCBwcm9wIG5lZWRzIHVwZGF0aW5nLCB0aGUgZmlsZSB3aWxsIGJlIHdyaXR0ZW4uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZvcmNlPWZhbHNlXSAtIFdoZXRoZXIgdG8gZm9yY2UgYSB3cml0ZSBldmVuIGlmIHRoZSBkYXRhIGlzIGNsZWFuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIHRoZSBkYXRhIHdhcyB3cml0dGVuXG4gICAqL1xuICBhc3luYyB3cml0ZSAoZm9yY2UgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLl93cml0aW5nKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGluZztcbiAgICB9XG4gICAgdGhpcy5fd3JpdGluZyA9IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXRoaXMuX2RpcnR5ICYmICFmb3JjZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fZGF0YSkge1xuICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcignTm8gZGF0YSB0byB3cml0ZS4gQ2FsbCBgcmVhZCgpYCBmaXJzdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YVRvV3JpdGUgPSB7XG4gICAgICAgICAgLi4udGhpcy5fZGF0YSxcbiAgICAgICAgICBbQ09ORklHX0RBVEFfRFJJVkVSX0tFWV06IHRoaXMuX2V4dERhdGFCeVR5cGUuZ2V0KERSSVZFUl9UWVBFKSxcbiAgICAgICAgICBbQ09ORklHX0RBVEFfUExVR0lOX0tFWV06IHRoaXMuX2V4dERhdGFCeVR5cGUuZ2V0KFBMVUdJTl9UWVBFKSxcbiAgICAgICAgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgICAgICAgIHRoaXMuZmlsZXBhdGgsXG4gICAgICAgICAgICBZQU1MLnN0cmluZ2lmeShkYXRhVG9Xcml0ZSksXG4gICAgICAgICAgICAndXRmOCcsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLl9kaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQXBwaXVtIGNvdWxkIG5vdCBwYXJzZSBvciB3cml0ZSBmcm9tIHRoZSBBcHBpdW0gSG9tZSBkaXJlY3RvcnkgYCArXG4gICAgICAgICAgICAgIGAoJHt0aGlzLl9hcHBpdW1Ib21lfSkuIFBsZWFzZSBlbnN1cmUgaXQgaXMgd3JpdGFibGUuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLl93cml0aW5nID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl93cml0aW5nO1xuICB9XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiBmb3Ige0BsaW5rIEV4dENvbmZpZ0lPfS5cbiAqXG4gKiBNYWludGFpbnMgb25lIGluc3RhbmNlIHBlciB2YWx1ZSBvZiBgQVBQSVVNX0hPTUVgLlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcGl1bUhvbWUgLSBgQVBQSVVNX0hPTUVgXG4gKiBAcmV0dXJucyB7RXh0Q29uZmlnSU99XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHRDb25maWdJT0luc3RhbmNlID0gXy5tZW1vaXplKFxuICAoYXBwaXVtSG9tZSkgPT4gbmV3IEV4dENvbmZpZ0lPKGFwcGl1bUhvbWUpLFxuKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7RXh0Q29uZmlnSU99IEV4dGVuc2lvbkNvbmZpZ0lPXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7dHlwZW9mIERSSVZFUl9UWVBFIHwgdHlwZW9mIFBMVUdJTl9UWVBFfSBFeHRlbnNpb25UeXBlXG4gKi9cbiJdLCJmaWxlIjoibGliL2V4dC1jb25maWctaW8uanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
|
@@ -5,30 +5,43 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.
|
|
8
|
+
exports.DEFAULT_APPIUM_HOME = exports.APPIUM_HOME = void 0;
|
|
9
|
+
Object.defineProperty(exports, "DRIVER_TYPE", {
|
|
10
|
+
enumerable: true,
|
|
11
|
+
get: function () {
|
|
12
|
+
return _extConfigIo.DRIVER_TYPE;
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
exports.INSTALL_TYPE_NPM = exports.INSTALL_TYPE_LOCAL = exports.INSTALL_TYPE_GITHUB = exports.INSTALL_TYPE_GIT = exports.INSTALL_TYPES = void 0;
|
|
16
|
+
Object.defineProperty(exports, "PLUGIN_TYPE", {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
get: function () {
|
|
19
|
+
return _extConfigIo.PLUGIN_TYPE;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
exports.default = void 0;
|
|
9
23
|
|
|
10
24
|
require("source-map-support/register");
|
|
11
25
|
|
|
12
26
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
27
|
|
|
14
|
-
var
|
|
15
|
-
|
|
16
|
-
var _appiumSupport = require("appium-support");
|
|
28
|
+
var _os = _interopRequireDefault(require("os"));
|
|
17
29
|
|
|
18
30
|
var _path = _interopRequireDefault(require("path"));
|
|
19
31
|
|
|
20
|
-
var
|
|
32
|
+
var _resolveFrom = _interopRequireDefault(require("resolve-from"));
|
|
21
33
|
|
|
22
|
-
|
|
23
|
-
exports.DRIVER_TYPE = DRIVER_TYPE;
|
|
24
|
-
const PLUGIN_TYPE = 'plugin';
|
|
25
|
-
exports.PLUGIN_TYPE = PLUGIN_TYPE;
|
|
34
|
+
var _extConfigIo = require("./ext-config-io");
|
|
26
35
|
|
|
27
|
-
|
|
36
|
+
var _logger = _interopRequireDefault(require("./logger"));
|
|
37
|
+
|
|
38
|
+
var _schema = require("./schema/schema");
|
|
39
|
+
|
|
40
|
+
const DEFAULT_APPIUM_HOME = _path.default.resolve(_os.default.homedir(), '.appium');
|
|
28
41
|
|
|
29
42
|
exports.DEFAULT_APPIUM_HOME = DEFAULT_APPIUM_HOME;
|
|
30
|
-
const
|
|
31
|
-
|
|
43
|
+
const APPIUM_HOME = process.env.APPIUM_HOME || DEFAULT_APPIUM_HOME;
|
|
44
|
+
exports.APPIUM_HOME = APPIUM_HOME;
|
|
32
45
|
const INSTALL_TYPE_NPM = 'npm';
|
|
33
46
|
exports.INSTALL_TYPE_NPM = INSTALL_TYPE_NPM;
|
|
34
47
|
const INSTALL_TYPE_LOCAL = 'local';
|
|
@@ -41,28 +54,21 @@ const INSTALL_TYPES = [INSTALL_TYPE_GIT, INSTALL_TYPE_GITHUB, INSTALL_TYPE_LOCAL
|
|
|
41
54
|
exports.INSTALL_TYPES = INSTALL_TYPES;
|
|
42
55
|
|
|
43
56
|
class ExtensionConfig {
|
|
44
|
-
constructor(appiumHome, extensionType, logFn
|
|
45
|
-
|
|
46
|
-
logFn = _logger.default.error.bind(_logger.default);
|
|
47
|
-
}
|
|
48
|
-
|
|
57
|
+
constructor(appiumHome, extensionType, logFn) {
|
|
58
|
+
const logger = _lodash.default.isFunction(logFn) ? logFn : _logger.default.error.bind(_logger.default);
|
|
49
59
|
this.appiumHome = appiumHome;
|
|
50
|
-
this.configFile = _path.default.resolve(this.appiumHome, CONFIG_FILE_NAME);
|
|
51
60
|
this.installedExtensions = {};
|
|
61
|
+
this.io = (0, _extConfigIo.getExtConfigIOInstance)(appiumHome);
|
|
52
62
|
this.extensionType = extensionType;
|
|
53
63
|
this.configKey = `${extensionType}s`;
|
|
54
|
-
this.
|
|
55
|
-
[`${DRIVER_TYPE}s`]: {},
|
|
56
|
-
[`${PLUGIN_TYPE}s`]: {}
|
|
57
|
-
};
|
|
58
|
-
this.log = logFn;
|
|
64
|
+
this.log = logger;
|
|
59
65
|
}
|
|
60
66
|
|
|
61
67
|
validate(exts) {
|
|
62
68
|
const foundProblems = {};
|
|
63
69
|
|
|
64
70
|
for (const [extName, extData] of _lodash.default.toPairs(exts)) {
|
|
65
|
-
foundProblems[extName] = [...this.getGenericConfigProblems(extData), ...this.getConfigProblems(extData)];
|
|
71
|
+
foundProblems[extName] = [...this.getGenericConfigProblems(extData, extName), ...this.getConfigProblems(extData, extName), ...this.getSchemaProblems(extData, extName)];
|
|
66
72
|
}
|
|
67
73
|
|
|
68
74
|
const problemSummaries = [];
|
|
@@ -81,7 +87,7 @@ class ExtensionConfig {
|
|
|
81
87
|
}
|
|
82
88
|
|
|
83
89
|
if (!_lodash.default.isEmpty(problemSummaries)) {
|
|
84
|
-
this.log(`Appium encountered one or more errors while validating ` + `the ${this.configKey} extension file (${this.
|
|
90
|
+
this.log(`Appium encountered one or more errors while validating ` + `the ${this.configKey} extension file (${this.io.filepath}):`);
|
|
85
91
|
|
|
86
92
|
for (const summary of problemSummaries) {
|
|
87
93
|
this.log(summary);
|
|
@@ -91,7 +97,50 @@ class ExtensionConfig {
|
|
|
91
97
|
return exts;
|
|
92
98
|
}
|
|
93
99
|
|
|
94
|
-
|
|
100
|
+
getSchemaProblems(extData, extName) {
|
|
101
|
+
const problems = [];
|
|
102
|
+
const {
|
|
103
|
+
schema: argSchemaPath
|
|
104
|
+
} = extData;
|
|
105
|
+
|
|
106
|
+
if (argSchemaPath) {
|
|
107
|
+
if (_lodash.default.isString(argSchemaPath)) {
|
|
108
|
+
if ((0, _schema.isAllowedSchemaFileExtension)(argSchemaPath)) {
|
|
109
|
+
try {
|
|
110
|
+
this.readExtensionSchema(extName, extData);
|
|
111
|
+
} catch (err) {
|
|
112
|
+
problems.push({
|
|
113
|
+
err: `Unable to register schema at path ${argSchemaPath}; ${err.message}`,
|
|
114
|
+
val: argSchemaPath
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
} else {
|
|
118
|
+
problems.push({
|
|
119
|
+
err: `Schema file has unsupported extension. Allowed: ${[..._schema.ALLOWED_SCHEMA_EXTENSIONS].join(', ')}`,
|
|
120
|
+
val: argSchemaPath
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
} else if (_lodash.default.isPlainObject(argSchemaPath)) {
|
|
124
|
+
try {
|
|
125
|
+
this.readExtensionSchema(extName, extData);
|
|
126
|
+
} catch (err) {
|
|
127
|
+
problems.push({
|
|
128
|
+
err: `Unable to register embedded schema; ${err.message}`,
|
|
129
|
+
val: argSchemaPath
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
} else {
|
|
133
|
+
problems.push({
|
|
134
|
+
err: 'Incorrectly formatted schema field; must be a path to a schema file or a schema object.',
|
|
135
|
+
val: argSchemaPath
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return problems;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
getGenericConfigProblems(extData, extName) {
|
|
95
144
|
const {
|
|
96
145
|
version,
|
|
97
146
|
pkgName,
|
|
@@ -99,7 +148,7 @@ class ExtensionConfig {
|
|
|
99
148
|
installType,
|
|
100
149
|
installPath,
|
|
101
150
|
mainClass
|
|
102
|
-
} =
|
|
151
|
+
} = extData;
|
|
103
152
|
const problems = [];
|
|
104
153
|
|
|
105
154
|
if (!_lodash.default.isString(version)) {
|
|
@@ -147,44 +196,18 @@ class ExtensionConfig {
|
|
|
147
196
|
return problems;
|
|
148
197
|
}
|
|
149
198
|
|
|
150
|
-
getConfigProblems() {
|
|
199
|
+
getConfigProblems(extData, extName) {
|
|
151
200
|
return [];
|
|
152
201
|
}
|
|
153
202
|
|
|
154
|
-
applySchemaMigrations() {
|
|
155
|
-
if (this.yamlData.schemaRev < 2 && _lodash.default.isUndefined(this.yamlData[PLUGIN_TYPE])) {
|
|
156
|
-
this.yamlData[PLUGIN_TYPE] = {};
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
203
|
async read() {
|
|
161
|
-
await
|
|
162
|
-
|
|
163
|
-
try {
|
|
164
|
-
this.yamlData = _yaml.default.parse(await _appiumSupport.fs.readFile(this.configFile, 'utf8'));
|
|
165
|
-
this.applySchemaMigrations();
|
|
166
|
-
this.installedExtensions = this.validate(this.yamlData[this.configKey]);
|
|
167
|
-
} catch (err) {
|
|
168
|
-
if (await _appiumSupport.fs.exists(this.configFile)) {
|
|
169
|
-
throw new Error(`Appium had trouble loading the extension installation ` + `cache file (${this.configFile}). Ensure it exists and is ` + `readable. Specific error: ${err.message}`);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
try {
|
|
173
|
-
await this.write();
|
|
174
|
-
} catch {
|
|
175
|
-
throw new Error(`Appium could not read or write from the Appium Home directory ` + `(${this.appiumHome}). Please ensure it is writable.`);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
204
|
+
const extensions = await this.io.read(this.extensionType);
|
|
205
|
+
this.installedExtensions = this.validate(extensions);
|
|
179
206
|
return this.installedExtensions;
|
|
180
207
|
}
|
|
181
208
|
|
|
182
209
|
async write() {
|
|
183
|
-
|
|
184
|
-
schemaRev: CONFIG_SCHEMA_REV,
|
|
185
|
-
[this.configKey]: this.installedExtensions
|
|
186
|
-
};
|
|
187
|
-
await _appiumSupport.fs.writeFile(this.configFile, _yaml.default.stringify(newYamlData), 'utf8');
|
|
210
|
+
return await this.io.write();
|
|
188
211
|
}
|
|
189
212
|
|
|
190
213
|
async addExtension(extName, extData) {
|
|
@@ -192,6 +215,13 @@ class ExtensionConfig {
|
|
|
192
215
|
await this.write();
|
|
193
216
|
}
|
|
194
217
|
|
|
218
|
+
async updateExtension(extName, extData) {
|
|
219
|
+
this.installedExtensions[extName] = { ...this.installedExtensions[extName],
|
|
220
|
+
...extData
|
|
221
|
+
};
|
|
222
|
+
await this.write();
|
|
223
|
+
}
|
|
224
|
+
|
|
195
225
|
async removeExtension(extName) {
|
|
196
226
|
delete this.installedExtensions[extName];
|
|
197
227
|
await this.write();
|
|
@@ -213,8 +243,8 @@ class ExtensionConfig {
|
|
|
213
243
|
}
|
|
214
244
|
}
|
|
215
245
|
|
|
216
|
-
extensionDesc() {
|
|
217
|
-
throw new Error('This must be implemented in a
|
|
246
|
+
extensionDesc(extName, extData) {
|
|
247
|
+
throw new Error('This must be implemented in a subclass');
|
|
218
248
|
}
|
|
219
249
|
|
|
220
250
|
getExtensionRequirePath(extName) {
|
|
@@ -236,16 +266,55 @@ class ExtensionConfig {
|
|
|
236
266
|
const {
|
|
237
267
|
mainClass
|
|
238
268
|
} = this.installedExtensions[extName];
|
|
239
|
-
|
|
269
|
+
const reqPath = this.getExtensionRequirePath(extName);
|
|
270
|
+
|
|
271
|
+
const reqResolved = require.resolve(reqPath);
|
|
272
|
+
|
|
273
|
+
if (process.env.APPIUM_RELOAD_EXTENSIONS && require.cache[reqResolved]) {
|
|
274
|
+
_logger.default.debug(`Removing ${reqResolved} from require cache`);
|
|
275
|
+
|
|
276
|
+
delete require.cache[reqResolved];
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
return require(reqPath)[mainClass];
|
|
240
280
|
}
|
|
241
281
|
|
|
242
282
|
isInstalled(extName) {
|
|
243
283
|
return _lodash.default.includes(Object.keys(this.installedExtensions), extName);
|
|
244
284
|
}
|
|
245
285
|
|
|
286
|
+
static _readExtensionSchema(appiumHome, extType, extName, extData) {
|
|
287
|
+
const {
|
|
288
|
+
installPath,
|
|
289
|
+
pkgName,
|
|
290
|
+
schema: argSchemaPath
|
|
291
|
+
} = extData;
|
|
292
|
+
|
|
293
|
+
if (!argSchemaPath) {
|
|
294
|
+
throw new TypeError(`No \`schema\` property found in config for ${extType} ${pkgName} -- why is this function being called?`);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
let moduleObject;
|
|
298
|
+
|
|
299
|
+
if (_lodash.default.isString(argSchemaPath)) {
|
|
300
|
+
const schemaPath = (0, _resolveFrom.default)(_path.default.resolve(appiumHome, installPath), _path.default.normalize(`${pkgName}/${argSchemaPath}`));
|
|
301
|
+
moduleObject = require(schemaPath);
|
|
302
|
+
} else {
|
|
303
|
+
moduleObject = argSchemaPath;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
const schema = moduleObject.__esModule ? moduleObject.default : moduleObject;
|
|
307
|
+
(0, _schema.registerSchema)(extType, extName, schema);
|
|
308
|
+
return schema;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
readExtensionSchema(extName, extData) {
|
|
312
|
+
return ExtensionConfig._readExtensionSchema(this.appiumHome, this.extensionType, extName, extData);
|
|
313
|
+
}
|
|
314
|
+
|
|
246
315
|
}
|
|
247
316
|
|
|
248
317
|
exports.default = ExtensionConfig;require('source-map-support').install();
|
|
249
318
|
|
|
250
319
|
|
|
251
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9leHRlbnNpb24tY29uZmlnLmpzIl0sIm5hbWVzIjpbIkRSSVZFUl9UWVBFIiwiUExVR0lOX1RZUEUiLCJERUZBVUxUX0FQUElVTV9IT01FIiwicGF0aCIsInJlc29sdmUiLCJwcm9jZXNzIiwiZW52IiwiSE9NRSIsIkNPTkZJR19GSUxFX05BTUUiLCJDT05GSUdfU0NIRU1BX1JFViIsIklOU1RBTExfVFlQRV9OUE0iLCJJTlNUQUxMX1RZUEVfTE9DQUwiLCJJTlNUQUxMX1RZUEVfR0lUSFVCIiwiSU5TVEFMTF9UWVBFX0dJVCIsIklOU1RBTExfVFlQRVMiLCJFeHRlbnNpb25Db25maWciLCJjb25zdHJ1Y3RvciIsImFwcGl1bUhvbWUiLCJleHRlbnNpb25UeXBlIiwibG9nRm4iLCJsb2ciLCJlcnJvciIsImJpbmQiLCJjb25maWdGaWxlIiwiaW5zdGFsbGVkRXh0ZW5zaW9ucyIsImNvbmZpZ0tleSIsInlhbWxEYXRhIiwidmFsaWRhdGUiLCJleHRzIiwiZm91bmRQcm9ibGVtcyIsImV4dE5hbWUiLCJleHREYXRhIiwiXyIsInRvUGFpcnMiLCJnZXRHZW5lcmljQ29uZmlnUHJvYmxlbXMiLCJnZXRDb25maWdQcm9ibGVtcyIsInByb2JsZW1TdW1tYXJpZXMiLCJwcm9ibGVtcyIsImlzRW1wdHkiLCJwdXNoIiwicHJvYmxlbSIsImVyciIsIkpTT04iLCJzdHJpbmdpZnkiLCJ2YWwiLCJzdW1tYXJ5IiwiZXh0IiwidmVyc2lvbiIsInBrZ05hbWUiLCJpbnN0YWxsU3BlYyIsImluc3RhbGxUeXBlIiwiaW5zdGFsbFBhdGgiLCJtYWluQ2xhc3MiLCJpc1N0cmluZyIsImluY2x1ZGVzIiwiYXBwbHlTY2hlbWFNaWdyYXRpb25zIiwic2NoZW1hUmV2IiwiaXNVbmRlZmluZWQiLCJyZWFkIiwiWUFNTCIsInBhcnNlIiwiZnMiLCJyZWFkRmlsZSIsImV4aXN0cyIsIkVycm9yIiwibWVzc2FnZSIsIndyaXRlIiwibmV3WWFtbERhdGEiLCJ3cml0ZUZpbGUiLCJhZGRFeHRlbnNpb24iLCJyZW1vdmVFeHRlbnNpb24iLCJwcmludCIsImV4dE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluZm8iLCJleHRlbnNpb25EZXNjIiwiZ2V0RXh0ZW5zaW9uUmVxdWlyZVBhdGgiLCJnZXRJbnN0YWxsUGF0aCIsInJlcXVpcmUiLCJpc0luc3RhbGxlZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxXQUFXLEdBQUcsUUFBcEI7O0FBQ0EsTUFBTUMsV0FBVyxHQUFHLFFBQXBCOzs7QUFDQSxNQUFNQyxtQkFBbUIsR0FBR0MsY0FBS0MsT0FBTCxDQUFhQyxPQUFPLENBQUNDLEdBQVIsQ0FBWUMsSUFBekIsRUFBK0IsU0FBL0IsQ0FBNUI7OztBQUVBLE1BQU1DLGdCQUFnQixHQUFHLGlCQUF6QjtBQUNBLE1BQU1DLGlCQUFpQixHQUFHLENBQTFCO0FBRUEsTUFBTUMsZ0JBQWdCLEdBQUcsS0FBekI7O0FBQ0EsTUFBTUMsa0JBQWtCLEdBQUcsT0FBM0I7O0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUcsUUFBNUI7O0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsS0FBekI7O0FBQ0EsTUFBTUMsYUFBYSxHQUFHLENBQ3BCRCxnQkFEb0IsRUFFcEJELG1CQUZvQixFQUdwQkQsa0JBSG9CLEVBSXBCRCxnQkFKb0IsQ0FBdEI7OztBQVFlLE1BQU1LLGVBQU4sQ0FBc0I7QUFDbkNDLEVBQUFBLFdBQVcsQ0FBRUMsVUFBRixFQUFjQyxhQUFkLEVBQTZCQyxLQUFLLEdBQUcsSUFBckMsRUFBMkM7QUFDcEQsUUFBSUEsS0FBSyxLQUFLLElBQWQsRUFBb0I7QUFDbEJBLE1BQUFBLEtBQUssR0FBR0MsZ0JBQUlDLEtBQUosQ0FBVUMsSUFBVixDQUFlRixlQUFmLENBQVI7QUFDRDs7QUFDRCxTQUFLSCxVQUFMLEdBQWtCQSxVQUFsQjtBQUNBLFNBQUtNLFVBQUwsR0FBa0JwQixjQUFLQyxPQUFMLENBQWEsS0FBS2EsVUFBbEIsRUFBOEJU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RUFBVztBQUN2QixVQUFNO0FBQUNxQixNQUFBQTtBQUFELFFBQWdCLEtBQUszQixtQkFBTCxDQUF5Qk0sT0FBekIsQ0FBdEI7QUFDQSxXQUFPM0IsY0FBS0MsT0FBTCxDQUFhLEtBQUthLFVBQWxCLEVBQThCa0MsV0FBOUIsQ0FBUDtBQUNEOztBQUVENEIsRUFBQUEsT0FBTyxDQUFFakQsT0FBRixFQUFXO0FBQ2hCLFVBQU07QUFBQ3NCLE1BQUFBO0FBQUQsUUFBYyxLQUFLNUIsbUJBQUwsQ0FBeUJNLE9BQXpCLENBQXBCO0FBQ0EsV0FBT2lELE9BQU8sQ0FBQyxLQUFLRix1QkFBTCxDQUE2Qi9DLE9BQTdCLENBQUQsQ0FBUCxDQUErQ3NCLFNBQS9DLENBQVA7QUFDRDs7QUFFRDRCLEVBQUFBLFdBQVcsQ0FBRWxELE9BQUYsRUFBVztBQUNwQixXQUFPRSxnQkFBRXNCLFFBQUYsQ0FBV21CLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLEtBQUtsRCxtQkFBakIsQ0FBWCxFQUFrRE0sT0FBbEQsQ0FBUDtBQUNEOztBQWhMa0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBmcywgbWtkaXJwIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgWUFNTCBmcm9tICd5YW1sJztcblxuY29uc3QgRFJJVkVSX1RZUEUgPSAnZHJpdmVyJztcbmNvbnN0IFBMVUdJTl9UWVBFID0gJ3BsdWdpbic7XG5jb25zdCBERUZBVUxUX0FQUElVTV9IT01FID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52LkhPTUUsICcuYXBwaXVtJyk7XG5cbmNvbnN0IENPTkZJR19GSUxFX05BTUUgPSAnZXh0ZW5zaW9ucy55YW1sJztcbmNvbnN0IENPTkZJR19TQ0hFTUFfUkVWID0gMjtcblxuY29uc3QgSU5TVEFMTF9UWVBFX05QTSA9ICducG0nO1xuY29uc3QgSU5TVEFMTF9UWVBFX0xPQ0FMID0gJ2xvY2FsJztcbmNvbnN0IElOU1RBTExfVFlQRV9HSVRIVUIgPSAnZ2l0aHViJztcbmNvbnN0IElOU1RBTExfVFlQRV9HSVQgPSAnZ2l0JztcbmNvbnN0IElOU1RBTExfVFlQRVMgPSBbXG4gIElOU1RBTExfVFlQRV9HSVQsXG4gIElOU1RBTExfVFlQRV9HSVRIVUIsXG4gIElOU1RBTExfVFlQRV9MT0NBTCxcbiAgSU5TVEFMTF9UWVBFX05QTVxuXTtcblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFeHRlbnNpb25Db25maWcge1xuICBjb25zdHJ1Y3RvciAoYXBwaXVtSG9tZSwgZXh0ZW5zaW9uVHlwZSwgbG9nRm4gPSBudWxsKSB7XG4gICAgaWYgKGxvZ0ZuID09PSBudWxsKSB7XG4gICAgICBsb2dGbiA9IGxvZy5lcnJvci5iaW5kKGxvZyk7XG4gICAgfVxuICAgIHRoaXMuYXBwaXVtSG9tZSA9IGFwcGl1bUhvbWU7XG4gICAgdGhpcy5jb25maWdGaWxlID0gcGF0aC5yZXNvbHZlKHRoaXMuYXBwaXVtSG9tZSwgQ09ORklHX0ZJTEVfTkFNRSk7XG4gICAgdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zID0ge307XG4gICAgdGhpcy5leHRlbnNpb25UeXBlID0gZXh0ZW5zaW9uVHlwZTtcbiAgICB0aGlzLmNvbmZpZ0tleSA9IGAke2V4dGVuc2lvblR5cGV9c2A7XG4gICAgdGhpcy55YW1sRGF0YSA9IHtbYCR7RFJJVkVSX1RZUEV9c2BdOiB7fSwgW2Ake1BMVUdJTl9UWVBFfXNgXToge319O1xuICAgIHRoaXMubG9nID0gbG9nRm47XG4gIH1cblxuICB2YWxpZGF0ZSAoZXh0cykge1xuICAgIGNvbnN0IGZvdW5kUHJvYmxlbXMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtleHROYW1lLCBleHREYXRhXSBvZiBfLnRvUGFpcnMoZXh0cykpIHtcbiAgICAgIGZvdW5kUHJvYmxlbXNbZXh0TmFtZV0gPSBbXG4gICAgICAgIC4uLnRoaXMuZ2V0R2VuZXJpY0NvbmZpZ1Byb2JsZW1zKGV4dERhdGEpLFxuICAgICAgICAuLi50aGlzLmdldENvbmZpZ1Byb2JsZW1zKGV4dERhdGEpXG4gICAgICBdO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2JsZW1TdW1tYXJpZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtleHROYW1lLCBwcm9ibGVtc10gb2YgXy50b1BhaXJzKGZvdW5kUHJvYmxlbXMpKSB7XG4gICAgICBpZiAoXy5pc0VtcHR5KHByb2JsZW1zKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0aGlzIGV4dGVuc2lvbiBmcm9tIHRoZSBsaXN0IHNpbmNlIGl0J3Mgbm90IHZhbGlkXG4gICAgICBkZWxldGUgZXh0c1tleHROYW1lXTtcbiAgICAgIHByb2JsZW1TdW1tYXJpZXMucHVzaChgJHt0aGlzLmV4dGVuc2lvblR5cGV9ICR7ZXh0TmFtZX0gaGFkIGVycm9ycyBhbmQgd2lsbCBub3QgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGJlIGF2YWlsYWJsZS4gRXJyb3JzOmApO1xuICAgICAgZm9yIChjb25zdCBwcm9ibGVtIG9mIHByb2JsZW1zKSB7XG4gICAgICAgIHByb2JsZW1TdW1tYXJpZXMucHVzaChgICAtICR7cHJvYmxlbS5lcnJ9IChBY3R1YWwgdmFsdWU6IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkocHJvYmxlbS52YWwpfSlgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNFbXB0eShwcm9ibGVtU3VtbWFyaWVzKSkge1xuICAgICAgdGhpcy5sb2coYEFwcGl1bSBlbmNvdW50ZXJlZCBvbmUgb3IgbW9yZSBlcnJvcnMgd2hpbGUgdmFsaWRhdGluZyBgICtcbiAgICAgICAgICAgICAgIGB0aGUgJHt0aGlzLmNvbmZpZ0tleX0gZXh0ZW5zaW9uIGZpbGUgKCR7dGhpcy5jb25maWdGaWxlfSk6YCk7XG4gICAgICBmb3IgKGNvbnN0IHN1bW1hcnkgb2YgcHJvYmxlbVN1bW1hcmllcykge1xuICAgICAgICB0aGlzLmxvZyhzdW1tYXJ5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXh0cztcbiAgfVxuXG4gIGdldEdlbmVyaWNDb25maWdQcm9ibGVtcyAoZXh0KSB7XG4gICAgY29uc3Qge3ZlcnNpb24sIHBrZ05hbWUsIGluc3RhbGxTcGVjLCBpbnN0YWxsVHlwZSwgaW5zdGFsbFBhdGgsIG1haW5DbGFzc30gPSBleHQ7XG4gICAgY29uc3QgcHJvYmxlbXMgPSBbXTtcblxuICAgIGlmICghXy5pc1N0cmluZyh2ZXJzaW9uKSkge1xuICAgICAgcHJvYmxlbXMucHVzaCh7ZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgdmVyc2lvbicsIHZhbDogdmVyc2lvbn0pO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhwa2dOYW1lKSkge1xuICAgICAgcHJvYmxlbXMucHVzaCh7ZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgTlBNIHBhY2thZ2UgbmFtZScsIHZhbDogcGtnTmFtZX0pO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhpbnN0YWxsU3BlYykpIHtcbiAgICAgIHByb2JsZW1zLnB1c2goe2VycjogJ01pc3Npbmcgb3IgaW5jb3JyZWN0IGluc3RhbGxhdGlvbiBzcGVjJywgdmFsOiBpbnN0YWxsU3BlY30pO1xuICAgIH1cblxuICAgIGlmICghXy5pbmNsdWRlcyhJTlNUQUxMX1RZUEVTLCBpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHByb2JsZW1zLnB1c2goe2VycjogJ01pc3Npbmcgb3IgaW5jb3JyZWN0IGluc3RhbGwgdHlwZScsIHZhbDogaW5zdGFsbFR5cGV9KTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcoaW5zdGFsbFBhdGgpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtlcnI6ICdNaXNzaW5nIG9yIGluY29ycmVjdCBpbnN0YWxsYXRpb24gcGF0aCcsIHZhbDogaW5zdGFsbFBhdGh9KTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcobWFpbkNsYXNzKSkge1xuICAgICAgcHJvYmxlbXMucHVzaCh7ZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgZHJpdmVyIGNsYXNzIG5hbWUnLCB2YWw6IG1haW5DbGFzc30pO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9ibGVtcztcbiAgfVxuXG4gIGdldENvbmZpZ1Byb2JsZW1zICgvKmV4dCovKSB7XG4gICAgLy8gc2hvdWQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgc3BlY2lhbCB2YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSBmb3IgdGhpcyBleHRlbnNpb24gdHlwZVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGFwcGx5U2NoZW1hTWlncmF0aW9ucyAoKSB7XG4gICAgaWYgKHRoaXMueWFtbERhdGEuc2NoZW1hUmV2IDwgMiAmJiBfLmlzVW5kZWZpbmVkKHRoaXMueWFtbERhdGFbUExVR0lOX1RZUEVdKSkge1xuICAgICAgLy8gYXQgc2NoZW1hIHJldmlzaW9uIDIsIHdlIHN0YXJ0ZWQgaW5jbHVkaW5nIHBsdWdpbnMgYXMgd2VsbCBhcyBkcml2ZXJzIGluIHRoZSBmaWxlLFxuICAgICAgLy8gc28gbWFrZSBzdXJlIHdlIGF0IGxlYXN0IGhhdmUgYW4gZW1wdHkgc2VjdGlvbiBmb3IgaXRcbiAgICAgIHRoaXMueWFtbERhdGFbUExVR0lOX1RZUEVdID0ge307XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVhZCAoKSB7XG4gICAgYXdhaXQgbWtkaXJwKHRoaXMuYXBwaXVtSG9tZSk7IC8vIGVuc3VyZSBhcHBpdW0gaG9tZSBleGlzdHNcbiAgICB0cnkge1xuICAgICAgdGhpcy55YW1sRGF0YSA9IFlBTUwucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUodGhpcy5jb25maWdGaWxlLCAndXRmOCcpKTtcbiAgICAgIHRoaXMuYXBwbHlTY2hlbWFNaWdyYXRpb25zKCk7XG5cbiAgICAgIC8vIHNldCB0aGUgbGlzdCBvZiBkcml2ZXJzIHRoZSB1c2VyIGhhcyBpbnN0YWxsZWRcbiAgICAgIHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucyA9IHRoaXMudmFsaWRhdGUodGhpcy55YW1sRGF0YVt0aGlzLmNvbmZpZ0tleV0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGF3YWl0IGZzLmV4aXN0cyh0aGlzLmNvbmZpZ0ZpbGUpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBmaWxlIGV4aXN0cyBhbmQgd2UgY291bGRuJ3QgcGFyc2UgaXQsIHRoYXQncyBhIHByb2JsZW1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcHBpdW0gaGFkIHRyb3VibGUgbG9hZGluZyB0aGUgZXh0ZW5zaW9uIGluc3RhbGxhdGlvbiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBjYWNoZSBmaWxlICgke3RoaXMuY29uZmlnRmlsZX0pLiBFbnN1cmUgaXQgZXhpc3RzIGFuZCBpcyBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGByZWFkYWJsZS4gU3BlY2lmaWMgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZSBjb25maWcgZmlsZSBkb2Vzbid0IGV4aXN0LCB0cnkgdG8gd3JpdGUgYW4gZW1wdHkgb25lLCB0byBtYWtlXG4gICAgICAvLyBzdXJlIHdlIGFjdHVhbGx5IGhhdmUgd3JpdGUgcHJpdmlsZWdlcywgYW5kIGNvbXBsYWluIGlmIHdlIGRvbid0XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLndyaXRlKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcHBpdW0gY291bGQgbm90IHJlYWQgb3Igd3JpdGUgZnJvbSB0aGUgQXBwaXVtIEhvbWUgZGlyZWN0b3J5IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3RoaXMuYXBwaXVtSG9tZX0pLiBQbGVhc2UgZW5zdXJlIGl0IGlzIHdyaXRhYmxlLmApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zO1xuICB9XG5cblxuICBhc3luYyB3cml0ZSAoKSB7XG4gICAgY29uc3QgbmV3WWFtbERhdGEgPSB7XG4gICAgICAuLi50aGlzLnlhbWxEYXRhLFxuICAgICAgc2NoZW1hUmV2OiBDT05GSUdfU0NIRU1BX1JFVixcbiAgICAgIFt0aGlzLmNvbmZpZ0tleV06IHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9uc1xuICAgIH07XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHRoaXMuY29uZmlnRmlsZSwgWUFNTC5zdHJpbmdpZnkobmV3WWFtbERhdGEpLCAndXRmOCcpO1xuICB9XG5cbiAgYXN5bmMgYWRkRXh0ZW5zaW9uIChleHROYW1lLCBleHREYXRhKSB7XG4gICAgdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdID0gZXh0RGF0YTtcbiAgICBhd2FpdCB0aGlzLndyaXRlKCk7XG4gIH1cblxuICBhc3luYyByZW1vdmVFeHRlbnNpb24gKGV4dE5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdO1xuICAgIGF3YWl0IHRoaXMud3JpdGUoKTtcbiAgfVxuXG4gIHByaW50ICgpIHtcbiAgICBjb25zdCBleHROYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucyk7XG4gICAgaWYgKF8uaXNFbXB0eShleHROYW1lcykpIHtcbiAgICAgIGxvZy5pbmZvKGBObyAke3RoaXMuY29uZmlnS2V5fSBoYXZlIGJlZW4gaW5zdGFsbGVkLiBVc2UgdGhlIFwiYXBwaXVtICR7dGhpcy5leHRlbnNpb25UeXBlfVwiIGAgK1xuICAgICAgICAgICAgICAgJ2NvbW1hbmQgdG8gaW5zdGFsbCB0aGUgb25lKHMpIHlvdSB3YW50IHRvIHVzZS4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2cuaW5mbyhgQXZhaWxhYmxlICR7dGhpcy5jb25maWdLZXl9OmApO1xuICAgIGZvciAoY29uc3QgW2V4dE5hbWUsIGV4dERhdGFdIG9mIF8udG9QYWlycyh0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnMpKSB7XG4gICAgICBsb2cuaW5mbyhgICAtICR7dGhpcy5leHRlbnNpb25EZXNjKGV4dE5hbWUsIGV4dERhdGEpfWApO1xuICAgIH1cbiAgfVxuXG4gIGV4dGVuc2lvbkRlc2MgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtdXN0IGJlIGltcGxlbWVudGVkIGluIGEgZmluYWwgY2xhc3MnKTtcbiAgfVxuXG4gIGdldEV4dGVuc2lvblJlcXVpcmVQYXRoIChleHROYW1lKSB7XG4gICAgY29uc3Qge3BrZ05hbWUsIGluc3RhbGxQYXRofSA9IHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHROYW1lXTtcbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKHRoaXMuYXBwaXVtSG9tZSwgaW5zdGFsbFBhdGgsICdub2RlX21vZHVsZXMnLCBwa2dOYW1lKTtcbiAgfVxuXG4gIGdldEluc3RhbGxQYXRoIChleHROYW1lKSB7XG4gICAgY29uc3Qge2luc3RhbGxQYXRofSA9IHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHROYW1lXTtcbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKHRoaXMuYXBwaXVtSG9tZSwgaW5zdGFsbFBhdGgpO1xuICB9XG5cbiAgcmVxdWlyZSAoZXh0TmFtZSkge1xuICAgIGNvbnN0IHttYWluQ2xhc3N9ID0gdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdO1xuICAgIHJldHVybiByZXF1aXJlKHRoaXMuZ2V0RXh0ZW5zaW9uUmVxdWlyZVBhdGgoZXh0TmFtZSkpW21haW5DbGFzc107XG4gIH1cblxuICBpc0luc3RhbGxlZCAoZXh0TmFtZSkge1xuICAgIHJldHVybiBfLmluY2x1ZGVzKE9iamVjdC5rZXlzKHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucyksIGV4dE5hbWUpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIElOU1RBTExfVFlQRV9OUE0sIElOU1RBTExfVFlQRV9HSVQsIElOU1RBTExfVFlQRV9MT0NBTCwgSU5TVEFMTF9UWVBFX0dJVEhVQixcbiAgSU5TVEFMTF9UWVBFUywgREVGQVVMVF9BUFBJVU1fSE9NRSwgRFJJVkVSX1RZUEUsIFBMVUdJTl9UWVBFLFxufTtcbiJdLCJmaWxlIjoibGliL2V4dGVuc2lvbi1jb25maWcuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
|
320
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9leHRlbnNpb24tY29uZmlnLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfQVBQSVVNX0hPTUUiLCJwYXRoIiwicmVzb2x2ZSIsIm9zIiwiaG9tZWRpciIsIkFQUElVTV9IT01FIiwicHJvY2VzcyIsImVudiIsIklOU1RBTExfVFlQRV9OUE0iLCJJTlNUQUxMX1RZUEVfTE9DQUwiLCJJTlNUQUxMX1RZUEVfR0lUSFVCIiwiSU5TVEFMTF9UWVBFX0dJVCIsIklOU1RBTExfVFlQRVMiLCJFeHRlbnNpb25Db25maWciLCJjb25zdHJ1Y3RvciIsImFwcGl1bUhvbWUiLCJleHRlbnNpb25UeXBlIiwibG9nRm4iLCJsb2dnZXIiLCJfIiwiaXNGdW5jdGlvbiIsImxvZyIsImVycm9yIiwiYmluZCIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJpbyIsImNvbmZpZ0tleSIsInZhbGlkYXRlIiwiZXh0cyIsImZvdW5kUHJvYmxlbXMiLCJleHROYW1lIiwiZXh0RGF0YSIsInRvUGFpcnMiLCJnZXRHZW5lcmljQ29uZmlnUHJvYmxlbXMiLCJnZXRDb25maWdQcm9ibGVtcyIsImdldFNjaGVtYVByb2JsZW1zIiwicHJvYmxlbVN1bW1hcmllcyIsInByb2JsZW1zIiwiaXNFbXB0eSIsInB1c2giLCJwcm9ibGVtIiwiZXJyIiwiSlNPTiIsInN0cmluZ2lmeSIsInZhbCIsImZpbGVwYXRoIiwic3VtbWFyeSIsInNjaGVtYSIsImFyZ1NjaGVtYVBhdGgiLCJpc1N0cmluZyIsInJlYWRFeHRlbnNpb25TY2hlbWEiLCJtZXNzYWdlIiwiQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUyIsImpvaW4iLCJpc1BsYWluT2JqZWN0IiwidmVyc2lvbiIsInBrZ05hbWUiLCJpbnN0YWxsU3BlYyIsImluc3RhbGxUeXBlIiwiaW5zdGFsbFBhdGgiLCJtYWluQ2xhc3MiLCJpbmNsdWRlcyIsInJlYWQiLCJleHRlbnNpb25zIiwid3JpdGUiLCJhZGRFeHRlbnNpb24iLCJ1cGRhdGVFeHRlbnNpb24iLCJyZW1vdmVFeHRlbnNpb24iLCJwcmludCIsImV4dE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluZm8iLCJleHRlbnNpb25EZXNjIiwiRXJyb3IiLCJnZXRFeHRlbnNpb25SZXF1aXJlUGF0aCIsImdldEluc3RhbGxQYXRoIiwicmVxdWlyZSIsInJlcVBhdGgiLCJyZXFSZXNvbHZlZCIsIkFQUElVTV9SRUxPQURfRVhURU5TSU9OUyIsImNhY2hlIiwiZGVidWciLCJpc0luc3RhbGxlZCIsIl9yZWFkRXh0ZW5zaW9uU2NoZW1hIiwiZXh0VHlwZSIsIlR5cGVFcnJvciIsIm1vZHVsZU9iamVjdCIsInNjaGVtYVBhdGgiLCJub3JtYWxpemUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLG1CQUFtQixHQUFHQyxjQUFLQyxPQUFMLENBQWFDLFlBQUdDLE9BQUgsRUFBYixFQUEyQixTQUEzQixDQUE1Qjs7O0FBQ0EsTUFBTUMsV0FBVyxHQUFHQyxPQUFPLENBQUNDLEdBQVIsQ0FBWUYsV0FBWixJQUEyQkwsbUJBQS9DOztBQUVBLE1BQU1RLGdCQUFnQixHQUFHLEtBQXpCOztBQUNBLE1BQU1DLGtCQUFrQixHQUFHLE9BQTNCOztBQUNBLE1BQU1DLG1CQUFtQixHQUFHLFFBQTVCOztBQUNBLE1BQU1DLGdCQUFnQixHQUFHLEtBQXpCOztBQUNBLE1BQU1DLGFBQWEsR0FBRyxDQUNwQkQsZ0JBRG9CLEVBRXBCRCxtQkFGb0IsRUFHcEJELGtCQUhvQixFQUlwQkQsZ0JBSm9CLENBQXRCOzs7QUFPZSxNQUFNSyxlQUFOLENBQXNCO0FBT25DQyxFQUFBQSxXQUFXLENBQUVDLFVBQUYsRUFBY0MsYUFBZCxFQUE2QkMsS0FBN0IsRUFBb0M7QUFDN0MsVUFBTUMsTUFBTSxHQUFHQyxnQkFBRUMsVUFBRixDQUFhSCxLQUFiLElBQXNCQSxLQUF0QixHQUE4QkksZ0JBQUlDLEtBQUosQ0FBVUMsSUFBVixDQUFlRixlQUFmLENBQTdDO0FBRUEsU0FBS04sVUFBTCxHQUFrQkEsVUFBbEI7QUFFQSxTQUFLUyxtQkFBTCxHQUEyQixFQUEzQjtBQUVBLFNBQUtDLEVBQUwsR0FBVSx5Q0FBdUJWLFVBQXZCLENBQVY7QUFFQSxTQUFLQyxhQUFMLEdBQXFCQSxhQUFyQjtBQUVBLFNBQUtVLFNBQUwsR0FBa0IsR0FBRVYsYUFBYyxHQUFsQztBQUlBLFNBQUtLLEdBQUwsR0FBV0gsTUFBWDtBQUNEOztBQVFEUyxFQUFBQSxRQUFRLENBQUVDLElBQUYsRUFBUTtBQUNkLFVBQU1DLGFBQWEsR0FBRyxFQUF0Qjs7QUFDQSxTQUFLLE1BQU0sQ0FBQ0MsT0FBRCxFQUFVQyxPQUFWLENBQVgsSUFBaUNaLGdCQUFFYSxPQUFGLENBQVVKLElBQVYsQ0FBakMsRUFBa0Q7QUFDaERDLE1BQUFBLGFBQWEsQ0FBQ0MsT0FBRCxDQUFiLEdBQXlCLENBQ3ZCLEdBQUcsS0FBS0csd0JBQUwsQ0FBOEJGLE9BQTlCLEVBQXVDRCxPQUF2QyxDQURvQixFQUV2QixHQUFHLEtBQUtJLGlCQUFMLENBQXVCSCxPQUF2QixFQUFnQ0QsT0FBaEMsQ0FGb0IsRUFHdkIsR0FBRyxLQUFLSyxpQkFBTCxDQUF1QkosT0FBdkIsRUFBZ0NELE9BQWhDLENBSG9CLENBQXpCO0FBS0Q7O0FBRUQsVUFBTU0sZ0JBQWdCLEdBQUcsRUFBekI7O0FBQ0EsU0FBSyxNQUFNLENBQUNOLE9BQUQsRUFBVU8sUUFBVixDQUFYLElBQWtDbEIsZ0JBQUVhLE9BQUYsQ0FBVUgsYUFBVixDQUFsQyxFQUE0RDtBQUMxRCxVQUFJVixnQkFBRW1CLE9BQUYsQ0FBVUQsUUFBVixDQUFKLEVBQXlCO0FBQ3ZCO0FBQ0Q7O0FBRUQsYUFBT1QsSUFBSSxDQUFDRSxPQUFELENBQVg7QUFDQU0sTUFBQUEsZ0JBQWdCLENBQUNHLElBQWpCLENBQXVCLEdBQUUsS0FBS3ZCLGFBQWMsSUFBR2MsT0FBUSwyQkFBakMsR0FDQyx1QkFEdkI7O0FBRUEsV0FBSyxNQUFNVSxPQUFYLElBQXNCSCxRQUF0QixFQUFnQztBQUM5QkQsUUFBQUEsZ0JBQWdCLENBQUNHLElBQWpCLENBQXVCLE9BQU1DLE9BQU8sQ0FBQ0MsR0FBSSxrQkFBbkIsR0FDQyxHQUFFQyxJQUFJLENBQUNDLFNBQUwsQ0FBZUgsT0FBTyxDQUFDSSxHQUF2QixDQUE0QixHQURyRDtBQUVEO0FBQ0Y7O0FBRUQsUUFBSSxDQUFDekIsZ0JBQUVtQixPQUFGLENBQVVGLGdCQUFWLENBQUwsRUFBa0M7QUFDaEMsV0FBS2YsR0FBTCxDQUFVLHlEQUFELEdBQ0MsT0FBTSxLQUFLSyxTQUFVLG9CQUFtQixLQUFLRCxFQUFMLENBQVFvQixRQUFTLElBRG5FOztBQUVBLFdBQUssTUFBTUMsT0FBWCxJQUFzQlYsZ0JBQXRCLEVBQXdDO0FBQ3RDLGFBQUtmLEdBQUwsQ0FBU3lCLE9BQVQ7QUFDRDtBQUNGOztBQUVELFdBQU9sQixJQUFQO0FBQ0Q7O0FBT0RPLEVBQUFBLGlCQUFpQixDQUFFSixPQUFGLEVBQVdELE9BQVgsRUFBb0I7QUFDbkMsVUFBTU8sUUFBUSxHQUFHLEVBQWpCO0FBQ0EsVUFBTTtBQUFDVSxNQUFBQSxNQUFNLEVBQUVDO0FBQVQsUUFBMEJqQixPQUFoQzs7QUFDQSxRQUFJaUIsYUFBSixFQUFtQjtBQUNqQixVQUFJN0IsZ0JBQUU4QixRQUFGLENBQVdELGFBQVgsQ0FBSixFQUErQjtBQUM3QixZQUFJLDBDQUE2QkEsYUFBN0IsQ0FBSixFQUFpRDtBQUMvQyxjQUFJO0FBQ0YsaUJBQUtFLG1CQUFMLENBQXlCcEIsT0FBekIsRUFBa0NDLE9BQWxDO0FBQ0QsV0FGRCxDQUVFLE9BQU9VLEdBQVAsRUFBWTtBQUNaSixZQUFBQSxRQUFRLENBQUNFLElBQVQsQ0FBYztBQUFDRSxjQUFBQSxHQUFHLEVBQUcscUNBQW9DTyxhQUFjLEtBQUlQLEdBQUcsQ0FBQ1UsT0FBUSxFQUF6RTtBQUE0RVAsY0FBQUEsR0FBRyxFQUFFSTtBQUFqRixhQUFkO0FBQ0Q7QUFDRixTQU5ELE1BTU87QUFDTFgsVUFBQUEsUUFBUSxDQUFDRSxJQUFULENBQWM7QUFDWkUsWUFBQUEsR0FBRyxFQUFHLG1EQUFrRCxDQUFDLEdBQUdXLGlDQUFKLEVBQStCQyxJQUEvQixDQUFvQyxJQUFwQyxDQUEwQyxFQUR0RjtBQUVaVCxZQUFBQSxHQUFHLEVBQUVJO0FBRk8sV0FBZDtBQUlEO0FBQ0YsT0FiRCxNQWFPLElBQUk3QixnQkFBRW1DLGFBQUYsQ0FBZ0JOLGFBQWhCLENBQUosRUFBb0M7QUFDekMsWUFBSTtBQUNGLGVBQUtFLG1CQUFMLENBQXlCcEIsT0FBekIsRUFBa0NDLE9BQWxDO0FBQ0QsU0FGRCxDQUVFLE9BQU9VLEdBQVAsRUFBWTtBQUNaSixVQUFBQSxRQUFRLENBQUNFLElBQVQsQ0FBYztBQUFDRSxZQUFBQSxHQUFHLEVBQUcsdUNBQXNDQSxHQUFHLENBQUNVLE9BQVEsRUFBekQ7QUFBNERQLFlBQUFBLEdBQUcsRUFBRUk7QUFBakUsV0FBZDtBQUNEO0FBQ0YsT0FOTSxNQU1BO0FBQ0xYLFFBQUFBLFFBQVEsQ0FBQ0UsSUFBVCxDQUFjO0FBQ1pFLFVBQUFBLEdBQUcsRUFBRSx5RkFETztBQUVaRyxVQUFBQSxHQUFHLEVBQUVJO0FBRk8sU0FBZDtBQUlEO0FBQ0Y7O0FBQ0QsV0FBT1gsUUFBUDtBQUNEOztBQVFESixFQUFBQSx3QkFBd0IsQ0FBRUYsT0FBRixFQUFXRCxPQUFYLEVBQW9CO0FBQzFDLFVBQU07QUFBQ3lCLE1BQUFBLE9BQUQ7QUFBVUMsTUFBQUEsT0FBVjtBQUFtQkMsTUFBQUEsV0FBbkI7QUFBZ0NDLE1BQUFBLFdBQWhDO0FBQTZDQyxNQUFBQSxXQUE3QztBQUEwREMsTUFBQUE7QUFBMUQsUUFBdUU3QixPQUE3RTtBQUNBLFVBQU1NLFFBQVEsR0FBRyxFQUFqQjs7QUFFQSxRQUFJLENBQUNsQixnQkFBRThCLFFBQUYsQ0FBV00sT0FBWCxDQUFMLEVBQTBCO0FBQ3hCbEIsTUFBQUEsUUFBUSxDQUFDRSxJQUFULENBQWM7QUFBQ0UsUUFBQUEsR0FBRyxFQUFFLDhCQUFOO0FBQXNDRyxRQUFBQSxHQUFHLEVBQUVXO0FBQTNDLE9BQWQ7QUFDRDs7QUFFRCxRQUFJLENBQUNwQyxnQkFBRThCLFFBQUYsQ0FBV08sT0FBWCxDQUFMLEVBQTBCO0FBQ3hCbkIsTUFBQUEsUUFBUSxDQUFDRSxJQUFULENBQWM7QUFBQ0UsUUFBQUEsR0FBRyxFQUFFLHVDQUFOO0FBQStDRyxRQUFBQSxHQUFHLEVBQUVZO0FBQXBELE9BQWQ7QUFDRDs7QUFFRCxRQUFJLENBQUNyQyxnQkFBRThCLFFBQUYsQ0FBV1EsV0FBWCxDQUFMLEVBQThCO0FBQzVCcEIsTUFBQUEsUUFBUSxDQUFDRSxJQUFULENBQWM7QUFBQ0UsUUFBQUEsR0FBRyxFQUFFLHdDQUFOO0FBQWdERyxRQUFBQSxHQUFHLEVBQUVhO0FBQXJELE9BQWQ7QUFDRDs7QUFFRCxRQUFJLENBQUN0QyxnQkFBRTBDLFFBQUYsQ0FBV2pELGFBQVgsRUFBMEI4QyxXQUExQixDQUFMLEVBQTZDO0FBQzNDckIsTUFBQUEsUUFBUSxDQUFDRSxJQUFULENBQWM7QUFBQ0UsUUFBQUEsR0FBRyxFQUFFLG1DQUFOO0FBQTJDRyxRQUFBQSxHQUFHLEVBQUVjO0FBQWhELE9BQWQ7QUFDRDs7QUFFRCxRQUFJLENBQUN2QyxnQkFBRThCLFFBQUYsQ0FBV1UsV0FBWCxDQUFMLEVBQThCO0FBQzVCdEIsTUFBQUEsUUFBUSxDQUFDRSxJQUFULENBQWM7QUFBQ0UsUUFBQUEsR0FBRyxFQUFFLHdDQUFOO0FBQWdERyxRQUFBQSxHQUFHLEVBQUVlO0FBQXJELE9BQWQ7QUFDRDs7QUFFRCxRQUFJLENBQUN4QyxnQkFBRThCLFFBQUYsQ0FBV1csU0FBWCxDQUFMLEVBQTRCO0FBQzFCdkIsTUFBQUEsUUFBUSxDQUFDRSxJQUFULENBQWM7QUFBQ0UsUUFBQUEsR0FBRyxFQUFFLHdDQUFOO0FBQWdERyxRQUFBQSxHQUFHLEVBQUVnQjtBQUFyRCxPQUFkO0FBQ0Q7O0FBRUQsV0FBT3ZCLFFBQVA7QUFDRDs7QUFRREgsRUFBQUEsaUJBQWlCLENBQUVILE9BQUYsRUFBV0QsT0FBWCxFQUFvQjtBQUVuQyxXQUFPLEVBQVA7QUFDRDs7QUFLUyxRQUFKZ0MsSUFBSSxHQUFJO0FBQ1osVUFBTUMsVUFBVSxHQUFHLE1BQU0sS0FBS3RDLEVBQUwsQ0FBUXFDLElBQVIsQ0FBYSxLQUFLOUMsYUFBbEIsQ0FBekI7QUFDQSxTQUFLUSxtQkFBTCxHQUEyQixLQUFLRyxRQUFMLENBQWNvQyxVQUFkLENBQTNCO0FBQ0EsV0FBTyxLQUFLdkMsbUJBQVo7QUFDRDs7QUFLVSxRQUFMd0MsS0FBSyxHQUFJO0FBQ2IsV0FBTyxNQUFNLEtBQUt2QyxFQUFMLENBQVF1QyxLQUFSLEVBQWI7QUFDRDs7QUFPaUIsUUFBWkMsWUFBWSxDQUFFbkMsT0FBRixFQUFXQyxPQUFYLEVBQW9CO0FBQ3BDLFNBQUtQLG1CQUFMLENBQXlCTSxPQUF6QixJQUFvQ0MsT0FBcEM7QUFDQSxVQUFNLEtBQUtpQyxLQUFMLEVBQU47QUFDRDs7QUFPb0IsUUFBZkUsZUFBZSxDQUFFcEMsT0FBRixFQUFXQyxPQUFYLEVBQW9CO0FBQ3ZDLFNBQUtQLG1CQUFMLENBQXlCTSxPQUF6QixJQUFvQyxFQUNsQyxHQUFHLEtBQUtOLG1CQUFMLENBQXlCTSxPQUF6QixDQUQrQjtBQUVsQyxTQUFHQztBQUYrQixLQUFwQztBQUlBLFVBQU0sS0FBS2lDLEtBQUwsRUFBTjtBQUNEOztBQU1vQixRQUFmRyxlQUFlLENBQUVyQyxPQUFGLEVBQVc7QUFDOUIsV0FBTyxLQUFLTixtQkFBTCxDQUF5Qk0sT0FBekIsQ0FBUDtBQUNBLFVBQU0sS0FBS2tDLEtBQUwsRUFBTjtBQUNEOztBQUVESSxFQUFBQSxLQUFLLEdBQUk7QUFDUCxVQUFNQyxRQUFRLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLEtBQUsvQyxtQkFBakIsQ0FBakI7O0FBQ0EsUUFBSUwsZ0JBQUVtQixPQUFGLENBQVUrQixRQUFWLENBQUosRUFBeUI7QUFDdkJoRCxzQkFBSW1ELElBQUosQ0FBVSxNQUFLLEtBQUs5QyxTQUFVLHlDQUF3QyxLQUFLVixhQUFjLElBQWhGLEdBQ0EsZ0RBRFQ7O0FBRUE7QUFDRDs7QUFFREssb0JBQUltRCxJQUFKLENBQVUsYUFBWSxLQUFLOUMsU0FBVSxHQUFyQzs7QUFDQSxTQUFLLE1BQU0sQ0FBQ0ksT0FBRCxFQUFVQyxPQUFWLENBQVgsSUFBaUNaLGdCQUFFYSxPQUFGLENBQVUsS0FBS1IsbUJBQWYsQ0FBakMsRUFBc0U7QUFDcEVILHNCQUFJbUQsSUFBSixDQUFVLE9BQU0sS0FBS0MsYUFBTCxDQUFtQjNDLE9BQW5CLEVBQTRCQyxPQUE1QixDQUFxQyxFQUFyRDtBQUNEO0FBQ0Y7O0FBVUQwQyxFQUFBQSxhQUFhLENBQUUzQyxPQUFGLEVBQVdDLE9BQVgsRUFBb0I7QUFDL0IsVUFBTSxJQUFJMkMsS0FBSixDQUFVLHdDQUFWLENBQU47QUFDRDs7QUFNREMsRUFBQUEsdUJBQXVCLENBQUU3QyxPQUFGLEVBQVc7QUFDaEMsVUFBTTtBQUFDMEIsTUFBQUEsT0FBRDtBQUFVRyxNQUFBQTtBQUFWLFFBQXlCLEtBQUtuQyxtQkFBTCxDQUF5Qk0sT0FBekIsQ0FBL0I7QUFDQSxXQUFPN0IsY0FBS0MsT0FBTCxDQUFhLEtBQUthLFVBQWxCLEVBQThCNEMsV0FBOUIsRUFBMkMsY0FBM0MsRUFBMkRILE9BQTNELENBQVA7QUFDRDs7QUFNRG9CLEVBQUFBLGNBQWMsQ0FBRTlDLE9BQUYsRUFBVztBQUN2QixVQUFNO0FBQUM2QixNQUFBQTtBQUFELFFBQWdCLEtBQUtuQyxtQkFBTCxDQUF5Qk0sT0FBekIsQ0FBdEI7QUFDQSxXQUFPN0IsY0FBS0MsT0FBTCxDQUFhLEtBQUthLFVBQWxCLEVBQThCNEMsV0FBOUIsQ0FBUDtBQUNEOztBQU9Ea0IsRUFBQUEsT0FBTyxDQUFFL0MsT0FBRixFQUFXO0FBQ2hCLFVBQU07QUFBQzhCLE1BQUFBO0FBQUQsUUFBYyxLQUFLcEMsbUJBQUwsQ0FBeUJNLE9BQXpCLENBQXBCO0FBQ0EsVUFBTWdELE9BQU8sR0FBRyxLQUFLSCx1QkFBTCxDQUE2QjdDLE9BQTdCLENBQWhCOztBQUNBLFVBQU1pRCxXQUFXLEdBQUdGLE9BQU8sQ0FBQzNFLE9BQVIsQ0FBZ0I0RSxPQUFoQixDQUFwQjs7QUFDQSxRQUFJeEUsT0FBTyxDQUFDQyxHQUFSLENBQVl5RSx3QkFBWixJQUF3Q0gsT0FBTyxDQUFDSSxLQUFSLENBQWNGLFdBQWQsQ0FBNUMsRUFBd0U7QUFDdEUxRCxzQkFBSTZELEtBQUosQ0FBVyxZQUFXSCxXQUFZLHFCQUFsQzs7QUFDQSxhQUFPRixPQUFPLENBQUNJLEtBQVIsQ0FBY0YsV0FBZCxDQUFQO0FBQ0Q7O0FBQ0QsV0FBT0YsT0FBTyxDQUFDQyxPQUFELENBQVAsQ0FBaUJsQixTQUFqQixDQUFQO0FBQ0Q7O0FBTUR1QixFQUFBQSxXQUFXLENBQUVyRCxPQUFGLEVBQVc7QUFDcEIsV0FBT1gsZ0JBQUUwQyxRQUFGLENBQVdTLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLEtBQUsvQyxtQkFBakIsQ0FBWCxFQUFrRE0sT0FBbEQsQ0FBUDtBQUNEOztBQVcwQixTQUFwQnNELG9CQUFvQixDQUFFckUsVUFBRixFQUFjc0UsT0FBZCxFQUF1QnZELE9BQXZCLEVBQWdDQyxPQUFoQyxFQUF5QztBQUNsRSxVQUFNO0FBQUM0QixNQUFBQSxXQUFEO0FBQWNILE1BQUFBLE9BQWQ7QUFBdUJULE1BQUFBLE1BQU0sRUFBRUM7QUFBL0IsUUFBZ0RqQixPQUF0RDs7QUFDQSxRQUFJLENBQUNpQixhQUFMLEVBQW9CO0FBQ2xCLFlBQU0sSUFBSXNDLFNBQUosQ0FDSCw4Q0FBNkNELE9BQVEsSUFBRzdCLE9BQVEsd0NBRDdELENBQU47QUFHRDs7QUFDRCxRQUFJK0IsWUFBSjs7QUFDQSxRQUFJcEUsZ0JBQUU4QixRQUFGLENBQVdELGFBQVgsQ0FBSixFQUErQjtBQUM3QixZQUFNd0MsVUFBVSxHQUFHLDBCQUNqQnZGLGNBQUtDLE9BQUwsQ0FBYWEsVUFBYixFQUF5QjRDLFdBQXpCLENBRGlCLEVBR2pCMUQsY0FBS3dGLFNBQUwsQ0FBZ0IsR0FBRWpDLE9BQVEsSUFBR1IsYUFBYyxFQUEzQyxDQUhpQixDQUFuQjtBQUtBdUMsTUFBQUEsWUFBWSxHQUFHVixPQUFPLENBQUNXLFVBQUQsQ0FBdEI7QUFDRCxLQVBELE1BT087QUFDTEQsTUFBQUEsWUFBWSxHQUFHdkMsYUFBZjtBQUNEOztBQUVELFVBQU1ELE1BQU0sR0FBR3dDLFlBQVksQ0FBQ0csVUFBYixHQUNYSCxZQUFZLENBQUNJLE9BREYsR0FFWEosWUFGSjtBQUdBLGdDQUFlRixPQUFmLEVBQXdCdkQsT0FBeEIsRUFBaUNpQixNQUFqQztBQUNBLFdBQU9BLE1BQVA7QUFDRDs7QUFTREcsRUFBQUEsbUJBQW1CLENBQUVwQixPQUFGLEVBQVdDLE9BQVgsRUFBb0I7QUFDckMsV0FBT2xCLGVBQWUsQ0FBQ3VFLG9CQUFoQixDQUFxQyxLQUFLckUsVUFBMUMsRUFBc0QsS0FBS0MsYUFBM0QsRUFBMEVjLE9BQTFFLEVBQW1GQyxPQUFuRixDQUFQO0FBQ0Q7O0FBelRrQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHJlc29sdmVGcm9tIGZyb20gJ3Jlc29sdmUtZnJvbSc7XG5pbXBvcnQgeyBnZXRFeHRDb25maWdJT0luc3RhbmNlIH0gZnJvbSAnLi9leHQtY29uZmlnLWlvJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUywgaXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbiwgcmVnaXN0ZXJTY2hlbWEgfSBmcm9tICcuL3NjaGVtYS9zY2hlbWEnO1xuXG5jb25zdCBERUZBVUxUX0FQUElVTV9IT01FID0gcGF0aC5yZXNvbHZlKG9zLmhvbWVkaXIoKSwgJy5hcHBpdW0nKTtcbmNvbnN0IEFQUElVTV9IT01FID0gcHJvY2Vzcy5lbnYuQVBQSVVNX0hPTUUgfHwgREVGQVVMVF9BUFBJVU1fSE9NRTtcblxuY29uc3QgSU5TVEFMTF9UWVBFX05QTSA9ICducG0nO1xuY29uc3QgSU5TVEFMTF9UWVBFX0xPQ0FMID0gJ2xvY2FsJztcbmNvbnN0IElOU1RBTExfVFlQRV9HSVRIVUIgPSAnZ2l0aHViJztcbmNvbnN0IElOU1RBTExfVFlQRV9HSVQgPSAnZ2l0JztcbmNvbnN0IElOU1RBTExfVFlQRVMgPSBbXG4gIElOU1RBTExfVFlQRV9HSVQsXG4gIElOU1RBTExfVFlQRV9HSVRIVUIsXG4gIElOU1RBTExfVFlQRV9MT0NBTCxcbiAgSU5TVEFMTF9UWVBFX05QTVxuXTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXh0ZW5zaW9uQ29uZmlnIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBpdW1Ib21lIC0gYEFQUElVTV9IT01FYFxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dGVuc2lvblR5cGUgLSBUeXBlIG9mIGV4dGVuc2lvblxuICAgKiBAcGFyYW0geyguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZH0gW2xvZ0ZuXVxuICAgKi9cbiAgY29uc3RydWN0b3IgKGFwcGl1bUhvbWUsIGV4dGVuc2lvblR5cGUsIGxvZ0ZuKSB7XG4gICAgY29uc3QgbG9nZ2VyID0gXy5pc0Z1bmN0aW9uKGxvZ0ZuKSA/IGxvZ0ZuIDogbG9nLmVycm9yLmJpbmQobG9nKTtcbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICB0aGlzLmFwcGl1bUhvbWUgPSBhcHBpdW1Ib21lO1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxvYmplY3Q+fSAqL1xuICAgIHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucyA9IHt9O1xuICAgIC8qKiBAdHlwZSB7aW1wb3J0KCcuL2V4dC1jb25maWctaW8nKS5FeHRlbnNpb25Db25maWdJT30gKi9cbiAgICB0aGlzLmlvID0gZ2V0RXh0Q29uZmlnSU9JbnN0YW5jZShhcHBpdW1Ib21lKTtcbiAgICAvKiogQHR5cGUge0V4dGVuc2lvblR5cGV9ICovXG4gICAgdGhpcy5leHRlbnNpb25UeXBlID0gZXh0ZW5zaW9uVHlwZTtcbiAgICAvKiogQHR5cGUgeydkcml2ZXJzJ3wncGx1Z2lucyd9ICovXG4gICAgdGhpcy5jb25maWdLZXkgPSBgJHtleHRlbnNpb25UeXBlfXNgOyAvLyB0b2RvIHVzZSB0ZW1wbGF0ZSB0eXBlXG4gICAgLyoqXG4gICAgICogQHR5cGUgeyguLi5hcmdzOiBhbnlbXSk9PnZvaWR9XG4gICAgICovXG4gICAgdGhpcy5sb2cgPSBsb2dnZXI7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGV4dGVuc2lvbnMgZm9yIHByb2JsZW1zXG4gICAqIEB0ZW1wbGF0ZSBFeHREYXRhXG4gICAqIEBwYXJhbSB7RXh0RGF0YVtdfSBleHRzIC0gQXJyYXkgb2YgZXh0RGF0YSBvYmplY3RzXG4gICAqIEByZXR1cm5zIHtFeHREYXRhW119XG4gICAqL1xuICB2YWxpZGF0ZSAoZXh0cykge1xuICAgIGNvbnN0IGZvdW5kUHJvYmxlbXMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtleHROYW1lLCBleHREYXRhXSBvZiBfLnRvUGFpcnMoZXh0cykpIHtcbiAgICAgIGZvdW5kUHJvYmxlbXNbZXh0TmFtZV0gPSBbXG4gICAgICAgIC4uLnRoaXMuZ2V0R2VuZXJpY0NvbmZpZ1Byb2JsZW1zKGV4dERhdGEsIGV4dE5hbWUpLFxuICAgICAgICAuLi50aGlzLmdldENvbmZpZ1Byb2JsZW1zKGV4dERhdGEsIGV4dE5hbWUpLFxuICAgICAgICAuLi50aGlzLmdldFNjaGVtYVByb2JsZW1zKGV4dERhdGEsIGV4dE5hbWUpXG4gICAgICBdO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2JsZW1TdW1tYXJpZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtleHROYW1lLCBwcm9ibGVtc10gb2YgXy50b1BhaXJzKGZvdW5kUHJvYmxlbXMpKSB7XG4gICAgICBpZiAoXy5pc0VtcHR5KHByb2JsZW1zKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0aGlzIGV4dGVuc2lvbiBmcm9tIHRoZSBsaXN0IHNpbmNlIGl0J3Mgbm90IHZhbGlkXG4gICAgICBkZWxldGUgZXh0c1tleHROYW1lXTtcbiAgICAgIHByb2JsZW1TdW1tYXJpZXMucHVzaChgJHt0aGlzLmV4dGVuc2lvblR5cGV9ICR7ZXh0TmFtZX0gaGFkIGVycm9ycyBhbmQgd2lsbCBub3QgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGJlIGF2YWlsYWJsZS4gRXJyb3JzOmApO1xuICAgICAgZm9yIChjb25zdCBwcm9ibGVtIG9mIHByb2JsZW1zKSB7XG4gICAgICAgIHByb2JsZW1TdW1tYXJpZXMucHVzaChgICAtICR7cHJvYmxlbS5lcnJ9IChBY3R1YWwgdmFsdWU6IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkocHJvYmxlbS52YWwpfSlgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNFbXB0eShwcm9ibGVtU3VtbWFyaWVzKSkge1xuICAgICAgdGhpcy5sb2coYEFwcGl1bSBlbmNvdW50ZXJlZCBvbmUgb3IgbW9yZSBlcnJvcnMgd2hpbGUgdmFsaWRhdGluZyBgICtcbiAgICAgICAgICAgICAgIGB0aGUgJHt0aGlzLmNvbmZpZ0tleX0gZXh0ZW5zaW9uIGZpbGUgKCR7dGhpcy5pby5maWxlcGF0aH0pOmApO1xuICAgICAgZm9yIChjb25zdCBzdW1tYXJ5IG9mIHByb2JsZW1TdW1tYXJpZXMpIHtcbiAgICAgICAgdGhpcy5sb2coc3VtbWFyeSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4dHM7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGV4dERhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICogQHJldHVybnMge1Byb2JsZW1bXX1cbiAgICovXG4gIGdldFNjaGVtYVByb2JsZW1zIChleHREYXRhLCBleHROYW1lKSB7XG4gICAgY29uc3QgcHJvYmxlbXMgPSBbXTtcbiAgICBjb25zdCB7c2NoZW1hOiBhcmdTY2hlbWFQYXRofSA9IGV4dERhdGE7XG4gICAgaWYgKGFyZ1NjaGVtYVBhdGgpIHtcbiAgICAgIGlmIChfLmlzU3RyaW5nKGFyZ1NjaGVtYVBhdGgpKSB7XG4gICAgICAgIGlmIChpc0FsbG93ZWRTY2hlbWFGaWxlRXh0ZW5zaW9uKGFyZ1NjaGVtYVBhdGgpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucmVhZEV4dGVuc2lvblNjaGVtYShleHROYW1lLCBleHREYXRhKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHByb2JsZW1zLnB1c2goe2VycjogYFVuYWJsZSB0byByZWdpc3RlciBzY2hlbWEgYXQgcGF0aCAke2FyZ1NjaGVtYVBhdGh9OyAke2Vyci5tZXNzYWdlfWAsIHZhbDogYXJnU2NoZW1hUGF0aH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgICAgIGVycjogYFNjaGVtYSBmaWxlIGhhcyB1bnN1cHBvcnRlZCBleHRlbnNpb24uIEFsbG93ZWQ6ICR7Wy4uLkFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlNdLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgIHZhbDogYXJnU2NoZW1hUGF0aFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChhcmdTY2hlbWFQYXRoKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMucmVhZEV4dGVuc2lvblNjaGVtYShleHROYW1lLCBleHREYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCh7ZXJyOiBgVW5hYmxlIHRvIHJlZ2lzdGVyIGVtYmVkZGVkIHNjaGVtYTsgJHtlcnIubWVzc2FnZX1gLCB2YWw6IGFyZ1NjaGVtYVBhdGh9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgICAgZXJyOiAnSW5jb3JyZWN0bHkgZm9ybWF0dGVkIHNjaGVtYSBmaWVsZDsgbXVzdCBiZSBhIHBhdGggdG8gYSBzY2hlbWEgZmlsZSBvciBhIHNjaGVtYSBvYmplY3QuJyxcbiAgICAgICAgICB2YWw6IGFyZ1NjaGVtYVBhdGhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9ibGVtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZXh0RGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZVxuICAgKiBAcmV0dXJucyB7UHJvYmxlbVtdfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIGdldEdlbmVyaWNDb25maWdQcm9ibGVtcyAoZXh0RGF0YSwgZXh0TmFtZSkge1xuICAgIGNvbnN0IHt2ZXJzaW9uLCBwa2dOYW1lLCBpbnN0YWxsU3BlYywgaW5zdGFsbFR5cGUsIGluc3RhbGxQYXRoLCBtYWluQ2xhc3N9ID0gZXh0RGF0YTtcbiAgICBjb25zdCBwcm9ibGVtcyA9IFtdO1xuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHZlcnNpb24pKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtlcnI6ICdNaXNzaW5nIG9yIGluY29ycmVjdCB2ZXJzaW9uJywgdmFsOiB2ZXJzaW9ufSk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBrZ05hbWUpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtlcnI6ICdNaXNzaW5nIG9yIGluY29ycmVjdCBOUE0gcGFja2FnZSBuYW1lJywgdmFsOiBwa2dOYW1lfSk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKGluc3RhbGxTcGVjKSkge1xuICAgICAgcHJvYmxlbXMucHVzaCh7ZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgaW5zdGFsbGF0aW9uIHNwZWMnLCB2YWw6IGluc3RhbGxTcGVjfSk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmluY2x1ZGVzKElOU1RBTExfVFlQRVMsIGluc3RhbGxUeXBlKSkge1xuICAgICAgcHJvYmxlbXMucHVzaCh7ZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgaW5zdGFsbCB0eXBlJywgdmFsOiBpbnN0YWxsVHlwZX0pO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhpbnN0YWxsUGF0aCkpIHtcbiAgICAgIHByb2JsZW1zLnB1c2goe2VycjogJ01pc3Npbmcgb3IgaW5jb3JyZWN0IGluc3RhbGxhdGlvbiBwYXRoJywgdmFsOiBpbnN0YWxsUGF0aH0pO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhtYWluQ2xhc3MpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtlcnI6ICdNaXNzaW5nIG9yIGluY29ycmVjdCBkcml2ZXIgY2xhc3MgbmFtZScsIHZhbDogbWFpbkNsYXNzfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb2JsZW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBleHREYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtQcm9ibGVtW119XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZ2V0Q29uZmlnUHJvYmxlbXMgKGV4dERhdGEsIGV4dE5hbWUpIHtcbiAgICAvLyBzaG91ZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiBzcGVjaWFsIHZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IGZvciB0aGlzIGV4dGVuc2lvbiB0eXBlXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHR5cGVvZiB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnM+fVxuICAgKi9cbiAgYXN5bmMgcmVhZCAoKSB7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IGF3YWl0IHRoaXMuaW8ucmVhZCh0aGlzLmV4dGVuc2lvblR5cGUpO1xuICAgIHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucyA9IHRoaXMudmFsaWRhdGUoZXh0ZW5zaW9ucyk7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIHdyaXRlICgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5pby53cml0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBleHREYXRhXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgYWRkRXh0ZW5zaW9uIChleHROYW1lLCBleHREYXRhKSB7XG4gICAgdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdID0gZXh0RGF0YTtcbiAgICBhd2FpdCB0aGlzLndyaXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICogQHBhcmFtIHtvYmplY3R9IGV4dERhdGFcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB1cGRhdGVFeHRlbnNpb24gKGV4dE5hbWUsIGV4dERhdGEpIHtcbiAgICB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV0gPSB7XG4gICAgICAuLi50aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV0sXG4gICAgICAuLi5leHREYXRhLFxuICAgIH07XG4gICAgYXdhaXQgdGhpcy53cml0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlRXh0ZW5zaW9uIChleHROYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHROYW1lXTtcbiAgICBhd2FpdCB0aGlzLndyaXRlKCk7XG4gIH1cblxuICBwcmludCAoKSB7XG4gICAgY29uc3QgZXh0TmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnMpO1xuICAgIGlmIChfLmlzRW1wdHkoZXh0TmFtZXMpKSB7XG4gICAgICBsb2cuaW5mbyhgTm8gJHt0aGlzLmNvbmZpZ0tleX0gaGF2ZSBiZWVuIGluc3RhbGxlZC4gVXNlIHRoZSBcImFwcGl1bSAke3RoaXMuZXh0ZW5zaW9uVHlwZX1cIiBgICtcbiAgICAgICAgICAgICAgICdjb21tYW5kIHRvIGluc3RhbGwgdGhlIG9uZShzKSB5b3Ugd2FudCB0byB1c2UuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nLmluZm8oYEF2YWlsYWJsZSAke3RoaXMuY29uZmlnS2V5fTpgKTtcbiAgICBmb3IgKGNvbnN0IFtleHROYW1lLCBleHREYXRhXSBvZiBfLnRvUGFpcnModGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKSkge1xuICAgICAgbG9nLmluZm8oYCAgLSAke3RoaXMuZXh0ZW5zaW9uRGVzYyhleHROYW1lLCBleHREYXRhKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBleHRlbnNpb24uIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lIC0gRXh0ZW5zaW9uIG5hbWVcbiAgICogQHBhcmFtIHtvYmplY3R9IGV4dERhdGEgLSBFeHRlbnNpb24gZGF0YVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBleHRlbnNpb25EZXNjIChleHROYW1lLCBleHREYXRhKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gYSBzdWJjbGFzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXRFeHRlbnNpb25SZXF1aXJlUGF0aCAoZXh0TmFtZSkge1xuICAgIGNvbnN0IHtwa2dOYW1lLCBpbnN0YWxsUGF0aH0gPSB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV07XG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZSh0aGlzLmFwcGl1bUhvbWUsIGluc3RhbGxQYXRoLCAnbm9kZV9tb2R1bGVzJywgcGtnTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldEluc3RhbGxQYXRoIChleHROYW1lKSB7XG4gICAgY29uc3Qge2luc3RhbGxQYXRofSA9IHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHROYW1lXTtcbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKHRoaXMuYXBwaXVtSG9tZSwgaW5zdGFsbFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGV4dGVuc2lvbiBhbmQgcmV0dXJucyBpdHMgbWFpbiBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZVxuICAgKiBAcmV0dXJucyB7KC4uLmFyZ3M6IGFueVtdKSA9PiBvYmplY3QgfVxuICAgKi9cbiAgcmVxdWlyZSAoZXh0TmFtZSkge1xuICAgIGNvbnN0IHttYWluQ2xhc3N9ID0gdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdO1xuICAgIGNvbnN0IHJlcVBhdGggPSB0aGlzLmdldEV4dGVuc2lvblJlcXVpcmVQYXRoKGV4dE5hbWUpO1xuICAgIGNvbnN0IHJlcVJlc29sdmVkID0gcmVxdWlyZS5yZXNvbHZlKHJlcVBhdGgpO1xuICAgIGlmIChwcm9jZXNzLmVudi5BUFBJVU1fUkVMT0FEX0VYVEVOU0lPTlMgJiYgcmVxdWlyZS5jYWNoZVtyZXFSZXNvbHZlZF0pIHtcbiAgICAgIGxvZy5kZWJ1ZyhgUmVtb3ZpbmcgJHtyZXFSZXNvbHZlZH0gZnJvbSByZXF1aXJlIGNhY2hlYCk7XG4gICAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtyZXFSZXNvbHZlZF07XG4gICAgfVxuICAgIHJldHVybiByZXF1aXJlKHJlcVBhdGgpW21haW5DbGFzc107XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0luc3RhbGxlZCAoZXh0TmFtZSkge1xuICAgIHJldHVybiBfLmluY2x1ZGVzKE9iamVjdC5rZXlzKHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucyksIGV4dE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVuZGVkIHRvIGJlIGNhbGxlZCBieSBjb3JyZXNwb25kaW5nIGluc3RhbmNlIG1ldGhvZHMgb2Ygc3ViY2xhc3MuXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBpdW1Ib21lXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gZXh0VHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZSAtIEV4dGVuc2lvbiBuYW1lICh1bmlxdWUgdG8gaXRzIHR5cGUpXG4gICAqIEBwYXJhbSB7RXh0RGF0YX0gZXh0RGF0YSAtIEV4dGVuc2lvbiBjb25maWdcbiAgICogQHJldHVybnMge2ltcG9ydCgnYWp2JykuU2NoZW1hT2JqZWN0fHVuZGVmaW5lZH1cbiAgICovXG4gIHN0YXRpYyBfcmVhZEV4dGVuc2lvblNjaGVtYSAoYXBwaXVtSG9tZSwgZXh0VHlwZSwgZXh0TmFtZSwgZXh0RGF0YSkge1xuICAgIGNvbnN0IHtpbnN0YWxsUGF0aCwgcGtnTmFtZSwgc2NoZW1hOiBhcmdTY2hlbWFQYXRofSA9IGV4dERhdGE7XG4gICAgaWYgKCFhcmdTY2hlbWFQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgTm8gXFxgc2NoZW1hXFxgIHByb3BlcnR5IGZvdW5kIGluIGNvbmZpZyBmb3IgJHtleHRUeXBlfSAke3BrZ05hbWV9IC0tIHdoeSBpcyB0aGlzIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZD9gLFxuICAgICAgKTtcbiAgICB9XG4gICAgbGV0IG1vZHVsZU9iamVjdDtcbiAgICBpZiAoXy5pc1N0cmluZyhhcmdTY2hlbWFQYXRoKSkge1xuICAgICAgY29uc3Qgc2NoZW1hUGF0aCA9IHJlc29sdmVGcm9tKFxuICAgICAgICBwYXRoLnJlc29sdmUoYXBwaXVtSG9tZSwgaW5zdGFsbFBhdGgpLFxuICAgICAgICAvLyB0aGlzIHBhdGggc2VwIGlzIGZpbmUgYmVjYXVzZSBgcmVzb2x2ZUZyb21gIHVzZXMgTm9kZSdzIG1vZHVsZSByZXNvbHV0aW9uXG4gICAgICAgIHBhdGgubm9ybWFsaXplKGAke3BrZ05hbWV9LyR7YXJnU2NoZW1hUGF0aH1gKSxcbiAgICAgICk7XG4gICAgICBtb2R1bGVPYmplY3QgPSByZXF1aXJlKHNjaGVtYVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtb2R1bGVPYmplY3QgPSBhcmdTY2hlbWFQYXRoO1xuICAgIH1cbiAgICAvLyB0aGlzIHN1Y2tzLiBkZWZhdWx0IGV4cG9ydHMgc2hvdWxkIGJlIGRlc3Ryb3llZFxuICAgIGNvbnN0IHNjaGVtYSA9IG1vZHVsZU9iamVjdC5fX2VzTW9kdWxlXG4gICAgICA/IG1vZHVsZU9iamVjdC5kZWZhdWx0XG4gICAgICA6IG1vZHVsZU9iamVjdDtcbiAgICByZWdpc3RlclNjaGVtYShleHRUeXBlLCBleHROYW1lLCBzY2hlbWEpO1xuICAgIHJldHVybiBzY2hlbWE7XG4gIH1cblxuICAvKipcbiAgICogSWYgYW4gZXh0ZW5zaW9uIHByb3ZpZGVzIGEgc2NoZW1hLCB0aGlzIHdpbGwgbG9hZCB0aGUgc2NoZW1hIGFuZCBhdHRlbXB0IHRvXG4gICAqIHJlZ2lzdGVyIGl0IHdpdGggdGhlIHNjaGVtYSByZWdpc3RyYXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lIC0gTmFtZSBvZiBleHRlbnNpb25cbiAgICogQHBhcmFtIHtFeHREYXRhfSBleHREYXRhIC0gRXh0ZW5zaW9uIGRhdGFcbiAgICogQHJldHVybnMge2ltcG9ydCgnYWp2JykuU2NoZW1hT2JqZWN0fHVuZGVmaW5lZH1cbiAgICovXG4gIHJlYWRFeHRlbnNpb25TY2hlbWEgKGV4dE5hbWUsIGV4dERhdGEpIHtcbiAgICByZXR1cm4gRXh0ZW5zaW9uQ29uZmlnLl9yZWFkRXh0ZW5zaW9uU2NoZW1hKHRoaXMuYXBwaXVtSG9tZSwgdGhpcy5leHRlbnNpb25UeXBlLCBleHROYW1lLCBleHREYXRhKTtcbiAgfVxufVxuXG5leHBvcnQgeyBEUklWRVJfVFlQRSwgUExVR0lOX1RZUEUgfSBmcm9tICcuL2V4dC1jb25maWctaW8nO1xuZXhwb3J0IHtcbiAgSU5TVEFMTF9UWVBFX05QTSwgSU5TVEFMTF9UWVBFX0dJVCwgSU5TVEFMTF9UWVBFX0xPQ0FMLCBJTlNUQUxMX1RZUEVfR0lUSFVCLFxuICBJTlNUQUxMX1RZUEVTLCBERUZBVUxUX0FQUElVTV9IT01FLCBBUFBJVU1fSE9NRVxufTtcblxuLyoqXG4gKiBDb25maWcgcHJvYmxlbVxuICogQHR5cGVkZWYge09iamVjdH0gUHJvYmxlbVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVyciAtIEVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7YW55fSB2YWwgLSBBc3NvY2lhdGVkIHZhbHVlXG4gKi9cblxuLyoqXG4gKiBBbGlhc1xuICogQHR5cGVkZWYge2ltcG9ydCgnLi9leHQtY29uZmlnLWlvJykuRXh0ZW5zaW9uVHlwZX0gRXh0ZW5zaW9uVHlwZVxuICovXG5cbi8qKlxuICogRXh0ZW5zaW9uIGRhdGEgKHB1bGxlZCBmcm9tIGNvbmZpZyBZQU1MKVxuICogQHR5cGVkZWYge09iamVjdH0gRXh0RGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd8aW1wb3J0KCdhanYnKS5TY2hlbWFPYmplY3R9IFtzY2hlbWFdIC0gT3B0aW9uYWwgc2NoZW1hIHBhdGggaWYgdGhlIGV4dCBkZWZpbmVkIGl0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGtnTmFtZSAtIFBhY2thZ2UgbmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGluc3RhbGxQYXRoIC0gQWN0dWFsbHkgbG9va3MgbW9yZSBsaWtlIGEgbW9kdWxlIGlkZW50aWZpZXI/IFJlc29sdmVkIGZyb20gYEFQUElVTV9IT01FYFxuICovXG5cbiJdLCJmaWxlIjoibGliL2V4dGVuc2lvbi1jb25maWcuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|