@kepler.gl/utils 3.0.0-alpha.2 → 3.1.0-alpha.0
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/package.json +14 -10
- package/dist/aggregate-utils.d.ts +0 -3
- package/dist/aggregate-utils.js +0 -75
- package/dist/arrow-data-container.d.ts +0 -54
- package/dist/arrow-data-container.js +0 -360
- package/dist/color-utils.d.ts +0 -51
- package/dist/color-utils.js +0 -161
- package/dist/data-container-interface.d.ts +0 -133
- package/dist/data-container-interface.js +0 -6
- package/dist/data-container-utils.d.ts +0 -30
- package/dist/data-container-utils.js +0 -88
- package/dist/data-row.d.ts +0 -59
- package/dist/data-row.js +0 -126
- package/dist/data-scale-utils.d.ts +0 -23
- package/dist/data-scale-utils.js +0 -62
- package/dist/data-utils.d.ts +0 -103
- package/dist/data-utils.js +0 -502
- package/dist/dataset-utils.d.ts +0 -116
- package/dist/dataset-utils.js +0 -614
- package/dist/dom-to-image.d.ts +0 -73
- package/dist/dom-to-image.js +0 -489
- package/dist/dom-utils.d.ts +0 -23
- package/dist/dom-utils.js +0 -434
- package/dist/effect-utils.d.ts +0 -23
- package/dist/effect-utils.js +0 -196
- package/dist/export-map-html.d.ts +0 -9
- package/dist/export-map-html.js +0 -28
- package/dist/export-utils.d.ts +0 -53
- package/dist/export-utils.js +0 -262
- package/dist/filter-utils.d.ts +0 -326
- package/dist/filter-utils.js +0 -1333
- package/dist/format.d.ts +0 -1
- package/dist/format.js +0 -17
- package/dist/gl-utils.d.ts +0 -1
- package/dist/gl-utils.js +0 -35
- package/dist/h3-utils.d.ts +0 -21
- package/dist/h3-utils.js +0 -81
- package/dist/index.d.ts +0 -36
- package/dist/index.js +0 -772
- package/dist/indexed-data-container.d.ts +0 -34
- package/dist/indexed-data-container.js +0 -254
- package/dist/locale-utils.d.ts +0 -2
- package/dist/locale-utils.js +0 -54
- package/dist/map-info-utils.d.ts +0 -1
- package/dist/map-info-utils.js +0 -15
- package/dist/map-style-utils/mapbox-gl-style-editor.d.ts +0 -65
- package/dist/map-style-utils/mapbox-gl-style-editor.js +0 -218
- package/dist/map-style-utils/mapbox-utils.d.ts +0 -9
- package/dist/map-style-utils/mapbox-utils.js +0 -48
- package/dist/map-utils.d.ts +0 -9
- package/dist/map-utils.js +0 -65
- package/dist/mapbox-utils.d.ts +0 -7
- package/dist/mapbox-utils.js +0 -22
- package/dist/noop.d.ts +0 -1
- package/dist/noop.js +0 -11
- package/dist/notifications-utils.d.ts +0 -42
- package/dist/notifications-utils.js +0 -85
- package/dist/observe-dimensions.d.ts +0 -15
- package/dist/observe-dimensions.js +0 -151
- package/dist/plot.d.ts +0 -6
- package/dist/plot.js +0 -31
- package/dist/projection-utils.d.ts +0 -21
- package/dist/projection-utils.js +0 -100
- package/dist/row-data-container.d.ts +0 -31
- package/dist/row-data-container.js +0 -252
- package/dist/searcher-utils.d.ts +0 -1
- package/dist/searcher-utils.js +0 -28
- package/dist/split-map-utils.d.ts +0 -32
- package/dist/split-map-utils.js +0 -114
- package/dist/time.d.ts +0 -16
- package/dist/time.js +0 -89
- package/dist/utils.d.ts +0 -116
- package/dist/utils.js +0 -305
package/dist/utils.js
DELETED
@@ -1,305 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
4
|
-
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
6
|
-
value: true
|
7
|
-
});
|
8
|
-
exports.generateHashId = generateHashId;
|
9
|
-
exports.generateHashIdFromString = generateHashIdFromString;
|
10
|
-
exports.isChrome = isChrome;
|
11
|
-
exports.capitalizeFirstLetter = capitalizeFirstLetter;
|
12
|
-
exports.camelToTitle = camelToTitle;
|
13
|
-
exports.toArray = toArray;
|
14
|
-
exports.isObject = isObject;
|
15
|
-
exports.isPlainObject = isPlainObject;
|
16
|
-
exports.getError = getError;
|
17
|
-
exports.arrayInsert = arrayInsert;
|
18
|
-
exports.hasMobileWidth = hasMobileWidth;
|
19
|
-
exports.hasPortableWidth = hasPortableWidth;
|
20
|
-
exports.isTest = isTest;
|
21
|
-
exports.filterObjectByPredicate = filterObjectByPredicate;
|
22
|
-
exports.isFunction = isFunction;
|
23
|
-
exports.findById = findById;
|
24
|
-
exports.arrayDifference = arrayDifference;
|
25
|
-
exports.set = exports.insertValue = exports.camelize = void 0;
|
26
|
-
|
27
|
-
var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray"));
|
28
|
-
|
29
|
-
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
30
|
-
|
31
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
32
|
-
|
33
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
34
|
-
|
35
|
-
var _window = _interopRequireDefault(require("global/window"));
|
36
|
-
|
37
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
38
|
-
|
39
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
40
|
-
|
41
|
-
/**
|
42
|
-
* Generate a hash string based on number of character
|
43
|
-
* @param {number} count
|
44
|
-
* @returns {string} hash string
|
45
|
-
*/
|
46
|
-
function generateHashId() {
|
47
|
-
var count = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 6;
|
48
|
-
return Math.random().toString(36).substr(count);
|
49
|
-
}
|
50
|
-
/**
|
51
|
-
* Generate a hash string based on string
|
52
|
-
* @param str
|
53
|
-
* @returns
|
54
|
-
*/
|
55
|
-
|
56
|
-
|
57
|
-
function generateHashIdFromString(str) {
|
58
|
-
// generate hash string based on string
|
59
|
-
var hash = 0;
|
60
|
-
var i;
|
61
|
-
var chr;
|
62
|
-
var len;
|
63
|
-
if (str.length === 0) return hash.toString();
|
64
|
-
|
65
|
-
for (i = 0, len = str.length; i < len; i++) {
|
66
|
-
chr = str.charCodeAt(i); // eslint-disable-next-line no-bitwise
|
67
|
-
|
68
|
-
hash = (hash << 5) - hash + chr; // eslint-disable-next-line no-bitwise
|
69
|
-
|
70
|
-
hash |= 0; // Convert to 32bit integer
|
71
|
-
}
|
72
|
-
|
73
|
-
return hash.toString(36);
|
74
|
-
}
|
75
|
-
/**
|
76
|
-
* Detect chrome
|
77
|
-
* @returns {boolean} - yes or no
|
78
|
-
*/
|
79
|
-
|
80
|
-
|
81
|
-
function isChrome() {
|
82
|
-
// Chrome 1+
|
83
|
-
return _window["default"].chrome && _window["default"].chrome.webstore;
|
84
|
-
}
|
85
|
-
/**
|
86
|
-
* Capitalize first letter of a string
|
87
|
-
* @param {string} str
|
88
|
-
* @returns {string}
|
89
|
-
*/
|
90
|
-
|
91
|
-
|
92
|
-
function capitalizeFirstLetter(str) {
|
93
|
-
return typeof str === 'string' ? str.charAt(0).toUpperCase() + str.slice(1) : str;
|
94
|
-
}
|
95
|
-
/**
|
96
|
-
* Convert camel style names to title
|
97
|
-
* strokeColor -> Stroke Color
|
98
|
-
* @param {string} str
|
99
|
-
* @returns {string}
|
100
|
-
*/
|
101
|
-
|
102
|
-
|
103
|
-
function camelToTitle(str) {
|
104
|
-
var breakWord = str.replace(/([A-Z])/g, ' $1');
|
105
|
-
return capitalizeFirstLetter(breakWord);
|
106
|
-
}
|
107
|
-
/**
|
108
|
-
* Convert names to camel style
|
109
|
-
* Stroke Color -> strokeColor
|
110
|
-
* @param {string} str
|
111
|
-
* @returns {string}
|
112
|
-
*/
|
113
|
-
|
114
|
-
|
115
|
-
var camelize = function camelize(str) {
|
116
|
-
return str.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function (match, index) {
|
117
|
-
if (Number(match) === 0) return ''; // or if (/\s+/.test(match)) for white spaces
|
118
|
-
|
119
|
-
return index === 0 ? match.toLowerCase() : match.toUpperCase();
|
120
|
-
});
|
121
|
-
};
|
122
|
-
/**
|
123
|
-
* Converts non-arrays to arrays. Leaves arrays alone. Converts
|
124
|
-
* undefined values to empty arrays ([] instead of [undefined]).
|
125
|
-
* Otherwise, just returns [item] for non-array items.
|
126
|
-
*
|
127
|
-
* @param {*} item
|
128
|
-
* @returns {array} boom! much array. very indexed. so useful.
|
129
|
-
*/
|
130
|
-
|
131
|
-
|
132
|
-
exports.camelize = camelize;
|
133
|
-
|
134
|
-
function toArray(item) {
|
135
|
-
if (Array.isArray(item)) {
|
136
|
-
return item;
|
137
|
-
}
|
138
|
-
|
139
|
-
if (typeof item === 'undefined' || item === null) {
|
140
|
-
return [];
|
141
|
-
}
|
142
|
-
|
143
|
-
return [item];
|
144
|
-
}
|
145
|
-
/**
|
146
|
-
* immutably insert value to an Array or Object
|
147
|
-
* @param {Array|Object} obj
|
148
|
-
* @param {Number|String} key
|
149
|
-
* @param {*} value
|
150
|
-
* @returns {Array|Object}
|
151
|
-
*/
|
152
|
-
|
153
|
-
|
154
|
-
var insertValue = function insertValue(obj, key, value) {
|
155
|
-
if (Array.isArray(obj) && typeof key === 'number') {
|
156
|
-
return [].concat((0, _toConsumableArray2["default"])(obj.slice(0, key)), [value], (0, _toConsumableArray2["default"])(obj.slice(key + 1, obj.length)));
|
157
|
-
}
|
158
|
-
|
159
|
-
return _objectSpread(_objectSpread({}, obj), {}, (0, _defineProperty2["default"])({}, key, value));
|
160
|
-
};
|
161
|
-
/**
|
162
|
-
* check if value is a loose object including a plain object, array, function
|
163
|
-
* @param {*} value
|
164
|
-
*/
|
165
|
-
|
166
|
-
|
167
|
-
exports.insertValue = insertValue;
|
168
|
-
|
169
|
-
function isObject(value) {
|
170
|
-
return value !== null && ((0, _typeof2["default"])(value) === 'object' || typeof value === 'function');
|
171
|
-
}
|
172
|
-
/**
|
173
|
-
* whether is an object
|
174
|
-
* @returns {boolean} - yes or no
|
175
|
-
*/
|
176
|
-
|
177
|
-
|
178
|
-
function isPlainObject(obj) {
|
179
|
-
return obj === Object(obj) && typeof obj !== 'function' && !Array.isArray(obj);
|
180
|
-
}
|
181
|
-
|
182
|
-
var setPath = function setPath(_ref, value, obj) {
|
183
|
-
var _ref2 = (0, _toArray2["default"])(_ref),
|
184
|
-
key = _ref2[0],
|
185
|
-
next = _ref2.slice(1);
|
186
|
-
|
187
|
-
// is Object allows js object, array and function
|
188
|
-
if (!isObject(obj)) {
|
189
|
-
return obj;
|
190
|
-
}
|
191
|
-
|
192
|
-
if (next.length === 0) {
|
193
|
-
return insertValue(obj, key, value);
|
194
|
-
} // @ts-ignore
|
195
|
-
|
196
|
-
|
197
|
-
return insertValue(obj, key, setPath(next, value, obj.hasOwnProperty(key) ? obj[key] : {}));
|
198
|
-
};
|
199
|
-
/**
|
200
|
-
* Immutable version of _.set
|
201
|
-
* @param {Array<String|Number>} path
|
202
|
-
* @param {*} value
|
203
|
-
* @param {Object} obj
|
204
|
-
* @returns {Object}
|
205
|
-
*/
|
206
|
-
// @ts-ignore
|
207
|
-
|
208
|
-
|
209
|
-
var set = function set(path, value, obj) {
|
210
|
-
return obj === null ? obj : setPath(path, value, obj);
|
211
|
-
};
|
212
|
-
|
213
|
-
exports.set = set;
|
214
|
-
|
215
|
-
/**
|
216
|
-
* Get error information of unknown type
|
217
|
-
* Extracts as much human readable information as possible
|
218
|
-
* Ensure result is an Error object suitable for throw or promise rejection
|
219
|
-
*
|
220
|
-
* @private
|
221
|
-
* @param {*} err - Unknown error
|
222
|
-
* @return {string} - human readable error msg
|
223
|
-
*/
|
224
|
-
function getError(err) {
|
225
|
-
if (!err) {
|
226
|
-
return 'Something went wrong';
|
227
|
-
}
|
228
|
-
|
229
|
-
if (typeof err === 'string') {
|
230
|
-
return err;
|
231
|
-
} else if (err instanceof Error) {
|
232
|
-
return err.message;
|
233
|
-
} else if ((0, _typeof2["default"])(err) === 'object') {
|
234
|
-
return err.error ? getError(err.error) : err.err ? getError(err.err) : err.message ? getError(err.message) : JSON.stringify(err);
|
235
|
-
} // @ts-ignore
|
236
|
-
|
237
|
-
|
238
|
-
return null;
|
239
|
-
}
|
240
|
-
|
241
|
-
function arrayInsert(arr, index, val) {
|
242
|
-
if (!Array.isArray(arr)) {
|
243
|
-
return arr;
|
244
|
-
}
|
245
|
-
|
246
|
-
return [].concat((0, _toConsumableArray2["default"])(arr.slice(0, index)), [val], (0, _toConsumableArray2["default"])(arr.slice(index)));
|
247
|
-
}
|
248
|
-
|
249
|
-
function hasMobileWidth(breakPointValues) {
|
250
|
-
var mobileWidth = _window["default"].matchMedia("(max-width: ".concat(breakPointValues.palm, "px)"));
|
251
|
-
|
252
|
-
return mobileWidth.matches;
|
253
|
-
}
|
254
|
-
|
255
|
-
function hasPortableWidth(breakPointValues) {
|
256
|
-
var mobileWidth = _window["default"].matchMedia("(max-width: ".concat(breakPointValues.desk, "px)"));
|
257
|
-
|
258
|
-
return mobileWidth.matches;
|
259
|
-
}
|
260
|
-
|
261
|
-
function isTest() {
|
262
|
-
var _process, _process$env;
|
263
|
-
|
264
|
-
return typeof process !== 'undefined' && ((_process = process) === null || _process === void 0 ? void 0 : (_process$env = _process.env) === null || _process$env === void 0 ? void 0 : _process$env.NODE_ENV) === 'test';
|
265
|
-
}
|
266
|
-
/**
|
267
|
-
* Filters an object by an arbitrary predicate
|
268
|
-
* Returns a new object containing all elements that match the predicate
|
269
|
-
* @param {Object} obj Object to be filtered
|
270
|
-
* @param {Function} predicate Predicate by which the object will be filtered
|
271
|
-
* @returns {Object}
|
272
|
-
*/
|
273
|
-
|
274
|
-
|
275
|
-
function filterObjectByPredicate(obj, predicate) {
|
276
|
-
return Object.entries(obj).reduce(function (acc, entry) {
|
277
|
-
return predicate(entry[0], entry[1]) ? _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, entry[0], entry[1])) : acc;
|
278
|
-
}, {});
|
279
|
-
}
|
280
|
-
|
281
|
-
function isFunction(func) {
|
282
|
-
return typeof func === 'function';
|
283
|
-
}
|
284
|
-
|
285
|
-
function findById(id) {
|
286
|
-
return function (arr) {
|
287
|
-
return arr.find(function (a) {
|
288
|
-
return a.id === id;
|
289
|
-
});
|
290
|
-
};
|
291
|
-
}
|
292
|
-
/**
|
293
|
-
* Returns array difference from
|
294
|
-
*/
|
295
|
-
|
296
|
-
|
297
|
-
function arrayDifference(source) {
|
298
|
-
return function (compare) {
|
299
|
-
return source.reduce(function (acc, element) {
|
300
|
-
var foundElement = findById(element.id)(compare);
|
301
|
-
return foundElement ? [].concat((0, _toConsumableArray2["default"])(acc), [foundElement]) : acc;
|
302
|
-
}, []);
|
303
|
-
};
|
304
|
-
}
|
305
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy50cyJdLCJuYW1lcyI6WyJnZW5lcmF0ZUhhc2hJZCIsImNvdW50IiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwic3Vic3RyIiwiZ2VuZXJhdGVIYXNoSWRGcm9tU3RyaW5nIiwic3RyIiwiaGFzaCIsImkiLCJjaHIiLCJsZW4iLCJsZW5ndGgiLCJjaGFyQ29kZUF0IiwiaXNDaHJvbWUiLCJ3aW5kb3ciLCJjaHJvbWUiLCJ3ZWJzdG9yZSIsImNhcGl0YWxpemVGaXJzdExldHRlciIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJjYW1lbFRvVGl0bGUiLCJicmVha1dvcmQiLCJyZXBsYWNlIiwiY2FtZWxpemUiLCJtYXRjaCIsImluZGV4IiwiTnVtYmVyIiwidG9Mb3dlckNhc2UiLCJ0b0FycmF5IiwiaXRlbSIsIkFycmF5IiwiaXNBcnJheSIsImluc2VydFZhbHVlIiwib2JqIiwia2V5IiwidmFsdWUiLCJpc09iamVjdCIsImlzUGxhaW5PYmplY3QiLCJPYmplY3QiLCJzZXRQYXRoIiwibmV4dCIsImhhc093blByb3BlcnR5Iiwic2V0IiwicGF0aCIsImdldEVycm9yIiwiZXJyIiwiRXJyb3IiLCJtZXNzYWdlIiwiZXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwiYXJyYXlJbnNlcnQiLCJhcnIiLCJ2YWwiLCJoYXNNb2JpbGVXaWR0aCIsImJyZWFrUG9pbnRWYWx1ZXMiLCJtb2JpbGVXaWR0aCIsIm1hdGNoTWVkaWEiLCJwYWxtIiwibWF0Y2hlcyIsImhhc1BvcnRhYmxlV2lkdGgiLCJkZXNrIiwiaXNUZXN0IiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwiZmlsdGVyT2JqZWN0QnlQcmVkaWNhdGUiLCJwcmVkaWNhdGUiLCJlbnRyaWVzIiwicmVkdWNlIiwiYWNjIiwiZW50cnkiLCJpc0Z1bmN0aW9uIiwiZnVuYyIsImZpbmRCeUlkIiwiaWQiLCJmaW5kIiwiYSIsImFycmF5RGlmZmVyZW5jZSIsInNvdXJjZSIsImNvbXBhcmUiLCJlbGVtZW50IiwiZm91bmRFbGVtZW50Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0E7Ozs7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQSxjQUFULEdBQW1EO0FBQUEsTUFBM0JDLEtBQTJCLHVFQUFYLENBQVc7QUFDeEQsU0FBT0MsSUFBSSxDQUFDQyxNQUFMLEdBQ0pDLFFBREksQ0FDSyxFQURMLEVBRUpDLE1BRkksQ0FFR0osS0FGSCxDQUFQO0FBR0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTSyx3QkFBVCxDQUFrQ0MsR0FBbEMsRUFBdUQ7QUFDNUQ7QUFDQSxNQUFJQyxJQUFJLEdBQUcsQ0FBWDtBQUNBLE1BQUlDLENBQUo7QUFDQSxNQUFJQyxHQUFKO0FBQ0EsTUFBSUMsR0FBSjtBQUNBLE1BQUlKLEdBQUcsQ0FBQ0ssTUFBSixLQUFlLENBQW5CLEVBQXNCLE9BQU9KLElBQUksQ0FBQ0osUUFBTCxFQUFQOztBQUN0QixPQUFLSyxDQUFDLEdBQUcsQ0FBSixFQUFPRSxHQUFHLEdBQUdKLEdBQUcsQ0FBQ0ssTUFBdEIsRUFBOEJILENBQUMsR0FBR0UsR0FBbEMsRUFBdUNGLENBQUMsRUFBeEMsRUFBNEM7QUFDMUNDLElBQUFBLEdBQUcsR0FBR0gsR0FBRyxDQUFDTSxVQUFKLENBQWVKLENBQWYsQ0FBTixDQUQwQyxDQUUxQzs7QUFDQUQsSUFBQUEsSUFBSSxHQUFHLENBQUNBLElBQUksSUFBSSxDQUFULElBQWNBLElBQWQsR0FBcUJFLEdBQTVCLENBSDBDLENBSTFDOztBQUNBRixJQUFBQSxJQUFJLElBQUksQ0FBUixDQUwwQyxDQUsvQjtBQUNaOztBQUNELFNBQU9BLElBQUksQ0FBQ0osUUFBTCxDQUFjLEVBQWQsQ0FBUDtBQUNEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVNVLFFBQVQsR0FBNkI7QUFDbEM7QUFDQSxTQUFPQyxtQkFBT0MsTUFBUCxJQUFpQkQsbUJBQU9DLE1BQVAsQ0FBY0MsUUFBdEM7QUFDRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVNDLHFCQUFULENBQStCWCxHQUEvQixFQUFvQztBQUN6QyxTQUFPLE9BQU9BLEdBQVAsS0FBZSxRQUFmLEdBQTBCQSxHQUFHLENBQUNZLE1BQUosQ0FBVyxDQUFYLEVBQWNDLFdBQWQsS0FBOEJiLEdBQUcsQ0FBQ2MsS0FBSixDQUFVLENBQVYsQ0FBeEQsR0FBdUVkLEdBQTlFO0FBQ0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVNlLFlBQVQsQ0FBc0JmLEdBQXRCLEVBQTJDO0FBQ2hELE1BQU1nQixTQUFTLEdBQUdoQixHQUFHLENBQUNpQixPQUFKLENBQVksVUFBWixFQUF3QixLQUF4QixDQUFsQjtBQUNBLFNBQU9OLHFCQUFxQixDQUFDSyxTQUFELENBQTVCO0FBQ0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLElBQU1FLFFBQVEsR0FBRyxTQUFYQSxRQUFXLENBQUNsQixHQUFELEVBQXlCO0FBQy9DLFNBQU9BLEdBQUcsQ0FBQ2lCLE9BQUosQ0FBWSx5QkFBWixFQUF1QyxVQUFDRSxLQUFELEVBQVFDLEtBQVIsRUFBa0I7QUFDOUQsUUFBSUMsTUFBTSxDQUFDRixLQUFELENBQU4sS0FBa0IsQ0FBdEIsRUFBeUIsT0FBTyxFQUFQLENBRHFDLENBQzFCOztBQUNwQyxXQUFPQyxLQUFLLEtBQUssQ0FBVixHQUFjRCxLQUFLLENBQUNHLFdBQU4sRUFBZCxHQUFvQ0gsS0FBSyxDQUFDTixXQUFOLEVBQTNDO0FBQ0QsR0FITSxDQUFQO0FBSUQsQ0FMTTtBQU9QO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sU0FBU1UsT0FBVCxDQUFvQkMsSUFBcEIsRUFBd0M7QUFDN0MsTUFBSUMsS0FBSyxDQUFDQyxPQUFOLENBQWNGLElBQWQsQ0FBSixFQUF5QjtBQUN2QixXQUFPQSxJQUFQO0FBQ0Q7O0FBRUQsTUFBSSxPQUFPQSxJQUFQLEtBQWdCLFdBQWhCLElBQStCQSxJQUFJLEtBQUssSUFBNUMsRUFBa0Q7QUFDaEQsV0FBTyxFQUFQO0FBQ0Q7O0FBRUQsU0FBTyxDQUFDQSxJQUFELENBQVA7QUFDRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxJQUFNRyxXQUFXLEdBQUcsU0FBZEEsV0FBYyxDQUN6QkMsR0FEeUIsRUFFekJDLEdBRnlCLEVBR3pCQyxLQUh5QixFQUluQjtBQUNOLE1BQUlMLEtBQUssQ0FBQ0MsT0FBTixDQUFjRSxHQUFkLEtBQXNCLE9BQU9DLEdBQVAsS0FBZSxRQUF6QyxFQUFtRDtBQUNqRCx5REFBV0QsR0FBRyxDQUFDZCxLQUFKLENBQVUsQ0FBVixFQUFhZSxHQUFiLENBQVgsSUFBOEJDLEtBQTlCLHVDQUF3Q0YsR0FBRyxDQUFDZCxLQUFKLENBQVVlLEdBQUcsR0FBRyxDQUFoQixFQUFtQkQsR0FBRyxDQUFDdkIsTUFBdkIsQ0FBeEM7QUFDRDs7QUFFRCx5Q0FBV3VCLEdBQVgsNENBQWlCQyxHQUFqQixFQUF1QkMsS0FBdkI7QUFDRCxDQVZNO0FBWVA7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sU0FBU0MsUUFBVCxDQUFrQkQsS0FBbEIsRUFBa0M7QUFDdkMsU0FBT0EsS0FBSyxLQUFLLElBQVYsS0FBbUIseUJBQU9BLEtBQVAsTUFBaUIsUUFBakIsSUFBNkIsT0FBT0EsS0FBUCxLQUFpQixVQUFqRSxDQUFQO0FBQ0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU0UsYUFBVCxDQUF1QkosR0FBdkIsRUFBcUU7QUFDMUUsU0FBT0EsR0FBRyxLQUFLSyxNQUFNLENBQUNMLEdBQUQsQ0FBZCxJQUF1QixPQUFPQSxHQUFQLEtBQWUsVUFBdEMsSUFBb0QsQ0FBQ0gsS0FBSyxDQUFDQyxPQUFOLENBQWNFLEdBQWQsQ0FBNUQ7QUFDRDs7QUFFRCxJQUFNTSxPQUFPLEdBQUcsU0FBVkEsT0FBVSxPQUVkSixLQUZjLEVBR2RGLEdBSGMsRUFJUjtBQUFBO0FBQUEsTUFITEMsR0FHSztBQUFBLE1BSEdNLElBR0g7O0FBQ047QUFDQSxNQUFJLENBQUNKLFFBQVEsQ0FBQ0gsR0FBRCxDQUFiLEVBQW9CO0FBQ2xCLFdBQU9BLEdBQVA7QUFDRDs7QUFFRCxNQUFJTyxJQUFJLENBQUM5QixNQUFMLEtBQWdCLENBQXBCLEVBQXVCO0FBQ3JCLFdBQU9zQixXQUFXLENBQUNDLEdBQUQsRUFBTUMsR0FBTixFQUFXQyxLQUFYLENBQWxCO0FBQ0QsR0FSSyxDQVVOOzs7QUFDQSxTQUFPSCxXQUFXLENBQUNDLEdBQUQsRUFBTUMsR0FBTixFQUFXSyxPQUFPLENBQUNDLElBQUQsRUFBT0wsS0FBUCxFQUFjRixHQUFHLENBQUNRLGNBQUosQ0FBbUJQLEdBQW5CLElBQTBCRCxHQUFHLENBQUNDLEdBQUQsQ0FBN0IsR0FBcUMsRUFBbkQsQ0FBbEIsQ0FBbEI7QUFDRCxDQWhCRDtBQWtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxJQUFNUSxHQUFHLEdBQUcsU0FBTkEsR0FBTSxDQUEyQkMsSUFBM0IsRUFBc0RSLEtBQXRELEVBQWtFRixHQUFsRTtBQUFBLFNBQ2pCQSxHQUFHLEtBQUssSUFBUixHQUFlQSxHQUFmLEdBQXFCTSxPQUFPLENBQUNJLElBQUQsRUFBT1IsS0FBUCxFQUFjRixHQUFkLENBRFg7QUFBQSxDQUFaOzs7O0FBU1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU1csUUFBVCxDQUFrQkMsR0FBbEIsRUFBOEQ7QUFDbkUsTUFBSSxDQUFDQSxHQUFMLEVBQVU7QUFDUixXQUFPLHNCQUFQO0FBQ0Q7O0FBRUQsTUFBSSxPQUFPQSxHQUFQLEtBQWUsUUFBbkIsRUFBNkI7QUFDM0IsV0FBT0EsR0FBUDtBQUNELEdBRkQsTUFFTyxJQUFJQSxHQUFHLFlBQVlDLEtBQW5CLEVBQTBCO0FBQy9CLFdBQU9ELEdBQUcsQ0FBQ0UsT0FBWDtBQUNELEdBRk0sTUFFQSxJQUFJLHlCQUFPRixHQUFQLE1BQWUsUUFBbkIsRUFBNkI7QUFDbEMsV0FBT0EsR0FBRyxDQUFDRyxLQUFKLEdBQ0hKLFFBQVEsQ0FBQ0MsR0FBRyxDQUFDRyxLQUFMLENBREwsR0FFSEgsR0FBRyxDQUFDQSxHQUFKLEdBQ0FELFFBQVEsQ0FBQ0MsR0FBRyxDQUFDQSxHQUFMLENBRFIsR0FFQUEsR0FBRyxDQUFDRSxPQUFKLEdBQ0FILFFBQVEsQ0FBQ0MsR0FBRyxDQUFDRSxPQUFMLENBRFIsR0FFQUUsSUFBSSxDQUFDQyxTQUFMLENBQWVMLEdBQWYsQ0FOSjtBQU9ELEdBakJrRSxDQW1CbkU7OztBQUNBLFNBQU8sSUFBUDtBQUNEOztBQUVNLFNBQVNNLFdBQVQsQ0FBd0JDLEdBQXhCLEVBQWtDM0IsS0FBbEMsRUFBaUQ0QixHQUFqRCxFQUE4RDtBQUNuRSxNQUFJLENBQUN2QixLQUFLLENBQUNDLE9BQU4sQ0FBY3FCLEdBQWQsQ0FBTCxFQUF5QjtBQUN2QixXQUFPQSxHQUFQO0FBQ0Q7O0FBRUQsdURBQVdBLEdBQUcsQ0FBQ2pDLEtBQUosQ0FBVSxDQUFWLEVBQWFNLEtBQWIsQ0FBWCxJQUFnQzRCLEdBQWhDLHVDQUF3Q0QsR0FBRyxDQUFDakMsS0FBSixDQUFVTSxLQUFWLENBQXhDO0FBQ0Q7O0FBRU0sU0FBUzZCLGNBQVQsQ0FBd0JDLGdCQUF4QixFQUFpRjtBQUN0RixNQUFNQyxXQUFXLEdBQUczQyxtQkFBTzRDLFVBQVAsdUJBQWlDRixnQkFBZ0IsQ0FBQ0csSUFBbEQsU0FBcEI7O0FBQ0EsU0FBT0YsV0FBVyxDQUFDRyxPQUFuQjtBQUNEOztBQUVNLFNBQVNDLGdCQUFULENBQTBCTCxnQkFBMUIsRUFBbUY7QUFDeEYsTUFBTUMsV0FBVyxHQUFHM0MsbUJBQU80QyxVQUFQLHVCQUFpQ0YsZ0JBQWdCLENBQUNNLElBQWxELFNBQXBCOztBQUNBLFNBQU9MLFdBQVcsQ0FBQ0csT0FBbkI7QUFDRDs7QUFFTSxTQUFTRyxNQUFULEdBQTJCO0FBQUE7O0FBQ2hDLFNBQU8sT0FBT0MsT0FBUCxLQUFtQixXQUFuQixJQUFrQyxhQUFBQSxPQUFPLFVBQVAsNERBQVNDLEdBQVQsOERBQWNDLFFBQWQsTUFBMkIsTUFBcEU7QUFDRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTQyx1QkFBVCxDQUFpQ2pDLEdBQWpDLEVBQXNDa0MsU0FBdEMsRUFBaUQ7QUFDdEQsU0FBTzdCLE1BQU0sQ0FBQzhCLE9BQVAsQ0FBZW5DLEdBQWYsRUFBb0JvQyxNQUFwQixDQUNMLFVBQUNDLEdBQUQsRUFBTUMsS0FBTjtBQUFBLFdBQWlCSixTQUFTLENBQUNJLEtBQUssQ0FBQyxDQUFELENBQU4sRUFBV0EsS0FBSyxDQUFDLENBQUQsQ0FBaEIsQ0FBVCxtQ0FBb0NELEdBQXBDLDRDQUEwQ0MsS0FBSyxDQUFDLENBQUQsQ0FBL0MsRUFBcURBLEtBQUssQ0FBQyxDQUFELENBQTFELEtBQWlFRCxHQUFsRjtBQUFBLEdBREssRUFFTCxFQUZLLENBQVA7QUFJRDs7QUFFTSxTQUFTRSxVQUFULENBQW9CQyxJQUFwQixFQUFtQztBQUN4QyxTQUFPLE9BQU9BLElBQVAsS0FBZ0IsVUFBdkI7QUFDRDs7QUFFTSxTQUFTQyxRQUFULENBQWtCQyxFQUFsQixFQUFtRjtBQUN4RixTQUFPLFVBQUF2QixHQUFHO0FBQUEsV0FBSUEsR0FBRyxDQUFDd0IsSUFBSixDQUFTLFVBQUFDLENBQUM7QUFBQSxhQUFJQSxDQUFDLENBQUNGLEVBQUYsS0FBU0EsRUFBYjtBQUFBLEtBQVYsQ0FBSjtBQUFBLEdBQVY7QUFDRDtBQUVEO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU0csZUFBVCxDQUFpREMsTUFBakQsRUFBcUY7QUFDMUYsU0FBTyxVQUFBQyxPQUFPO0FBQUEsV0FDWkQsTUFBTSxDQUFDVixNQUFQLENBQWMsVUFBQ0MsR0FBRCxFQUFNVyxPQUFOLEVBQWtCO0FBQzlCLFVBQU1DLFlBQVksR0FBR1IsUUFBUSxDQUFDTyxPQUFPLENBQUNOLEVBQVQsQ0FBUixDQUFxQkssT0FBckIsQ0FBckI7QUFDQSxhQUFPRSxZQUFZLGlEQUFPWixHQUFQLElBQVlZLFlBQVosS0FBNEJaLEdBQS9DO0FBQ0QsS0FIRCxFQUdHLEVBSEgsQ0FEWTtBQUFBLEdBQWQ7QUFLRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB3aW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5cbi8qKlxuICogR2VuZXJhdGUgYSBoYXNoIHN0cmluZyBiYXNlZCBvbiBudW1iZXIgb2YgY2hhcmFjdGVyXG4gKiBAcGFyYW0ge251bWJlcn0gY291bnRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGhhc2ggc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUhhc2hJZChjb3VudDogbnVtYmVyID0gNik6IHN0cmluZyB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpXG4gICAgLnRvU3RyaW5nKDM2KVxuICAgIC5zdWJzdHIoY291bnQpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgaGFzaCBzdHJpbmcgYmFzZWQgb24gc3RyaW5nXG4gKiBAcGFyYW0gc3RyXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVIYXNoSWRGcm9tU3RyaW5nKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gZ2VuZXJhdGUgaGFzaCBzdHJpbmcgYmFzZWQgb24gc3RyaW5nXG4gIGxldCBoYXNoID0gMDtcbiAgbGV0IGk7XG4gIGxldCBjaHI7XG4gIGxldCBsZW47XG4gIGlmIChzdHIubGVuZ3RoID09PSAwKSByZXR1cm4gaGFzaC50b1N0cmluZygpO1xuICBmb3IgKGkgPSAwLCBsZW4gPSBzdHIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjaHIgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBjaHI7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICBoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuICB9XG4gIHJldHVybiBoYXNoLnRvU3RyaW5nKDM2KTtcbn1cblxuLyoqXG4gKiBEZXRlY3QgY2hyb21lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB5ZXMgb3Igbm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2hyb21lKCk6IGJvb2xlYW4ge1xuICAvLyBDaHJvbWUgMStcbiAgcmV0dXJuIHdpbmRvdy5jaHJvbWUgJiYgd2luZG93LmNocm9tZS53ZWJzdG9yZTtcbn1cblxuLyoqXG4gKiBDYXBpdGFsaXplIGZpcnN0IGxldHRlciBvZiBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhcGl0YWxpemVGaXJzdExldHRlcihzdHIpIHtcbiAgcmV0dXJuIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnID8gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpIDogc3RyO1xufVxuXG4vKipcbiAqIENvbnZlcnQgY2FtZWwgc3R5bGUgbmFtZXMgdG8gdGl0bGVcbiAqIHN0cm9rZUNvbG9yIC0+IFN0cm9rZSBDb2xvclxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbWVsVG9UaXRsZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGJyZWFrV29yZCA9IHN0ci5yZXBsYWNlKC8oW0EtWl0pL2csICcgJDEnKTtcbiAgcmV0dXJuIGNhcGl0YWxpemVGaXJzdExldHRlcihicmVha1dvcmQpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgbmFtZXMgdG8gY2FtZWwgc3R5bGVcbiAqIFN0cm9rZSBDb2xvciAtPiBzdHJva2VDb2xvclxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IGNhbWVsaXplID0gKHN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oPzpeXFx3fFtBLVpdfFxcYlxcd3xcXHMrKS9nLCAobWF0Y2gsIGluZGV4KSA9PiB7XG4gICAgaWYgKE51bWJlcihtYXRjaCkgPT09IDApIHJldHVybiAnJzsgLy8gb3IgaWYgKC9cXHMrLy50ZXN0KG1hdGNoKSkgZm9yIHdoaXRlIHNwYWNlc1xuICAgIHJldHVybiBpbmRleCA9PT0gMCA/IG1hdGNoLnRvTG93ZXJDYXNlKCkgOiBtYXRjaC50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgbm9uLWFycmF5cyB0byBhcnJheXMuICBMZWF2ZXMgYXJyYXlzIGFsb25lLiAgQ29udmVydHNcbiAqIHVuZGVmaW5lZCB2YWx1ZXMgdG8gZW1wdHkgYXJyYXlzIChbXSBpbnN0ZWFkIG9mIFt1bmRlZmluZWRdKS5cbiAqIE90aGVyd2lzZSwganVzdCByZXR1cm5zIFtpdGVtXSBmb3Igbm9uLWFycmF5IGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7Kn0gaXRlbVxuICogQHJldHVybnMge2FycmF5fSBib29tISBtdWNoIGFycmF5LiB2ZXJ5IGluZGV4ZWQuIHNvIHVzZWZ1bC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQXJyYXk8VD4oaXRlbTogVCB8IFRbXSk6IFRbXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cblxuICBpZiAodHlwZW9mIGl0ZW0gPT09ICd1bmRlZmluZWQnIHx8IGl0ZW0gPT09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gW2l0ZW1dO1xufVxuXG4vKipcbiAqIGltbXV0YWJseSBpbnNlcnQgdmFsdWUgdG8gYW4gQXJyYXkgb3IgT2JqZWN0XG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gb2JqXG4gKiBAcGFyYW0ge051bWJlcnxTdHJpbmd9IGtleVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMge0FycmF5fE9iamVjdH1cbiAqL1xuZXhwb3J0IGNvbnN0IGluc2VydFZhbHVlID0gPFQgZXh0ZW5kcyBhbnlbXSB8IG9iamVjdD4oXG4gIG9iajogVCxcbiAga2V5OiBudW1iZXIgfCBzdHJpbmcsXG4gIHZhbHVlOiBhbnlcbik6IFQgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopICYmIHR5cGVvZiBrZXkgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIFsuLi5vYmouc2xpY2UoMCwga2V5KSwgdmFsdWUsIC4uLm9iai5zbGljZShrZXkgKyAxLCBvYmoubGVuZ3RoKV0gYXMgVDtcbiAgfVxuXG4gIHJldHVybiB7Li4ub2JqLCBba2V5XTogdmFsdWV9O1xufTtcblxuLyoqXG4gKiBjaGVjayBpZiB2YWx1ZSBpcyBhIGxvb3NlIG9iamVjdCBpbmNsdWRpbmcgYSBwbGFpbiBvYmplY3QsIGFycmF5LCBmdW5jdGlvblxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogd2hldGhlciBpcyBhbiBvYmplY3RcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHllcyBvciBub1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmo6IHVua25vd24pOiBvYmogaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gb2JqID09PSBPYmplY3Qob2JqKSAmJiB0eXBlb2Ygb2JqICE9PSAnZnVuY3Rpb24nICYmICFBcnJheS5pc0FycmF5KG9iaik7XG59XG5cbmNvbnN0IHNldFBhdGggPSA8VCBleHRlbmRzIGFueVtdIHwgb2JqZWN0PihcbiAgW2tleSwgLi4ubmV4dF06IChzdHJpbmcgfCBudW1iZXIpW10sXG4gIHZhbHVlOiBhbnksXG4gIG9iajogb2JqZWN0IHwgYW55W11cbik6IFQgPT4ge1xuICAvLyBpcyBPYmplY3QgYWxsb3dzIGpzIG9iamVjdCwgYXJyYXkgYW5kIGZ1bmN0aW9uXG4gIGlmICghaXNPYmplY3Qob2JqKSkge1xuICAgIHJldHVybiBvYmogYXMgVDtcbiAgfVxuXG4gIGlmIChuZXh0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBpbnNlcnRWYWx1ZShvYmosIGtleSwgdmFsdWUpIGFzIFQ7XG4gIH1cblxuICAvLyBAdHMtaWdub3JlXG4gIHJldHVybiBpbnNlcnRWYWx1ZShvYmosIGtleSwgc2V0UGF0aChuZXh0LCB2YWx1ZSwgb2JqLmhhc093blByb3BlcnR5KGtleSkgPyBvYmpba2V5XSA6IHt9KSk7XG59O1xuXG4vKipcbiAqIEltbXV0YWJsZSB2ZXJzaW9uIG9mIF8uc2V0XG4gKiBAcGFyYW0ge0FycmF5PFN0cmluZ3xOdW1iZXI+fSBwYXRoXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG4vLyBAdHMtaWdub3JlXG5leHBvcnQgY29uc3Qgc2V0ID0gPFQgZXh0ZW5kcyBhbnlbXSB8IG9iamVjdD4ocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgb2JqOiBUKTogVCA9PlxuICBvYmogPT09IG51bGwgPyBvYmogOiBzZXRQYXRoKHBhdGgsIHZhbHVlLCBvYmopO1xuXG50eXBlIEVycm9yT2JqZWN0ID0ge1xuICBlcnJvcj86IGFueTtcbiAgZXJyPzogYW55O1xuICBtZXNzYWdlPzogYW55O1xufTtcblxuLyoqXG4gKiBHZXQgZXJyb3IgaW5mb3JtYXRpb24gb2YgdW5rbm93biB0eXBlXG4gKiBFeHRyYWN0cyBhcyBtdWNoIGh1bWFuIHJlYWRhYmxlIGluZm9ybWF0aW9uIGFzIHBvc3NpYmxlXG4gKiBFbnN1cmUgcmVzdWx0IGlzIGFuIEVycm9yIG9iamVjdCBzdWl0YWJsZSBmb3IgdGhyb3cgb3IgcHJvbWlzZSByZWplY3Rpb25cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSAgZXJyIC0gVW5rbm93biBlcnJvclxuICogQHJldHVybiB7c3RyaW5nfSAtIGh1bWFuIHJlYWRhYmxlIGVycm9yIG1zZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXJyb3IoZXJyPzogRXJyb3IgfCBFcnJvck9iamVjdCB8IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghZXJyKSB7XG4gICAgcmV0dXJuICdTb21ldGhpbmcgd2VudCB3cm9uZyc7XG4gIH1cblxuICBpZiAodHlwZW9mIGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZXJyO1xuICB9IGVsc2UgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIGVyci5tZXNzYWdlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlcnIgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGVyci5lcnJvclxuICAgICAgPyBnZXRFcnJvcihlcnIuZXJyb3IpXG4gICAgICA6IGVyci5lcnJcbiAgICAgID8gZ2V0RXJyb3IoZXJyLmVycilcbiAgICAgIDogZXJyLm1lc3NhZ2VcbiAgICAgID8gZ2V0RXJyb3IoZXJyLm1lc3NhZ2UpXG4gICAgICA6IEpTT04uc3RyaW5naWZ5KGVycik7XG4gIH1cblxuICAvLyBAdHMtaWdub3JlXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlJbnNlcnQ8VD4oYXJyOiBUW10sIGluZGV4OiBudW1iZXIsIHZhbDogVCk6IFRbXSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG4gIHJldHVybiBbLi4uYXJyLnNsaWNlKDAsIGluZGV4KSwgdmFsLCAuLi5hcnIuc2xpY2UoaW5kZXgpXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc01vYmlsZVdpZHRoKGJyZWFrUG9pbnRWYWx1ZXM6IHtwYWxtOiBudW1iZXI7IGRlc2s6IG51bWJlcn0pOiBib29sZWFuIHtcbiAgY29uc3QgbW9iaWxlV2lkdGggPSB3aW5kb3cubWF0Y2hNZWRpYShgKG1heC13aWR0aDogJHticmVha1BvaW50VmFsdWVzLnBhbG19cHgpYCk7XG4gIHJldHVybiBtb2JpbGVXaWR0aC5tYXRjaGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzUG9ydGFibGVXaWR0aChicmVha1BvaW50VmFsdWVzOiB7cGFsbTogbnVtYmVyOyBkZXNrOiBudW1iZXJ9KTogYm9vbGVhbiB7XG4gIGNvbnN0IG1vYmlsZVdpZHRoID0gd2luZG93Lm1hdGNoTWVkaWEoYChtYXgtd2lkdGg6ICR7YnJlYWtQb2ludFZhbHVlcy5kZXNrfXB4KWApO1xuICByZXR1cm4gbW9iaWxlV2lkdGgubWF0Y2hlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGVzdCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzPy5lbnY/Lk5PREVfRU5WID09PSAndGVzdCc7XG59XG5cbi8qKlxuICogRmlsdGVycyBhbiBvYmplY3QgYnkgYW4gYXJiaXRyYXJ5IHByZWRpY2F0ZVxuICogUmV0dXJucyBhIG5ldyBvYmplY3QgY29udGFpbmluZyBhbGwgZWxlbWVudHMgdGhhdCBtYXRjaCB0aGUgcHJlZGljYXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIE9iamVjdCB0byBiZSBmaWx0ZXJlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFByZWRpY2F0ZSBieSB3aGljaCB0aGUgb2JqZWN0IHdpbGwgYmUgZmlsdGVyZWRcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJPYmplY3RCeVByZWRpY2F0ZShvYmosIHByZWRpY2F0ZSkge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMob2JqKS5yZWR1Y2UoXG4gICAgKGFjYywgZW50cnkpID0+IChwcmVkaWNhdGUoZW50cnlbMF0sIGVudHJ5WzFdKSA/IHsuLi5hY2MsIFtlbnRyeVswXV06IGVudHJ5WzFdfSA6IGFjYyksXG4gICAge31cbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb24oZnVuYyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGZ1bmMgPT09ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQnlJZChpZDogc3RyaW5nKTogPFggZXh0ZW5kcyB7aWQ6IHN0cmluZ30+KGFycjogWFtdKSA9PiBYIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGFyciA9PiBhcnIuZmluZChhID0+IGEuaWQgPT09IGlkKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFycmF5IGRpZmZlcmVuY2UgZnJvbVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlEaWZmZXJlbmNlPFggZXh0ZW5kcyB7aWQ6IHN0cmluZ30+KHNvdXJjZTogWFtdKTogKGNvbXBhcmU6IFhbXSkgPT4gWFtdIHtcbiAgcmV0dXJuIGNvbXBhcmUgPT5cbiAgICBzb3VyY2UucmVkdWNlKChhY2MsIGVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGZvdW5kRWxlbWVudCA9IGZpbmRCeUlkKGVsZW1lbnQuaWQpKGNvbXBhcmUpO1xuICAgICAgcmV0dXJuIGZvdW5kRWxlbWVudCA/IFsuLi5hY2MsIGZvdW5kRWxlbWVudF0gOiBhY2M7XG4gICAgfSwgW10gYXMgWFtdKTtcbn1cbiJdfQ==
|