@nlabs/arkhamjs 3.20.5 → 3.23.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/lib/Flux/Flux.js CHANGED
@@ -1,1037 +1,382 @@
1
- "use strict";
2
-
3
- require("core-js/modules/es.object.set-prototype-of.js");
4
-
5
- require("core-js/modules/es.object.get-prototype-of.js");
6
-
7
- require("core-js/modules/es.reflect.construct.js");
8
-
9
- require("core-js/modules/es.object.create.js");
10
-
11
- require("core-js/modules/es.symbol.js");
12
-
13
- require("core-js/modules/es.symbol.description.js");
14
-
15
- require("core-js/modules/es.symbol.iterator.js");
16
-
17
- require("core-js/modules/es.array.index-of.js");
18
-
19
- require("core-js/modules/es.object.get-own-property-descriptor.js");
20
-
21
- require("core-js/modules/es.object.get-own-property-descriptors.js");
22
-
23
- require("core-js/modules/es.object.define-properties.js");
24
-
25
- Object.defineProperty(exports, "__esModule", {
26
- value: true
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
9
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
+ var __spreadValues = (a, b) => {
11
+ for (var prop in b || (b = {}))
12
+ if (__hasOwnProp.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ if (__getOwnPropSymbols)
15
+ for (var prop of __getOwnPropSymbols(b)) {
16
+ if (__propIsEnum.call(b, prop))
17
+ __defNormalProp(a, prop, b[prop]);
18
+ }
19
+ return a;
20
+ };
21
+ var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
22
+ var __objRest = (source, exclude) => {
23
+ var target = {};
24
+ for (var prop in source)
25
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
26
+ target[prop] = source[prop];
27
+ if (source != null && __getOwnPropSymbols)
28
+ for (var prop of __getOwnPropSymbols(source)) {
29
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
30
+ target[prop] = source[prop];
31
+ }
32
+ return target;
33
+ };
34
+ var __export = (target, all) => {
35
+ for (var name in all)
36
+ __defProp(target, name, { get: all[name], enumerable: true });
37
+ };
38
+ var __reExport = (target, module2, copyDefault, desc) => {
39
+ if (module2 && typeof module2 === "object" || typeof module2 === "function") {
40
+ for (let key of __getOwnPropNames(module2))
41
+ if (!__hasOwnProp.call(target, key) && (copyDefault || key !== "default"))
42
+ __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
43
+ }
44
+ return target;
45
+ };
46
+ var __toESM = (module2, isNodeMode) => {
47
+ return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", !isNodeMode && module2 && module2.__esModule ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
48
+ };
49
+ var __toCommonJS = /* @__PURE__ */ ((cache) => {
50
+ return (module2, temp) => {
51
+ return cache && cache.get(module2) || (temp = __reExport(__markAsModule({}), module2, 1), cache && cache.set(module2, temp), temp);
52
+ };
53
+ })(typeof WeakMap !== "undefined" ? /* @__PURE__ */ new WeakMap() : 0);
54
+ var Flux_exports = {};
55
+ __export(Flux_exports, {
56
+ Flux: () => Flux,
57
+ FluxFramework: () => FluxFramework
27
58
  });
28
- exports.Flux = exports.FluxFramework = void 0;
29
-
30
- require("regenerator-runtime/runtime.js");
31
-
32
- require("core-js/modules/es.promise.js");
33
-
34
- require("core-js/modules/es.object.to-string.js");
35
-
36
- require("core-js/modules/es.function.bind.js");
37
-
38
- require("core-js/modules/es.array.for-each.js");
39
-
40
- require("core-js/modules/web.dom-collections.for-each.js");
41
-
42
- require("core-js/modules/es.function.name.js");
43
-
44
- require("core-js/modules/es.object.keys.js");
45
-
46
- require("core-js/modules/es.date.now.js");
47
-
48
- require("core-js/modules/es.date.to-string.js");
49
-
50
- require("core-js/modules/es.string.iterator.js");
51
-
52
- require("core-js/modules/es.array.iterator.js");
53
-
54
- require("core-js/modules/web.dom-collections.iterator.js");
55
-
56
- require("core-js/modules/es.array.map.js");
57
-
58
- require("core-js/modules/es.array.reduce.js");
59
-
60
- require("core-js/modules/es.array.filter.js");
61
-
62
- require("core-js/modules/es.object.define-property.js");
63
-
64
- var _errorStackParser = _interopRequireDefault(require("error-stack-parser"));
65
-
66
- var _events = require("events");
67
-
68
- var _debounce = _interopRequireDefault(require("lodash/debounce"));
69
-
70
- var _cloneDeep = _interopRequireDefault(require("lodash/fp/cloneDeep"));
71
-
72
- var _get = _interopRequireDefault(require("lodash/fp/get"));
73
-
74
- var _isEmpty = _interopRequireDefault(require("lodash/fp/isEmpty"));
75
-
76
- var _merge = _interopRequireDefault(require("lodash/fp/merge"));
77
-
78
- var _set = _interopRequireDefault(require("lodash/fp/set"));
79
-
80
- var _ArkhamConstants = require("../constants/ArkhamConstants");
81
-
82
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
83
-
84
- 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; }
85
-
86
- 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) { _defineProperty(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; }
87
-
88
- function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
89
-
90
- function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
91
-
92
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
93
-
94
- function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
95
-
96
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
97
-
98
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
99
-
100
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
101
-
102
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
103
-
104
- function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
105
-
106
- function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
107
-
108
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
109
-
110
- function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
111
-
112
- function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
113
-
114
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
115
-
116
- function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
117
-
118
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
119
-
120
- /**
121
- * FluxFramework
122
- * @type {EventEmitter}
123
- */
124
- var FluxFramework = /*#__PURE__*/function (_EventEmitter) {
125
- _inherits(FluxFramework, _EventEmitter);
126
-
127
- var _super = _createSuper(FluxFramework);
128
-
129
- // Public properties
130
- // Private properties
131
-
132
- /**
133
- * Create a new instance of Flux. Note that the Flux object
134
- * is a Singleton pattern, so only one should ever exist.
135
- *
136
- * @constructor
137
- * @this {FluxFramework}
138
- */
139
- function FluxFramework() {
140
- var _this;
141
-
142
- _classCallCheck(this, FluxFramework);
143
-
144
- _this = _super.call(this); // Methods
145
-
146
- _defineProperty(_assertThisInitialized(_this), "isInit", false);
147
-
148
- _defineProperty(_assertThisInitialized(_this), "pluginTypes", ['preDispatch', 'postDispatch']);
149
-
150
- _defineProperty(_assertThisInitialized(_this), "state", {});
151
-
152
- _defineProperty(_assertThisInitialized(_this), "storeActions", {});
153
-
154
- _defineProperty(_assertThisInitialized(_this), "defaultOptions", {
155
- name: 'arkhamjs',
156
- routerType: 'browser',
59
+ var import_error_stack_parser = __toESM(require("error-stack-parser"));
60
+ var import_events = require("events");
61
+ var import_debounce = __toESM(require("lodash/debounce"));
62
+ var import_cloneDeep = __toESM(require("lodash/fp/cloneDeep"));
63
+ var import_get = __toESM(require("lodash/fp/get"));
64
+ var import_isEmpty = __toESM(require("lodash/fp/isEmpty"));
65
+ var import_merge = __toESM(require("lodash/fp/merge"));
66
+ var import_set = __toESM(require("lodash/fp/set"));
67
+ var import_ArkhamConstants = require("../constants/ArkhamConstants");
68
+ class FluxFramework extends import_events.EventEmitter {
69
+ constructor() {
70
+ super();
71
+ this.isInit = false;
72
+ this.pluginTypes = ["preDispatch", "postDispatch"];
73
+ this.state = {};
74
+ this.storeActions = {};
75
+ this.defaultOptions = {
76
+ name: "arkhamjs",
77
+ routerType: "browser",
157
78
  scrollToTop: true,
158
79
  state: null,
159
80
  storage: null,
160
81
  storageWait: 300,
161
82
  stores: [],
162
- title: 'ArkhamJS'
83
+ title: "ArkhamJS"
84
+ };
85
+ this.middleware = {};
86
+ this.options = this.defaultOptions;
87
+ this.updateStorage = () => Promise.resolve(false);
88
+ this.addMiddleware = this.addMiddleware.bind(this);
89
+ this.addStores = this.addStores.bind(this);
90
+ this.clearAppData = this.clearAppData.bind(this);
91
+ this.clearMiddleware = this.clearMiddleware.bind(this);
92
+ this.deregister = this.deregister.bind(this);
93
+ this.dispatch = this.dispatch.bind(this);
94
+ this.getOptions = this.getOptions.bind(this);
95
+ this.getState = this.getState.bind(this);
96
+ this.getStore = this.getStore.bind(this);
97
+ this.init = this.init.bind(this);
98
+ this.off = this.off.bind(this);
99
+ this.register = this.register.bind(this);
100
+ this.removeMiddleware = this.removeMiddleware.bind(this);
101
+ this.removeStores = this.removeStores.bind(this);
102
+ this.reset = this.reset.bind(this);
103
+ this.setState = this.setState.bind(this);
104
+ this.pluginTypes.forEach((type) => this.middleware[`${type}List`] = []);
105
+ }
106
+ addMiddleware(middleware) {
107
+ middleware.forEach((middleObj) => {
108
+ if (!!middleObj && (typeof middleObj === "function" || typeof middleObj === "object")) {
109
+ const middleName = middleObj.name || "";
110
+ if (!middleName) {
111
+ throw Error("Unknown middleware is not configured properly. Requires name property. Cannot add to Flux.");
112
+ }
113
+ this.pluginTypes.forEach((type) => {
114
+ const method = middleObj[type];
115
+ const plugin = { method, name: middleName };
116
+ this.middleware[`${type}List`] = this.addPlugin(type, plugin);
117
+ });
118
+ } else {
119
+ throw Error("Unknown middleware is not configured properly. Cannot add to Flux.");
120
+ }
163
121
  });
164
-
165
- _defineProperty(_assertThisInitialized(_this), "middleware", {});
166
-
167
- _defineProperty(_assertThisInitialized(_this), "options", _this.defaultOptions);
168
-
169
- _defineProperty(_assertThisInitialized(_this), "updateStorage", function () {
170
- return Promise.resolve(false);
122
+ }
123
+ clearAppData() {
124
+ Object.keys(this.storeActions).forEach((storeName) => {
125
+ const storeFn = this.storeActions[storeName];
126
+ this.state[storeFn.name] = (0, import_cloneDeep.default)(storeFn.initialState);
171
127
  });
172
-
173
- _this.addMiddleware = _this.addMiddleware.bind(_assertThisInitialized(_this));
174
- _this.addStores = _this.addStores.bind(_assertThisInitialized(_this));
175
- _this.clearAppData = _this.clearAppData.bind(_assertThisInitialized(_this));
176
- _this.clearMiddleware = _this.clearMiddleware.bind(_assertThisInitialized(_this));
177
- _this.deregister = _this.deregister.bind(_assertThisInitialized(_this));
178
- _this.dispatch = _this.dispatch.bind(_assertThisInitialized(_this));
179
- _this.getOptions = _this.getOptions.bind(_assertThisInitialized(_this));
180
- _this.getState = _this.getState.bind(_assertThisInitialized(_this));
181
- _this.getStore = _this.getStore.bind(_assertThisInitialized(_this));
182
- _this.init = _this.init.bind(_assertThisInitialized(_this));
183
- _this.off = _this.off.bind(_assertThisInitialized(_this));
184
- _this.register = _this.register.bind(_assertThisInitialized(_this));
185
- _this.removeMiddleware = _this.removeMiddleware.bind(_assertThisInitialized(_this));
186
- _this.removeStores = _this.removeStores.bind(_assertThisInitialized(_this));
187
- _this.reset = _this.reset.bind(_assertThisInitialized(_this));
188
- _this.setState = _this.setState.bind(_assertThisInitialized(_this)); // Add middleware plugin types
189
-
190
- _this.pluginTypes.forEach(function (type) {
191
- return _this.middleware["".concat(type, "List")] = [];
128
+ const { name, storage } = this.options;
129
+ if (storage) {
130
+ return storage.setStorageData(name, this.state);
131
+ }
132
+ return Promise.resolve(true);
133
+ }
134
+ clearMiddleware() {
135
+ Object.keys(this.middleware).forEach((pluginType) => {
136
+ this.middleware[pluginType] = [];
192
137
  });
193
-
194
- return _this;
138
+ return true;
195
139
  }
196
- /**
197
- * Add middleware to framework.
198
- *
199
- * @param {array} middleware An array of middleware to add to the framework.
200
- */
201
-
202
-
203
- _createClass(FluxFramework, [{
204
- key: "addMiddleware",
205
- value: function addMiddleware(middleware) {
206
- var _this2 = this;
207
-
208
- middleware.forEach(function (middleObj) {
209
- // Make sure middleware is either a class or object.
210
- if (!!middleObj && (typeof middleObj === 'function' || _typeof(middleObj) === 'object')) {
211
- var middleName = middleObj.name || '';
212
-
213
- if (!middleName) {
214
- throw Error('Unknown middleware is not configured properly. Requires name property. Cannot add to Flux.');
215
- } // Sort middleware plugins for efficiency
216
-
217
-
218
- _this2.pluginTypes.forEach(function (type) {
219
- var method = middleObj[type];
220
- var plugin = {
221
- method: method,
222
- name: middleName
223
- };
224
- _this2.middleware["".concat(type, "List")] = _this2.addPlugin(type, plugin);
225
- });
226
- } else {
227
- throw Error('Unknown middleware is not configured properly. Cannot add to Flux.');
228
- }
229
- });
140
+ removeStores(storeNames) {
141
+ storeNames.forEach((name) => this.deregister(name));
142
+ }
143
+ async dispatch(action, silent = false) {
144
+ if (!action) {
145
+ throw new Error("ArkhamJS Error: Flux.dispatch requires an action.");
230
146
  }
231
- /**
232
- * Remove all app data from storage.
233
- *
234
- * @returns {Promise<boolean>} Whether app data was successfully removed.
235
- */
236
-
237
- }, {
238
- key: "clearAppData",
239
- value: function clearAppData() {
240
- var _this3 = this;
241
-
242
- // Set all store data to initial state
243
- Object.keys(this.storeActions).forEach(function (storeName) {
244
- var storeFn = _this3.storeActions[storeName];
245
- _this3.state[storeFn.name] = (0, _cloneDeep["default"])(storeFn.initialState);
147
+ let clonedAction = (0, import_cloneDeep.default)(action);
148
+ const startTime = Date.now();
149
+ let stack = [];
150
+ try {
151
+ const stackProperty = "stackTraceLimit";
152
+ const { stackTraceLimit } = Error;
153
+ Error[stackProperty] = Infinity;
154
+ stack = import_error_stack_parser.default.parse(new Error());
155
+ Error[stackProperty] = stackTraceLimit;
156
+ } catch (error) {
157
+ }
158
+ const options = (0, import_cloneDeep.default)(this.options);
159
+ const appInfo = { duration: 0, options, stack };
160
+ const { postDispatchList = [], preDispatchList = [] } = this.middleware;
161
+ if (preDispatchList.length) {
162
+ clonedAction = await Promise.all(preDispatchList.map((plugin) => plugin.method((0, import_cloneDeep.default)(clonedAction), (0, import_cloneDeep.default)(this.state), appInfo))).then((actions) => actions.reduce((updatedAction, action2) => (0, import_merge.default)(updatedAction, action2), clonedAction)).catch((error) => {
163
+ throw error;
246
164
  });
247
- var _this$options = this.options,
248
- name = _this$options.name,
249
- storage = _this$options.storage;
250
-
251
- if (storage) {
252
- return storage.setStorageData(name, this.state);
165
+ }
166
+ const _a = clonedAction, { type } = _a, data = __objRest(_a, ["type"]);
167
+ if (!type || type === "") {
168
+ console.warn("ArkhamJS Warning: Flux.dispatch is missing an action type for the payload:", data);
169
+ return Promise.resolve(clonedAction);
170
+ }
171
+ Object.keys(this.storeActions).forEach((storeName) => {
172
+ const storeFn = this.storeActions[storeName];
173
+ const state = (0, import_cloneDeep.default)(this.state[storeName]) || (0, import_cloneDeep.default)(storeFn.initialState) || {};
174
+ this.state[storeName] = (0, import_cloneDeep.default)(storeFn.action(type, data, state)) || state;
175
+ });
176
+ const { storage } = this.options;
177
+ if (storage) {
178
+ try {
179
+ await this.updateStorage();
180
+ } catch (error) {
253
181
  }
254
-
255
- return Promise.resolve(true);
256
182
  }
257
- /**
258
- * Remove all middleware.
259
- *
260
- * @returns {boolean} Whether middleware was successfully removed.
261
- */
262
-
263
- }, {
264
- key: "clearMiddleware",
265
- value: function clearMiddleware() {
266
- var _this4 = this;
267
-
268
- // Set all store data to initial state
269
- Object.keys(this.middleware).forEach(function (pluginType) {
270
- _this4.middleware[pluginType] = [];
183
+ const endTime = +new Date();
184
+ const duration = endTime - startTime;
185
+ appInfo.duration = duration;
186
+ if (postDispatchList.length) {
187
+ clonedAction = await Promise.all(postDispatchList.map(async (plugin) => plugin.method((0, import_cloneDeep.default)(clonedAction), (0, import_cloneDeep.default)(this.state), appInfo))).then((actions) => actions.reduce((updatedAction, action2) => (0, import_merge.default)(updatedAction, action2), clonedAction)).catch((error) => {
188
+ throw error;
271
189
  });
272
- return true;
273
190
  }
274
- /**
275
- * De-registers named stores.
276
- *
277
- * @param {array} storeNames An array of store names to remove from the framework.
278
- */
279
-
280
- }, {
281
- key: "removeStores",
282
- value: function removeStores(storeNames) {
283
- var _this5 = this;
284
-
285
- storeNames.forEach(function (name) {
286
- return _this5.deregister(name);
287
- });
191
+ if (!silent) {
192
+ this.emit(type, clonedAction);
193
+ this.emit("arkhamjs", this.state);
288
194
  }
289
- /**
290
- * Dispatches an action to all stores.
291
- *
292
- * @param {object} action to dispatch to all the stores.
293
- * @param {boolean} silent To silence any events.
294
- * @returns {Promise} The promise is resolved when and if the app saves data to storage, returning
295
- * the action.
296
- */
297
-
298
- }, {
299
- key: "dispatch",
300
- value: function () {
301
- var _dispatch = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(action) {
302
- var _this6 = this;
303
-
304
- var silent,
305
- clonedAction,
306
- startTime,
307
- stack,
308
- stackProperty,
309
- stackTraceLimit,
310
- options,
311
- appInfo,
312
- _this$middleware,
313
- _this$middleware$post,
314
- postDispatchList,
315
- _this$middleware$preD,
316
- preDispatchList,
317
- _clonedAction,
318
- type,
319
- data,
320
- storage,
321
- endTime,
322
- duration,
323
- _args2 = arguments;
324
-
325
- return regeneratorRuntime.wrap(function _callee2$(_context2) {
326
- while (1) {
327
- switch (_context2.prev = _context2.next) {
328
- case 0:
329
- silent = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : false;
330
-
331
- if (action) {
332
- _context2.next = 3;
333
- break;
334
- }
335
-
336
- throw new Error('ArkhamJS Error: Flux.dispatch requires an action.');
337
-
338
- case 3:
339
- clonedAction = (0, _cloneDeep["default"])(action); // Log duration of dispatch
340
-
341
- startTime = Date.now(); // Get stack
342
-
343
- stack = [];
344
-
345
- try {
346
- stackProperty = 'stackTraceLimit';
347
- stackTraceLimit = Error.stackTraceLimit;
348
- Error[stackProperty] = Infinity;
349
- stack = _errorStackParser["default"].parse(new Error());
350
- Error[stackProperty] = stackTraceLimit;
351
- } catch (error) {} // Get options
352
-
353
-
354
- options = (0, _cloneDeep["default"])(this.options); // App info
355
-
356
- appInfo = {
357
- duration: 0,
358
- options: options,
359
- stack: stack
360
- }; // Apply middleware before the action is processed
361
-
362
- _this$middleware = this.middleware, _this$middleware$post = _this$middleware.postDispatchList, postDispatchList = _this$middleware$post === void 0 ? [] : _this$middleware$post, _this$middleware$preD = _this$middleware.preDispatchList, preDispatchList = _this$middleware$preD === void 0 ? [] : _this$middleware$preD;
363
-
364
- if (!preDispatchList.length) {
365
- _context2.next = 14;
366
- break;
367
- }
368
-
369
- _context2.next = 13;
370
- return Promise.all(preDispatchList.map(function (plugin) {
371
- return plugin.method((0, _cloneDeep["default"])(clonedAction), (0, _cloneDeep["default"])(_this6.state), appInfo);
372
- })).then(function (actions) {
373
- return actions.reduce(function (updatedAction, action) {
374
- return (0, _merge["default"])(updatedAction, action);
375
- }, clonedAction);
376
- })["catch"](function (error) {
377
- throw error;
378
- });
379
-
380
- case 13:
381
- clonedAction = _context2.sent;
382
-
383
- case 14:
384
- _clonedAction = clonedAction, type = _clonedAction.type, data = _objectWithoutProperties(_clonedAction, ["type"]); // Require a type
385
-
386
- if (!(!type || type === '')) {
387
- _context2.next = 18;
388
- break;
389
- }
390
-
391
- console.warn('ArkhamJS Warning: Flux.dispatch is missing an action type for the payload:', data);
392
- return _context2.abrupt("return", Promise.resolve(clonedAction));
393
-
394
- case 18:
395
- // When an action comes in, it must be completely handled by all stores
396
- Object.keys(this.storeActions).forEach(function (storeName) {
397
- var storeFn = _this6.storeActions[storeName];
398
- var state = (0, _cloneDeep["default"])(_this6.state[storeName]) || (0, _cloneDeep["default"])(storeFn.initialState) || {};
399
- _this6.state[storeName] = (0, _cloneDeep["default"])(storeFn.action(type, data, state)) || state;
400
- }); // Save cache in storage
401
-
402
- storage = this.options.storage;
403
-
404
- if (!storage) {
405
- _context2.next = 28;
406
- break;
407
- }
408
-
409
- _context2.prev = 21;
410
- _context2.next = 24;
411
- return this.updateStorage();
412
-
413
- case 24:
414
- _context2.next = 28;
415
- break;
416
-
417
- case 26:
418
- _context2.prev = 26;
419
- _context2.t0 = _context2["catch"](21);
420
-
421
- case 28:
422
- endTime = +new Date();
423
- duration = endTime - startTime;
424
- appInfo.duration = duration;
425
-
426
- if (!postDispatchList.length) {
427
- _context2.next = 35;
428
- break;
429
- }
430
-
431
- _context2.next = 34;
432
- return Promise.all(postDispatchList.map( /*#__PURE__*/function () {
433
- var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(plugin) {
434
- return regeneratorRuntime.wrap(function _callee$(_context) {
435
- while (1) {
436
- switch (_context.prev = _context.next) {
437
- case 0:
438
- return _context.abrupt("return", plugin.method((0, _cloneDeep["default"])(clonedAction), (0, _cloneDeep["default"])(_this6.state), appInfo));
439
-
440
- case 1:
441
- case "end":
442
- return _context.stop();
443
- }
444
- }
445
- }, _callee);
446
- }));
447
-
448
- return function (_x2) {
449
- return _ref.apply(this, arguments);
450
- };
451
- }())).then(function (actions) {
452
- return actions.reduce(function (updatedAction, action) {
453
- return (0, _merge["default"])(updatedAction, action);
454
- }, clonedAction);
455
- })["catch"](function (error) {
456
- throw error;
457
- });
458
-
459
- case 34:
460
- clonedAction = _context2.sent;
461
-
462
- case 35:
463
- if (!silent) {
464
- this.emit(type, clonedAction);
465
- }
466
-
467
- return _context2.abrupt("return", Promise.resolve(clonedAction));
468
-
469
- case 37:
470
- case "end":
471
- return _context2.stop();
472
- }
473
- }
474
- }, _callee2, this, [[21, 26]]);
475
- }));
476
-
477
- function dispatch(_x) {
478
- return _dispatch.apply(this, arguments);
479
- }
480
-
481
- return dispatch;
482
- }()
483
- /**
484
- * Get the current Flux options.
485
- *
486
- * @returns {FluxOptions} the Flux options object.
487
- */
488
-
489
- }, {
490
- key: "getOptions",
491
- value: function getOptions() {
492
- return this.options;
195
+ return Promise.resolve(clonedAction);
196
+ }
197
+ getOptions() {
198
+ return this.options;
199
+ }
200
+ getState(path = "", defaultValue) {
201
+ let storeValue;
202
+ if (!path) {
203
+ storeValue = this.state || {};
204
+ } else {
205
+ storeValue = (0, import_get.default)(path, this.state);
493
206
  }
494
- /**
495
- * Get the current state object.
496
- *
497
- * @param {string|array} [name] (optional) The name of the store for an object, otherwise it will return all store
498
- * objects. You can also use an array to specify a property path within the object.
499
- * @param {any} [defaultValue] (optional) A default value to return if null.
500
- * @returns {any} the state object or a property value within.
501
- */
502
-
503
- }, {
504
- key: "getState",
505
- value: function getState() {
506
- var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
507
- var defaultValue = arguments.length > 1 ? arguments[1] : undefined;
508
- var storeValue;
509
-
510
- if (!path) {
511
- storeValue = this.state || {};
512
- } else {
513
- storeValue = (0, _get["default"])(path, this.state);
514
- }
515
-
516
- var value = storeValue ? (0, _cloneDeep["default"])(storeValue) : storeValue;
517
- return value === undefined ? defaultValue : value;
207
+ const value = storeValue ? (0, import_cloneDeep.default)(storeValue) : storeValue;
208
+ return value === void 0 ? defaultValue : value;
209
+ }
210
+ getStore(name = "") {
211
+ return this.storeActions[name];
212
+ }
213
+ async init(options = {}, reset = false) {
214
+ if (reset) {
215
+ this.isInit = false;
216
+ this.reset(false);
518
217
  }
519
- /**
520
- * Get a store object registered with Flux.
521
- *
522
- * @param {string} name The name of the store.
523
- * @returns {FluxStore} the store object.
524
- */
525
-
526
- }, {
527
- key: "getStore",
528
- value: function getStore() {
529
- var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
530
- return this.storeActions[name];
218
+ const updatedOptions = __spreadValues({}, options);
219
+ if (this.isInit) {
220
+ updatedOptions.name = this.options.name;
531
221
  }
532
- /**
533
- * Initialize and set configuration options.
534
- *
535
- * @param {object} options Configuration options.
536
- */
537
-
538
- }, {
539
- key: "init",
540
- value: function () {
541
- var _init = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {
542
- var options,
543
- reset,
544
- updatedOptions,
545
- _this$options2,
546
- debug,
547
- middleware,
548
- name,
549
- stores,
550
- windowProperty,
551
- _args3 = arguments;
552
-
553
- return regeneratorRuntime.wrap(function _callee3$(_context3) {
554
- while (1) {
555
- switch (_context3.prev = _context3.next) {
556
- case 0:
557
- options = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : {};
558
- reset = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : false;
559
-
560
- // Should reset previous params
561
- if (reset) {
562
- this.isInit = false;
563
- this.reset(false);
564
- } // Set options
565
-
566
-
567
- updatedOptions = _objectSpread({}, options);
568
-
569
- if (this.isInit) {
570
- // Remove the name from options if already initialized, otherwise the root app will not be able to access
571
- // the state tree
572
- updatedOptions.name = this.options.name;
573
- }
574
-
575
- this.options = _objectSpread(_objectSpread({}, this.defaultOptions), updatedOptions);
576
- _this$options2 = this.options, debug = _this$options2.debug, middleware = _this$options2.middleware, name = _this$options2.name, stores = _this$options2.stores; // Update default store
577
-
578
- _context3.prev = 7;
579
- _context3.next = 10;
580
- return this.useStorage(name);
581
-
582
- case 10:
583
- _context3.next = 16;
584
- break;
585
-
586
- case 12:
587
- _context3.prev = 12;
588
- _context3.t0 = _context3["catch"](7);
589
- console.error('Arkham Error: There was an error while using storage.', name);
590
- throw _context3.t0;
591
-
592
- case 16:
593
- if (!(!!stores && stores.length)) {
594
- _context3.next = 26;
595
- break;
596
- }
597
-
598
- _context3.prev = 17;
599
- _context3.next = 20;
600
- return this.addStores(stores);
601
-
602
- case 20:
603
- _context3.next = 26;
604
- break;
605
-
606
- case 22:
607
- _context3.prev = 22;
608
- _context3.t1 = _context3["catch"](17);
609
- console.error('Arkham Error: There was an error while adding stores.', stores);
610
- throw _context3.t1;
611
-
612
- case 26:
613
- if (!!middleware && middleware.length) {
614
- this.addMiddleware(middleware);
615
- }
616
-
617
- windowProperty = 'arkhamjs';
618
-
619
- if (debug) {
620
- window[windowProperty] = this;
621
- } else {
622
- delete window[windowProperty];
623
- }
624
-
625
- this.isInit = true;
626
- this.emit(_ArkhamConstants.ArkhamConstants.INIT);
627
- return _context3.abrupt("return", this);
628
-
629
- case 32:
630
- case "end":
631
- return _context3.stop();
632
- }
633
- }
634
- }, _callee3, this, [[7, 12], [17, 22]]);
635
- }));
636
-
637
- function init() {
638
- return _init.apply(this, arguments);
639
- }
640
-
641
- return init;
642
- }()
643
- /**
644
- * Adds an initialization listener.
645
- *
646
- * @param {function} [listener] The callback associated with the subscribed event.
647
- */
648
-
649
- }, {
650
- key: "onInit",
651
- value: function onInit(listener) {
652
- this.on(_ArkhamConstants.ArkhamConstants.INIT, listener);
653
-
654
- if (this.isInit) {
655
- listener();
222
+ this.options = __spreadValues(__spreadValues({}, this.defaultOptions), updatedOptions);
223
+ const { debug, middleware, name, stores } = this.options;
224
+ try {
225
+ await this.useStorage(name);
226
+ } catch (error) {
227
+ console.error("Arkham Error: There was an error while using storage.", name);
228
+ throw error;
229
+ }
230
+ if (!!stores && stores.length) {
231
+ try {
232
+ await this.addStores(stores);
233
+ } catch (error) {
234
+ console.error("Arkham Error: There was an error while adding stores.", stores);
235
+ throw error;
656
236
  }
657
237
  }
658
- /**
659
- * Removes the initialization listener.
660
- *
661
- * @param {function} [listener] The callback associated with the subscribed event.
662
- */
663
-
664
- }, {
665
- key: "offInit",
666
- value: function offInit(listener) {
667
- this.off(_ArkhamConstants.ArkhamConstants.INIT, listener);
238
+ if (!!middleware && middleware.length) {
239
+ this.addMiddleware(middleware);
668
240
  }
669
- /**
670
- * Removes an event listener.
671
- *
672
- * @param {string} [eventType] Event to unsubscribe.
673
- * @param {function} [listener] The callback associated with the subscribed event.
674
- */
675
-
676
- }, {
677
- key: "off",
678
- value: function off(eventType, listener) {
679
- return this.removeListener(eventType, listener);
241
+ const windowProperty = "arkhamjs";
242
+ if (debug) {
243
+ window[windowProperty] = this;
244
+ } else {
245
+ delete window[windowProperty];
680
246
  }
681
- /**
682
- * Adds an event listener.
683
- *
684
- * @param {string} [eventType] Event to subscribe.
685
- * @param {function} [listener] The callback associated with the subscribed event.
686
- */
687
-
688
- }, {
689
- key: "on",
690
- value: function on(eventType, listener) {
691
- return this.addListener(eventType, listener);
247
+ this.isInit = true;
248
+ this.emit(import_ArkhamConstants.ArkhamConstants.INIT);
249
+ return this;
250
+ }
251
+ onInit(listener) {
252
+ this.on(import_ArkhamConstants.ArkhamConstants.INIT, listener);
253
+ if (this.isInit) {
254
+ listener();
692
255
  }
693
- /**
694
- * Registers new Stores.
695
- *
696
- * @param {array} stores Store class.
697
- * @returns {Promise<object[]>} the class object(s).
698
- */
699
-
700
- }, {
701
- key: "addStores",
702
- value: function () {
703
- var _addStores = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(stores) {
704
- var _this7 = this;
705
-
706
- var registeredStores, _this$options3, name, storage;
707
-
708
- return regeneratorRuntime.wrap(function _callee4$(_context4) {
709
- while (1) {
710
- switch (_context4.prev = _context4.next) {
711
- case 0:
712
- registeredStores = stores.map(function (store) {
713
- return _this7.register(store);
714
- }); // Save cache in session storage
715
-
716
- _this$options3 = this.options, name = _this$options3.name, storage = _this$options3.storage;
717
-
718
- if (!storage) {
719
- _context4.next = 11;
720
- break;
721
- }
722
-
723
- _context4.prev = 3;
724
- _context4.next = 6;
725
- return storage.setStorageData(name, this.state);
726
-
727
- case 6:
728
- _context4.next = 11;
729
- break;
730
-
731
- case 8:
732
- _context4.prev = 8;
733
- _context4.t0 = _context4["catch"](3);
734
- throw _context4.t0;
735
-
736
- case 11:
737
- return _context4.abrupt("return", registeredStores);
738
-
739
- case 12:
740
- case "end":
741
- return _context4.stop();
742
- }
743
- }
744
- }, _callee4, this, [[3, 8]]);
745
- }));
746
-
747
- function addStores(_x3) {
748
- return _addStores.apply(this, arguments);
256
+ }
257
+ offInit(listener) {
258
+ this.off(import_ArkhamConstants.ArkhamConstants.INIT, listener);
259
+ }
260
+ off(eventType, listener) {
261
+ return this.removeListener(eventType, listener);
262
+ }
263
+ on(eventType, listener) {
264
+ return this.addListener(eventType, listener);
265
+ }
266
+ async addStores(stores) {
267
+ const registeredStores = stores.map((store) => this.register(store));
268
+ const { name, storage } = this.options;
269
+ if (storage) {
270
+ try {
271
+ await storage.setStorageData(name, this.state);
272
+ } catch (error) {
273
+ throw error;
749
274
  }
750
-
751
- return addStores;
752
- }()
753
- /**
754
- * Remove middleware from framework.
755
- *
756
- * @param {array} string middleware names to remove.
757
- * @returns {Promise<object[]>} the class object(s).
758
- */
759
-
760
- }, {
761
- key: "removeMiddleware",
762
- value: function removeMiddleware(names) {
763
- var _this8 = this;
764
-
765
- names.forEach(function (name) {
766
- // Remove middleware plugins
767
- _this8.pluginTypes.forEach(function (type) {
768
- _this8.middleware["".concat(type, "List")] = _this8.removePlugin(type, name);
769
- });
770
- });
771
275
  }
772
- /**
773
- * Reset framework.
774
- *
775
- * @param {array} string middleware names to remove.
776
- * @returns {Promise<object[]>} the class object(s).
777
- */
778
-
779
- }, {
780
- key: "reset",
781
- value: function () {
782
- var _reset = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {
783
- var clearStorage,
784
- _this$options4,
785
- name,
786
- storage,
787
- _args5 = arguments;
788
-
789
- return regeneratorRuntime.wrap(function _callee5$(_context5) {
790
- while (1) {
791
- switch (_context5.prev = _context5.next) {
792
- case 0:
793
- clearStorage = _args5.length > 0 && _args5[0] !== undefined ? _args5[0] : true;
794
- _this$options4 = this.options, name = _this$options4.name, storage = _this$options4.storage; // Clear persistent cache
795
-
796
- if (!(storage && clearStorage)) {
797
- _context5.next = 11;
798
- break;
799
- }
800
-
801
- _context5.prev = 3;
802
- _context5.next = 6;
803
- return storage.setStorageData(name, {});
804
-
805
- case 6:
806
- _context5.next = 11;
807
- break;
808
-
809
- case 8:
810
- _context5.prev = 8;
811
- _context5.t0 = _context5["catch"](3);
812
- throw _context5.t0;
813
-
814
- case 11:
815
- // Clear all properties
816
- this.middleware = {};
817
- this.options = _objectSpread({}, this.defaultOptions);
818
- this.state = {};
819
- this.storeActions = {};
820
- this.isInit = false;
821
-
822
- case 16:
823
- case "end":
824
- return _context5.stop();
825
- }
826
- }
827
- }, _callee5, this, [[3, 8]]);
828
- }));
829
-
830
- function reset() {
831
- return _reset.apply(this, arguments);
832
- }
833
-
834
- return reset;
835
- }()
836
- /**
837
- * Sets the current state object.
838
- *
839
- * @param {string|array} [name] The name of the store to set. You can also use an array to specify a property path
840
- * within the object.
841
- * @param {any} [value] The value to set.
842
- */
843
-
844
- }, {
845
- key: "setState",
846
- value: function setState() {
847
- var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
848
- var value = arguments.length > 1 ? arguments[1] : undefined;
849
-
850
- if (!!path) {
851
- this.state = (0, _set["default"])(path, (0, _cloneDeep["default"])(value), this.state);
852
- } // Update persistent cache
853
-
854
-
855
- var storage = this.options.storage;
856
-
857
- if (storage) {
858
- return this.updateStorage();
276
+ return registeredStores;
277
+ }
278
+ removeMiddleware(names) {
279
+ names.forEach((name) => {
280
+ this.pluginTypes.forEach((type) => {
281
+ this.middleware[`${type}List`] = this.removePlugin(type, name);
282
+ });
283
+ });
284
+ }
285
+ async reset(clearStorage = true) {
286
+ const { name, storage } = this.options;
287
+ if (storage && clearStorage) {
288
+ try {
289
+ await storage.setStorageData(name, {});
290
+ } catch (error) {
291
+ throw error;
859
292
  }
860
-
861
- return Promise.resolve(false);
862
293
  }
863
- }, {
864
- key: "addPlugin",
865
- value: function addPlugin(type, plugin) {
866
- var list = this.middleware["".concat(type, "List")] || [];
867
- var method = plugin.method,
868
- name = plugin.name;
869
-
870
- if (method && typeof method === 'function') {
871
- // Check if plugin already exists
872
- var exists = !!list.filter(function (obj) {
873
- return obj.name === name;
874
- }).length; // Do not add duplicate plugins
875
-
876
- if (!exists) {
877
- list.push({
878
- method: method,
879
- name: name
880
- });
881
- }
882
- } else if (method !== undefined) {
883
- throw Error("".concat(plugin.name, " middleware is not configured properly. Method is not a function."));
884
- }
885
-
886
- return list;
294
+ this.middleware = {};
295
+ this.options = __spreadValues({}, this.defaultOptions);
296
+ this.state = {};
297
+ this.storeActions = {};
298
+ this.isInit = false;
299
+ }
300
+ setState(path = "", value) {
301
+ if (!!path) {
302
+ this.state = (0, import_set.default)(path, (0, import_cloneDeep.default)(value), this.state);
887
303
  }
888
- }, {
889
- key: "deregister",
890
- value: function deregister() {
891
- var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
892
- delete this.storeActions[name];
893
- delete this.state[name];
304
+ const { storage } = this.options;
305
+ if (storage) {
306
+ return this.updateStorage();
894
307
  }
895
- }, {
896
- key: "register",
897
- value: function register(storeFn) {
898
- if (!storeFn) {
899
- throw Error('Store is undefined. Cannot register with Flux.');
308
+ return Promise.resolve(false);
309
+ }
310
+ addPlugin(type, plugin) {
311
+ const list = this.middleware[`${type}List`] || [];
312
+ const { method, name } = plugin;
313
+ if (method && typeof method === "function") {
314
+ const exists = !!list.filter((obj) => obj.name === name).length;
315
+ if (!exists) {
316
+ list.push({ method, name });
900
317
  }
901
-
902
- var isFnc = typeof storeFn === 'function';
903
-
904
- if (!isFnc) {
905
- throw Error("".concat(storeFn, " is not a store function. Cannot register with Flux."));
906
- } // Create store object
907
-
908
-
909
- var name = storeFn.name;
910
- var initialState = storeFn();
911
- var storeAction = {
912
- action: storeFn,
913
- initialState: storeFn(),
914
- name: name
915
- };
916
-
917
- if (!(0, _isEmpty["default"])(name) && !this.storeActions[name]) {
918
- // Save store object
919
- this.storeActions[name] = storeAction; // Get default values
920
-
921
- if (!this.state[name]) {
922
- if (initialState) {
923
- this.state[name] = (0, _cloneDeep["default"])(initialState);
924
- } else {
925
- this.state[name] = {};
926
- }
927
- }
928
- } // Return store class
929
-
930
-
931
- return this.storeActions[name];
318
+ } else if (method !== void 0) {
319
+ throw Error(`${plugin.name} middleware is not configured properly. Method is not a function.`);
932
320
  }
933
- }, {
934
- key: "removePlugin",
935
- value: function removePlugin(type, name) {
936
- var list = this.middleware["".concat(type, "List")] || []; // remove all occurrences of the plugin
937
-
938
- return list.filter(function (obj) {
939
- return obj.name !== name;
940
- });
321
+ return list;
322
+ }
323
+ deregister(name = "") {
324
+ delete this.storeActions[name];
325
+ delete this.state[name];
326
+ }
327
+ register(storeFn) {
328
+ if (!storeFn) {
329
+ throw Error("Store is undefined. Cannot register with Flux.");
330
+ }
331
+ const isFnc = typeof storeFn === "function";
332
+ if (!isFnc) {
333
+ throw Error(`${storeFn} is not a store function. Cannot register with Flux.`);
334
+ }
335
+ const { name } = storeFn;
336
+ const initialState = storeFn();
337
+ const storeAction = {
338
+ action: storeFn,
339
+ initialState: storeFn(),
340
+ name
341
+ };
342
+ if (!(0, import_isEmpty.default)(name) && !this.storeActions[name]) {
343
+ this.storeActions[name] = storeAction;
344
+ if (!this.state[name]) {
345
+ if (initialState) {
346
+ this.state[name] = (0, import_cloneDeep.default)(initialState);
347
+ } else {
348
+ this.state[name] = {};
349
+ }
350
+ }
941
351
  }
942
- }, {
943
- key: "useStorage",
944
- value: function () {
945
- var _useStorage = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6(name) {
946
- var _this9 = this;
947
-
948
- var _this$options5, storage, state, storageWait;
949
-
950
- return regeneratorRuntime.wrap(function _callee6$(_context6) {
951
- while (1) {
952
- switch (_context6.prev = _context6.next) {
953
- case 0:
954
- _this$options5 = this.options, storage = _this$options5.storage, state = _this$options5.state, storageWait = _this$options5.storageWait; // Cache
955
-
956
- if (!storage) {
957
- _context6.next = 21;
958
- break;
959
- }
960
-
961
- _context6.prev = 2;
962
- _context6.t1 = state;
963
-
964
- if (_context6.t1) {
965
- _context6.next = 8;
966
- break;
967
- }
968
-
969
- _context6.next = 7;
970
- return storage.getStorageData(name);
971
-
972
- case 7:
973
- _context6.t1 = _context6.sent;
974
-
975
- case 8:
976
- _context6.t0 = _context6.t1;
977
-
978
- if (_context6.t0) {
979
- _context6.next = 11;
980
- break;
981
- }
982
-
983
- _context6.t0 = {};
984
-
985
- case 11:
986
- this.state = _context6.t0;
987
- this.updateStorage = (0, _debounce["default"])(function () {
988
- return storage.setStorageData(name, _this9.state);
989
- }, storageWait, {
990
- leading: true,
991
- trailing: true
992
- });
993
- _context6.next = 19;
994
- break;
995
-
996
- case 15:
997
- _context6.prev = 15;
998
- _context6.t2 = _context6["catch"](2);
999
- console.error("ArkhamJS Error: Using storage, \"".concat(name, "\"."));
1000
- throw _context6.t2;
1001
-
1002
- case 19:
1003
- _context6.next = 22;
1004
- break;
1005
-
1006
- case 21:
1007
- this.state = state || {};
1008
-
1009
- case 22:
1010
- return _context6.abrupt("return", null);
1011
-
1012
- case 23:
1013
- case "end":
1014
- return _context6.stop();
1015
- }
1016
- }
1017
- }, _callee6, this, [[2, 15]]);
1018
- }));
1019
-
1020
- function useStorage(_x4) {
1021
- return _useStorage.apply(this, arguments);
352
+ return this.storeActions[name];
353
+ }
354
+ removePlugin(type, name) {
355
+ const list = this.middleware[`${type}List`] || [];
356
+ return list.filter((obj) => obj.name !== name);
357
+ }
358
+ async useStorage(name) {
359
+ const { storage, state, storageWait } = this.options;
360
+ if (storage) {
361
+ try {
362
+ this.state = state || await storage.getStorageData(name) || {};
363
+ this.updateStorage = (0, import_debounce.default)(() => storage.setStorageData(name, this.state), storageWait, { leading: true, trailing: true });
364
+ } catch (error) {
365
+ console.error(`ArkhamJS Error: Using storage, "${name}".`);
366
+ throw error;
1022
367
  }
1023
-
1024
- return useStorage;
1025
- }()
1026
- }]);
1027
-
1028
- return FluxFramework;
1029
- }(_events.EventEmitter);
1030
-
1031
- exports.FluxFramework = FluxFramework;
1032
-
1033
- _defineProperty(FluxFramework, "initFlux", false);
1034
-
1035
- var Flux = new FluxFramework();
1036
- exports.Flux = Flux;
1037
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9GbHV4L0ZsdXgudHMiXSwibmFtZXMiOlsiRmx1eEZyYW1ld29yayIsIm5hbWUiLCJyb3V0ZXJUeXBlIiwic2Nyb2xsVG9Ub3AiLCJzdGF0ZSIsInN0b3JhZ2UiLCJzdG9yYWdlV2FpdCIsInN0b3JlcyIsInRpdGxlIiwiZGVmYXVsdE9wdGlvbnMiLCJQcm9taXNlIiwicmVzb2x2ZSIsImFkZE1pZGRsZXdhcmUiLCJiaW5kIiwiYWRkU3RvcmVzIiwiY2xlYXJBcHBEYXRhIiwiY2xlYXJNaWRkbGV3YXJlIiwiZGVyZWdpc3RlciIsImRpc3BhdGNoIiwiZ2V0T3B0aW9ucyIsImdldFN0YXRlIiwiZ2V0U3RvcmUiLCJpbml0Iiwib2ZmIiwicmVnaXN0ZXIiLCJyZW1vdmVNaWRkbGV3YXJlIiwicmVtb3ZlU3RvcmVzIiwicmVzZXQiLCJzZXRTdGF0ZSIsInBsdWdpblR5cGVzIiwiZm9yRWFjaCIsInR5cGUiLCJtaWRkbGV3YXJlIiwibWlkZGxlT2JqIiwibWlkZGxlTmFtZSIsIkVycm9yIiwibWV0aG9kIiwicGx1Z2luIiwiYWRkUGx1Z2luIiwiT2JqZWN0Iiwia2V5cyIsInN0b3JlQWN0aW9ucyIsInN0b3JlTmFtZSIsInN0b3JlRm4iLCJpbml0aWFsU3RhdGUiLCJvcHRpb25zIiwic2V0U3RvcmFnZURhdGEiLCJwbHVnaW5UeXBlIiwic3RvcmVOYW1lcyIsImFjdGlvbiIsInNpbGVudCIsImNsb25lZEFjdGlvbiIsInN0YXJ0VGltZSIsIkRhdGUiLCJub3ciLCJzdGFjayIsInN0YWNrUHJvcGVydHkiLCJzdGFja1RyYWNlTGltaXQiLCJJbmZpbml0eSIsIkVycm9yU3RhY2tQYXJzZXIiLCJwYXJzZSIsImVycm9yIiwiYXBwSW5mbyIsImR1cmF0aW9uIiwicG9zdERpc3BhdGNoTGlzdCIsInByZURpc3BhdGNoTGlzdCIsImxlbmd0aCIsImFsbCIsIm1hcCIsInRoZW4iLCJhY3Rpb25zIiwicmVkdWNlIiwidXBkYXRlZEFjdGlvbiIsImRhdGEiLCJjb25zb2xlIiwid2FybiIsInVwZGF0ZVN0b3JhZ2UiLCJlbmRUaW1lIiwiZW1pdCIsInBhdGgiLCJkZWZhdWx0VmFsdWUiLCJzdG9yZVZhbHVlIiwidmFsdWUiLCJ1bmRlZmluZWQiLCJpc0luaXQiLCJ1cGRhdGVkT3B0aW9ucyIsImRlYnVnIiwidXNlU3RvcmFnZSIsIndpbmRvd1Byb3BlcnR5Iiwid2luZG93IiwiQXJraGFtQ29uc3RhbnRzIiwiSU5JVCIsImxpc3RlbmVyIiwib24iLCJldmVudFR5cGUiLCJyZW1vdmVMaXN0ZW5lciIsImFkZExpc3RlbmVyIiwicmVnaXN0ZXJlZFN0b3JlcyIsInN0b3JlIiwibmFtZXMiLCJyZW1vdmVQbHVnaW4iLCJjbGVhclN0b3JhZ2UiLCJsaXN0IiwiZXhpc3RzIiwiZmlsdGVyIiwib2JqIiwicHVzaCIsImlzRm5jIiwic3RvcmVBY3Rpb24iLCJnZXRTdG9yYWdlRGF0YSIsImxlYWRpbmciLCJ0cmFpbGluZyIsIkV2ZW50RW1pdHRlciIsIkZsdXgiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7SUFDYUEsYTs7Ozs7QUFHWDtBQUVBOztBQWVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0UsMkJBQWM7QUFBQTs7QUFBQTs7QUFDWiw4QkFEWSxDQUdaOztBQUhZLDZEQXpCSSxLQXlCSjs7QUFBQSxrRUF2QlUsQ0FBQyxhQUFELEVBQWdCLGNBQWhCLENBdUJWOztBQUFBLDREQXJCTyxFQXFCUDs7QUFBQSxtRUFwQmMsRUFvQmQ7O0FBQUEscUVBbkJ3QjtBQUNwQ0MsTUFBQUEsSUFBSSxFQUFFLFVBRDhCO0FBRXBDQyxNQUFBQSxVQUFVLEVBQUUsU0FG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QU1NLHFCQUFLRyxLQU5YO0FBT00scUJBQUt3RSxhQUFMLEdBQXFCLDBCQUNuQjtBQUFBLHlCQUFNdkUsT0FBTyxDQUFDeUMsY0FBUixDQUF1QjdDLElBQXZCLEVBQTZCLE1BQUksQ0FBQ0csS0FBbEMsQ0FBTjtBQUFBLGlCQURtQixFQUVuQkUsV0FGbUIsRUFHbkI7QUFBQ3dHLGtCQUFBQSxPQUFPLEVBQUUsSUFBVjtBQUFnQkMsa0JBQUFBLFFBQVEsRUFBRTtBQUExQixpQkFIbUIsQ0FBckI7QUFQTjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQWFNckMsZ0JBQUFBLE9BQU8sQ0FBQ2IsS0FBUiw0Q0FBaUQ1RCxJQUFqRDtBQWJOOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQWlCSSxxQkFBS0csS0FBTCxHQUFhQSxLQUFLLElBQUksRUFBdEI7O0FBakJKO0FBQUEsa0RBb0JTLElBcEJUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7Ozs7O0VBcmhCaUM0RyxvQjs7OztnQkFBdEJoSCxhLGNBQ2dCLEs7O0FBNGlCdEIsSUFBTWlILElBQW1CLEdBQUcsSUFBSWpILGFBQUosRUFBNUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IEVycm9yU3RhY2tQYXJzZXIgZnJvbSAnZXJyb3Itc3RhY2stcGFyc2VyJztcbmltcG9ydCB7RXZlbnRFbWl0dGVyfSBmcm9tICdldmVudHMnO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJ2xvZGFzaC9kZWJvdW5jZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC9mcC9jbG9uZURlZXAnO1xuaW1wb3J0IGdldCBmcm9tICdsb2Rhc2gvZnAvZ2V0JztcbmltcG9ydCBpc0VtcHR5IGZyb20gJ2xvZGFzaC9mcC9pc0VtcHR5JztcbmltcG9ydCBtZXJnZSBmcm9tICdsb2Rhc2gvZnAvbWVyZ2UnO1xuaW1wb3J0IHNldCBmcm9tICdsb2Rhc2gvZnAvc2V0JztcblxuaW1wb3J0IHtBcmtoYW1Db25zdGFudHN9IGZyb20gJy4uL2NvbnN0YW50cy9BcmtoYW1Db25zdGFudHMnO1xuaW1wb3J0IHtGbHV4QWN0aW9uLCBGbHV4TWlkZGxld2FyZVR5cGUsIEZsdXhPcHRpb25zLCBGbHV4UGx1Z2luVHlwZSwgRmx1eFN0b3JlfSBmcm9tICcuL0ZsdXgudHlwZXMnO1xuXG4vKipcbiAqIEZsdXhGcmFtZXdvcmtcbiAqIEB0eXBlIHtFdmVudEVtaXR0ZXJ9XG4gKi9cbmV4cG9ydCBjbGFzcyBGbHV4RnJhbWV3b3JrIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgc3RhdGljIGluaXRGbHV4OiBib29sZWFuID0gZmFsc2U7XG4gIGlzSW5pdDogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyBQdWJsaWMgcHJvcGVydGllc1xuICBwbHVnaW5UeXBlczogc3RyaW5nW10gPSBbJ3ByZURpc3BhdGNoJywgJ3Bvc3REaXNwYXRjaCddO1xuICAvLyBQcml2YXRlIHByb3BlcnRpZXNcbiAgcHJpdmF0ZSBzdGF0ZTogYW55ID0ge307XG4gIHByaXZhdGUgc3RvcmVBY3Rpb25zOiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBkZWZhdWx0T3B0aW9uczogRmx1eE9wdGlvbnMgPSB7XG4gICAgbmFtZTogJ2Fya2hhbWpzJyxcbiAgICByb3V0ZXJUeXBlOiAnYnJvd3NlcicsXG4gICAgc2Nyb2xsVG9Ub3A6IHRydWUsXG4gICAgc3RhdGU6IG51bGwsXG4gICAgc3RvcmFnZTogbnVsbCxcbiAgICBzdG9yYWdlV2FpdDogMzAwLFxuICAgIHN0b3JlczogW10sXG4gICAgdGl0bGU6ICdBcmtoYW1KUydcbiAgfTtcbiAgcHJpdmF0ZSBtaWRkbGV3YXJlOiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBvcHRpb25zOiBGbHV4T3B0aW9ucyA9IHRoaXMuZGVmYXVsdE9wdGlvbnM7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgRmx1eC4gIE5vdGUgdGhhdCB0aGUgRmx1eCBvYmplY3RcbiAgICogaXMgYSBTaW5nbGV0b24gcGF0dGVybiwgc28gb25seSBvbmUgc2hvdWxkIGV2ZXIgZXhpc3QuXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAdGhpcyB7Rmx1eEZyYW1ld29ya31cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBNZXRob2RzXG4gICAgdGhpcy5hZGRNaWRkbGV3YXJlID0gdGhpcy5hZGRNaWRkbGV3YXJlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5hZGRTdG9yZXMgPSB0aGlzLmFkZFN0b3Jlcy5iaW5kKHRoaXMpO1xuICAgIHRoaXMuY2xlYXJBcHBEYXRhID0gdGhpcy5jbGVhckFwcERhdGEuYmluZCh0aGlzKTtcbiAgICB0aGlzLmNsZWFyTWlkZGxld2FyZSA9IHRoaXMuY2xlYXJNaWRkbGV3YXJlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5kZXJlZ2lzdGVyID0gdGhpcy5kZXJlZ2lzdGVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5kaXNwYXRjaCA9IHRoaXMuZGlzcGF0Y2guYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldE9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMuYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldFN0YXRlID0gdGhpcy5nZXRTdGF0ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZ2V0U3RvcmUgPSB0aGlzLmdldFN0b3JlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5pbml0ID0gdGhpcy5pbml0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5vZmYgPSB0aGlzLm9mZi5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXIgPSB0aGlzLnJlZ2lzdGVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5yZW1vdmVNaWRkbGV3YXJlID0gdGhpcy5yZW1vdmVNaWRkbGV3YXJlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5yZW1vdmVTdG9yZXMgPSB0aGlzLnJlbW92ZVN0b3Jlcy5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVzZXQgPSB0aGlzLnJlc2V0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5zZXRTdGF0ZSA9IHRoaXMuc2V0U3RhdGUuYmluZCh0aGlzKTtcblxuICAgIC8vIEFkZCBtaWRkbGV3YXJlIHBsdWdpbiB0eXBlc1xuICAgIHRoaXMucGx1Z2luVHlwZXMuZm9yRWFjaCgodHlwZTogc3RyaW5nKSA9PiB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gPSBbXSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIG1pZGRsZXdhcmUgdG8gZnJhbWV3b3JrLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5fSBtaWRkbGV3YXJlIEFuIGFycmF5IG9mIG1pZGRsZXdhcmUgdG8gYWRkIHRvIHRoZSBmcmFtZXdvcmsuXG4gICAqL1xuICBhZGRNaWRkbGV3YXJlKG1pZGRsZXdhcmU6IEZsdXhNaWRkbGV3YXJlVHlwZVtdKTogdm9pZCB7XG4gICAgbWlkZGxld2FyZS5mb3JFYWNoKChtaWRkbGVPYmo6IEZsdXhNaWRkbGV3YXJlVHlwZSkgPT4ge1xuICAgICAgLy8gTWFrZSBzdXJlIG1pZGRsZXdhcmUgaXMgZWl0aGVyIGEgY2xhc3Mgb3Igb2JqZWN0LlxuICAgICAgaWYoISFtaWRkbGVPYmogJiYgKCh0eXBlb2YgbWlkZGxlT2JqID09PSAnZnVuY3Rpb24nKSB8fCAodHlwZW9mIG1pZGRsZU9iaiA9PT0gJ29iamVjdCcpKSkge1xuICAgICAgICBjb25zdCBtaWRkbGVOYW1lOiBzdHJpbmcgPSBtaWRkbGVPYmoubmFtZSB8fCAnJztcblxuICAgICAgICBpZighbWlkZGxlTmFtZSkge1xuICAgICAgICAgIHRocm93IEVycm9yKCdVbmtub3duIG1pZGRsZXdhcmUgaXMgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkuIFJlcXVpcmVzIG5hbWUgcHJvcGVydHkuIENhbm5vdCBhZGQgdG8gRmx1eC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvcnQgbWlkZGxld2FyZSBwbHVnaW5zIGZvciBlZmZpY2llbmN5XG4gICAgICAgIHRoaXMucGx1Z2luVHlwZXMuZm9yRWFjaCgodHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWV0aG9kID0gbWlkZGxlT2JqW3R5cGVdO1xuICAgICAgICAgIGNvbnN0IHBsdWdpbjogRmx1eFBsdWdpblR5cGUgPSB7bWV0aG9kLCBuYW1lOiBtaWRkbGVOYW1lfTtcbiAgICAgICAgICB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gPSB0aGlzLmFkZFBsdWdpbih0eXBlLCBwbHVnaW4pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IEVycm9yKCdVbmtub3duIG1pZGRsZXdhcmUgaXMgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkuIENhbm5vdCBhZGQgdG8gRmx1eC4nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIGFwcCBkYXRhIGZyb20gc3RvcmFnZS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgYXBwIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgKi9cbiAgY2xlYXJBcHBEYXRhKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIFNldCBhbGwgc3RvcmUgZGF0YSB0byBpbml0aWFsIHN0YXRlXG4gICAgT2JqZWN0XG4gICAgICAua2V5cyh0aGlzLnN0b3JlQWN0aW9ucylcbiAgICAgIC5mb3JFYWNoKChzdG9yZU5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBzdG9yZUZuID0gdGhpcy5zdG9yZUFjdGlvbnNbc3RvcmVOYW1lXTtcbiAgICAgICAgdGhpcy5zdGF0ZVtzdG9yZUZuLm5hbWVdID0gY2xvbmVEZWVwKHN0b3JlRm4uaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0pO1xuXG4gICAgY29uc3Qge25hbWUsIHN0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYoc3RvcmFnZSkge1xuICAgICAgcmV0dXJuIHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSwgdGhpcy5zdGF0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIG1pZGRsZXdhcmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIG1pZGRsZXdhcmUgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgKi9cbiAgY2xlYXJNaWRkbGV3YXJlKCk6IGJvb2xlYW4ge1xuICAgIC8vIFNldCBhbGwgc3RvcmUgZGF0YSB0byBpbml0aWFsIHN0YXRlXG4gICAgT2JqZWN0XG4gICAgICAua2V5cyh0aGlzLm1pZGRsZXdhcmUpXG4gICAgICAuZm9yRWFjaCgocGx1Z2luVHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubWlkZGxld2FyZVtwbHVnaW5UeXBlXSA9IFtdO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZS1yZWdpc3RlcnMgbmFtZWQgc3RvcmVzLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5fSBzdG9yZU5hbWVzIEFuIGFycmF5IG9mIHN0b3JlIG5hbWVzIHRvIHJlbW92ZSBmcm9tIHRoZSBmcmFtZXdvcmsuXG4gICAqL1xuICByZW1vdmVTdG9yZXMoc3RvcmVOYW1lczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBzdG9yZU5hbWVzLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4gdGhpcy5kZXJlZ2lzdGVyKG5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGFjdGlvbiB0byBhbGwgc3RvcmVzLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYWN0aW9uIHRvIGRpc3BhdGNoIHRvIGFsbCB0aGUgc3RvcmVzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNpbGVudCBUbyBzaWxlbmNlIGFueSBldmVudHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgcHJvbWlzZSBpcyByZXNvbHZlZCB3aGVuIGFuZCBpZiB0aGUgYXBwIHNhdmVzIGRhdGEgdG8gc3RvcmFnZSwgcmV0dXJuaW5nXG4gICAqIHRoZSBhY3Rpb24uXG4gICAqL1xuICBhc3luYyBkaXNwYXRjaChhY3Rpb246IEZsdXhBY3Rpb24sIHNpbGVudDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxGbHV4QWN0aW9uPiB7XG4gICAgaWYoIWFjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcmtoYW1KUyBFcnJvcjogRmx1eC5kaXNwYXRjaCByZXF1aXJlcyBhbiBhY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgbGV0IGNsb25lZEFjdGlvbjogRmx1eEFjdGlvbiA9IGNsb25lRGVlcChhY3Rpb24pO1xuXG4gICAgLy8gTG9nIGR1cmF0aW9uIG9mIGRpc3BhdGNoXG4gICAgY29uc3Qgc3RhcnRUaW1lOiBudW1iZXIgPSBEYXRlLm5vdygpO1xuXG4gICAgLy8gR2V0IHN0YWNrXG4gICAgbGV0IHN0YWNrID0gW107XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhY2tQcm9wZXJ0eTogc3RyaW5nID0gJ3N0YWNrVHJhY2VMaW1pdCc7XG4gICAgICBjb25zdCB7c3RhY2tUcmFjZUxpbWl0fTogYW55ID0gRXJyb3I7XG4gICAgICBFcnJvcltzdGFja1Byb3BlcnR5XSA9IEluZmluaXR5O1xuICAgICAgc3RhY2sgPSBFcnJvclN0YWNrUGFyc2VyLnBhcnNlKG5ldyBFcnJvcigpKTtcbiAgICAgIEVycm9yW3N0YWNrUHJvcGVydHldID0gc3RhY2tUcmFjZUxpbWl0O1xuICAgIH0gY2F0Y2goZXJyb3IpIHt9XG5cbiAgICAvLyBHZXQgb3B0aW9uc1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjbG9uZURlZXAodGhpcy5vcHRpb25zKTtcblxuICAgIC8vIEFwcCBpbmZvXG4gICAgY29uc3QgYXBwSW5mbyA9IHtkdXJhdGlvbjogMCwgb3B0aW9ucywgc3RhY2t9O1xuXG4gICAgLy8gQXBwbHkgbWlkZGxld2FyZSBiZWZvcmUgdGhlIGFjdGlvbiBpcyBwcm9jZXNzZWRcbiAgICBjb25zdCB7cG9zdERpc3BhdGNoTGlzdCA9IFtdLCBwcmVEaXNwYXRjaExpc3QgPSBbXX0gPSB0aGlzLm1pZGRsZXdhcmU7XG5cbiAgICBpZihwcmVEaXNwYXRjaExpc3QubGVuZ3RoKSB7XG4gICAgICBjbG9uZWRBY3Rpb24gPSBhd2FpdCBQcm9taXNlXG4gICAgICAgIC5hbGwoXG4gICAgICAgICAgcHJlRGlzcGF0Y2hMaXN0Lm1hcCgocGx1Z2luOiBGbHV4UGx1Z2luVHlwZSkgPT4gcGx1Z2luLm1ldGhvZChcbiAgICAgICAgICAgIGNsb25lRGVlcChjbG9uZWRBY3Rpb24pLCBjbG9uZURlZXAodGhpcy5zdGF0ZSksIGFwcEluZm8pXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIC50aGVuKFxuICAgICAgICAgIChhY3Rpb25zKSA9PiBhY3Rpb25zLnJlZHVjZSgodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSA9PlxuICAgICAgICAgICAgbWVyZ2UodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSwgY2xvbmVkQWN0aW9uKSBhcyBGbHV4QWN0aW9uXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB7dHlwZSwgLi4uZGF0YX0gPSBjbG9uZWRBY3Rpb247XG5cbiAgICAvLyBSZXF1aXJlIGEgdHlwZVxuICAgIGlmKCF0eXBlIHx8IHR5cGUgPT09ICcnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0Fya2hhbUpTIFdhcm5pbmc6IEZsdXguZGlzcGF0Y2ggaXMgbWlzc2luZyBhbiBhY3Rpb24gdHlwZSBmb3IgdGhlIHBheWxvYWQ6JywgZGF0YSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNsb25lZEFjdGlvbik7XG4gICAgfVxuXG4gICAgLy8gV2hlbiBhbiBhY3Rpb24gY29tZXMgaW4sIGl0IG11c3QgYmUgY29tcGxldGVseSBoYW5kbGVkIGJ5IGFsbCBzdG9yZXNcbiAgICBPYmplY3RcbiAgICAgIC5rZXlzKHRoaXMuc3RvcmVBY3Rpb25zKVxuICAgICAgLmZvckVhY2goKHN0b3JlTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0b3JlRm4gPSB0aGlzLnN0b3JlQWN0aW9uc1tzdG9yZU5hbWVdO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGNsb25lRGVlcCh0aGlzLnN0YXRlW3N0b3JlTmFtZV0pIHx8IGNsb25lRGVlcChzdG9yZUZuLmluaXRpYWxTdGF0ZSkgfHwge307XG4gICAgICAgIHRoaXMuc3RhdGVbc3RvcmVOYW1lXSA9IGNsb25lRGVlcChzdG9yZUZuLmFjdGlvbih0eXBlLCBkYXRhLCBzdGF0ZSkpIHx8IHN0YXRlO1xuICAgICAgfSk7XG5cbiAgICAvLyBTYXZlIGNhY2hlIGluIHN0b3JhZ2VcbiAgICBjb25zdCB7c3RvcmFnZX0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBpZihzdG9yYWdlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVN0b3JhZ2UoKTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHt9XG4gICAgfVxuXG4gICAgY29uc3QgZW5kVGltZTogbnVtYmVyID0gKyhuZXcgRGF0ZSgpKTtcbiAgICBjb25zdCBkdXJhdGlvbjogbnVtYmVyID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcbiAgICBhcHBJbmZvLmR1cmF0aW9uID0gZHVyYXRpb247XG5cbiAgICBpZihwb3N0RGlzcGF0Y2hMaXN0Lmxlbmd0aCkge1xuICAgICAgY2xvbmVkQWN0aW9uID0gYXdhaXQgUHJvbWlzZVxuICAgICAgICAuYWxsKFxuICAgICAgICAgIHBvc3REaXNwYXRjaExpc3QubWFwKFxuICAgICAgICAgICAgYXN5bmMgKHBsdWdpbjogRmx1eFBsdWdpblR5cGUpID0+IHBsdWdpbi5tZXRob2QoY2xvbmVEZWVwKGNsb25lZEFjdGlvbiksIGNsb25lRGVlcCh0aGlzLnN0YXRlKSwgYXBwSW5mbylcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgLnRoZW4oXG4gICAgICAgICAgKGFjdGlvbnMpID0+IGFjdGlvbnMucmVkdWNlKCh1cGRhdGVkQWN0aW9uLCBhY3Rpb24pID0+XG4gICAgICAgICAgICBtZXJnZSh1cGRhdGVkQWN0aW9uLCBhY3Rpb24pLCBjbG9uZWRBY3Rpb24pIGFzIEZsdXhBY3Rpb25cbiAgICAgICAgKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmKCFzaWxlbnQpIHtcbiAgICAgIHRoaXMuZW1pdCh0eXBlLCBjbG9uZWRBY3Rpb24pO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2xvbmVkQWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgRmx1eCBvcHRpb25zLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Rmx1eE9wdGlvbnN9IHRoZSBGbHV4IG9wdGlvbnMgb2JqZWN0LlxuICAgKi9cbiAgZ2V0T3B0aW9ucygpOiBGbHV4T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gW25hbWVdIChvcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIHN0b3JlIGZvciBhbiBvYmplY3QsIG90aGVyd2lzZSBpdCB3aWxsIHJldHVybiBhbGwgc3RvcmVcbiAgICogICBvYmplY3RzLiBZb3UgY2FuIGFsc28gdXNlIGFuIGFycmF5IHRvIHNwZWNpZnkgYSBwcm9wZXJ0eSBwYXRoIHdpdGhpbiB0aGUgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2FueX0gW2RlZmF1bHRWYWx1ZV0gKG9wdGlvbmFsKSBBIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIG51bGwuXG4gICAqIEByZXR1cm5zIHthbnl9IHRoZSBzdGF0ZSBvYmplY3Qgb3IgYSBwcm9wZXJ0eSB2YWx1ZSB3aXRoaW4uXG4gICAqL1xuICBnZXRTdGF0ZShwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnLCBkZWZhdWx0VmFsdWU/KTogYW55IHtcbiAgICBsZXQgc3RvcmVWYWx1ZTtcblxuICAgIGlmKCFwYXRoKSB7XG4gICAgICBzdG9yZVZhbHVlID0gdGhpcy5zdGF0ZSB8fCB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RvcmVWYWx1ZSA9IGdldChwYXRoLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHN0b3JlVmFsdWUgPyBjbG9uZURlZXAoc3RvcmVWYWx1ZSkgOiBzdG9yZVZhbHVlO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3RvcmUgb2JqZWN0IHJlZ2lzdGVyZWQgd2l0aCBGbHV4LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3RvcmUuXG4gICAqIEByZXR1cm5zIHtGbHV4U3RvcmV9IHRoZSBzdG9yZSBvYmplY3QuXG4gICAqL1xuICBnZXRTdG9yZShuYW1lOiBzdHJpbmcgPSAnJyk6IEZsdXhTdG9yZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYW5kIHNldCBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAgICovXG4gIGFzeW5jIGluaXQob3B0aW9uczogRmx1eE9wdGlvbnMgPSB7fSwgcmVzZXQ6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Rmx1eEZyYW1ld29yaz4ge1xuICAgIC8vIFNob3VsZCByZXNldCBwcmV2aW91cyBwYXJhbXNcbiAgICBpZihyZXNldCkge1xuICAgICAgdGhpcy5pc0luaXQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzZXQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIFNldCBvcHRpb25zXG4gICAgY29uc3QgdXBkYXRlZE9wdGlvbnMgPSB7Li4ub3B0aW9uc307XG5cbiAgICBpZih0aGlzLmlzSW5pdCkge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBuYW1lIGZyb20gb3B0aW9ucyBpZiBhbHJlYWR5IGluaXRpYWxpemVkLCBvdGhlcndpc2UgdGhlIHJvb3QgYXBwIHdpbGwgbm90IGJlIGFibGUgdG8gYWNjZXNzXG4gICAgICAvLyB0aGUgc3RhdGUgdHJlZVxuICAgICAgdXBkYXRlZE9wdGlvbnMubmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IHsuLi50aGlzLmRlZmF1bHRPcHRpb25zLCAuLi51cGRhdGVkT3B0aW9uc307XG4gICAgY29uc3Qge2RlYnVnLCBtaWRkbGV3YXJlLCBuYW1lLCBzdG9yZXN9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgLy8gVXBkYXRlIGRlZmF1bHQgc3RvcmVcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy51c2VTdG9yYWdlKG5hbWUpO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Fya2hhbSBFcnJvcjogVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHVzaW5nIHN0b3JhZ2UuJywgbmFtZSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZighIXN0b3JlcyAmJiBzdG9yZXMubGVuZ3RoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkZFN0b3JlcyhzdG9yZXMpO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdBcmtoYW0gRXJyb3I6IFRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBhZGRpbmcgc3RvcmVzLicsIHN0b3Jlcyk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKCEhbWlkZGxld2FyZSAmJiBtaWRkbGV3YXJlLmxlbmd0aCkge1xuICAgICAgdGhpcy5hZGRNaWRkbGV3YXJlKG1pZGRsZXdhcmUpO1xuICAgIH1cblxuICAgIGNvbnN0IHdpbmRvd1Byb3BlcnR5OiBzdHJpbmcgPSAnYXJraGFtanMnO1xuXG4gICAgaWYoZGVidWcpIHtcbiAgICAgIHdpbmRvd1t3aW5kb3dQcm9wZXJ0eV0gPSB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgd2luZG93W3dpbmRvd1Byb3BlcnR5XTtcbiAgICB9XG5cbiAgICB0aGlzLmlzSW5pdCA9IHRydWU7XG4gICAgdGhpcy5lbWl0KEFya2hhbUNvbnN0YW50cy5JTklUKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gaW5pdGlhbGl6YXRpb24gbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtsaXN0ZW5lcl0gVGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Vic2NyaWJlZCBldmVudC5cbiAgICovXG4gIG9uSW5pdChsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbihBcmtoYW1Db25zdGFudHMuSU5JVCwgbGlzdGVuZXIpO1xuXG4gICAgaWYodGhpcy5pc0luaXQpIHtcbiAgICAgIGxpc3RlbmVyKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGluaXRpYWxpemF0aW9uIGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbbGlzdGVuZXJdIFRoZSBjYWxsYmFjayBhc3NvY2lhdGVkIHdpdGggdGhlIHN1YnNjcmliZWQgZXZlbnQuXG4gICAqL1xuICBvZmZJbml0KGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9mZihBcmtoYW1Db25zdGFudHMuSU5JVCwgbGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXZlbnRUeXBlXSBFdmVudCB0byB1bnN1YnNjcmliZS5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2xpc3RlbmVyXSBUaGUgY2FsbGJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJzY3JpYmVkIGV2ZW50LlxuICAgKi9cbiAgb2ZmKGV2ZW50VHlwZTogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtldmVudFR5cGVdIEV2ZW50IHRvIHN1YnNjcmliZS5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2xpc3RlbmVyXSBUaGUgY2FsbGJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJzY3JpYmVkIGV2ZW50LlxuICAgKi9cbiAgb24oZXZlbnRUeXBlOiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgbmV3IFN0b3Jlcy5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gc3RvcmVzIFN0b3JlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3RbXT59IHRoZSBjbGFzcyBvYmplY3QocykuXG4gICAqL1xuICBhc3luYyBhZGRTdG9yZXMoc3RvcmVzOiBhbnlbXSk6IFByb21pc2U8b2JqZWN0W10+IHtcbiAgICBjb25zdCByZWdpc3RlcmVkU3RvcmVzOiBGbHV4U3RvcmVbXSA9IHN0b3Jlcy5tYXAoKHN0b3JlOiBGbHV4U3RvcmUpID0+IHRoaXMucmVnaXN0ZXIoc3RvcmUpKTtcblxuICAgIC8vIFNhdmUgY2FjaGUgaW4gc2Vzc2lvbiBzdG9yYWdlXG4gICAgY29uc3Qge25hbWUsIHN0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYoc3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXRTdG9yYWdlRGF0YShuYW1lLCB0aGlzLnN0YXRlKTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGNsYXNzZXNcbiAgICByZXR1cm4gcmVnaXN0ZXJlZFN0b3JlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgbWlkZGxld2FyZSBmcm9tIGZyYW1ld29yay5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gc3RyaW5nIG1pZGRsZXdhcmUgbmFtZXMgdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3RbXT59IHRoZSBjbGFzcyBvYmplY3QocykuXG4gICAqL1xuICByZW1vdmVNaWRkbGV3YXJlKG5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIG5hbWVzLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgLy8gUmVtb3ZlIG1pZGRsZXdhcmUgcGx1Z2luc1xuICAgICAgdGhpcy5wbHVnaW5UeXBlcy5mb3JFYWNoKCh0eXBlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gdGhpcy5yZW1vdmVQbHVnaW4odHlwZSwgbmFtZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBmcmFtZXdvcmsuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IHN0cmluZyBtaWRkbGV3YXJlIG5hbWVzIHRvIHJlbW92ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0W10+fSB0aGUgY2xhc3Mgb2JqZWN0KHMpLlxuICAgKi9cbiAgYXN5bmMgcmVzZXQoY2xlYXJTdG9yYWdlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtuYW1lLCBzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIC8vIENsZWFyIHBlcnNpc3RlbnQgY2FjaGVcbiAgICBpZihzdG9yYWdlICYmIGNsZWFyU3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXRTdG9yYWdlRGF0YShuYW1lLCB7fSk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsZWFyIGFsbCBwcm9wZXJ0aWVzXG4gICAgdGhpcy5taWRkbGV3YXJlID0ge307XG4gICAgdGhpcy5vcHRpb25zID0gey4uLnRoaXMuZGVmYXVsdE9wdGlvbnN9O1xuICAgIHRoaXMuc3RhdGUgPSB7fTtcbiAgICB0aGlzLnN0b3JlQWN0aW9ucyA9IHt9O1xuICAgIHRoaXMuaXNJbml0ID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgY3VycmVudCBzdGF0ZSBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfGFycmF5fSBbbmFtZV0gVGhlIG5hbWUgb2YgdGhlIHN0b3JlIHRvIHNldC4gWW91IGNhbiBhbHNvIHVzZSBhbiBhcnJheSB0byBzcGVjaWZ5IGEgcHJvcGVydHkgcGF0aFxuICAgKiB3aXRoaW4gdGhlIG9iamVjdC5cbiAgICogQHBhcmFtIHthbnl9IFt2YWx1ZV0gVGhlIHZhbHVlIHRvIHNldC5cbiAgICovXG4gIHNldFN0YXRlKHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdID0gJycsIHZhbHVlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYoISFwYXRoKSB7XG4gICAgICB0aGlzLnN0YXRlID0gc2V0KHBhdGgsIGNsb25lRGVlcCh2YWx1ZSksIHRoaXMuc3RhdGUpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBwZXJzaXN0ZW50IGNhY2hlXG4gICAgY29uc3Qge3N0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYoc3RvcmFnZSkge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlU3RvcmFnZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRQbHVnaW4odHlwZTogc3RyaW5nLCBwbHVnaW46IEZsdXhQbHVnaW5UeXBlKTogRmx1eFBsdWdpblR5cGVbXSB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMubWlkZGxld2FyZVtgJHt0eXBlfUxpc3RgXSB8fCBbXTtcbiAgICBjb25zdCB7bWV0aG9kLCBuYW1lfSA9IHBsdWdpbjtcblxuICAgIGlmKG1ldGhvZCAmJiB0eXBlb2YgbWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBDaGVjayBpZiBwbHVnaW4gYWxyZWFkeSBleGlzdHNcbiAgICAgIGNvbnN0IGV4aXN0czogYm9vbGVhbiA9ICEhbGlzdC5maWx0ZXIoKG9iajogRmx1eFBsdWdpblR5cGUpID0+IG9iai5uYW1lID09PSBuYW1lKS5sZW5ndGg7XG5cbiAgICAgIC8vIERvIG5vdCBhZGQgZHVwbGljYXRlIHBsdWdpbnNcbiAgICAgIGlmKCFleGlzdHMpIHtcbiAgICAgICAgbGlzdC5wdXNoKHttZXRob2QsIG5hbWV9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEVycm9yKGAke3BsdWdpbi5uYW1lfSBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBNZXRob2QgaXMgbm90IGEgZnVuY3Rpb24uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICBwcml2YXRlIGRlcmVnaXN0ZXIobmFtZTogc3RyaW5nID0gJycpOiB2b2lkIHtcbiAgICBkZWxldGUgdGhpcy5zdG9yZUFjdGlvbnNbbmFtZV07XG4gICAgZGVsZXRlIHRoaXMuc3RhdGVbbmFtZV07XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyKHN0b3JlRm4pOiBGbHV4U3RvcmUge1xuICAgIGlmKCFzdG9yZUZuKSB7XG4gICAgICB0aHJvdyBFcnJvcignU3RvcmUgaXMgdW5kZWZpbmVkLiBDYW5ub3QgcmVnaXN0ZXIgd2l0aCBGbHV4LicpO1xuICAgIH1cblxuICAgIGNvbnN0IGlzRm5jOiBib29sZWFuID0gdHlwZW9mIHN0b3JlRm4gPT09ICdmdW5jdGlvbic7XG5cbiAgICBpZighaXNGbmMpIHtcbiAgICAgIHRocm93IEVycm9yKGAke3N0b3JlRm59IGlzIG5vdCBhIHN0b3JlIGZ1bmN0aW9uLiBDYW5ub3QgcmVnaXN0ZXIgd2l0aCBGbHV4LmApO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBzdG9yZSBvYmplY3RcbiAgICBjb25zdCB7bmFtZX0gPSBzdG9yZUZuO1xuICAgIGNvbnN0IGluaXRpYWxTdGF0ZTogYW55ID0gc3RvcmVGbigpO1xuICAgIGNvbnN0IHN0b3JlQWN0aW9uID0ge1xuICAgICAgYWN0aW9uOiBzdG9yZUZuLFxuICAgICAgaW5pdGlhbFN0YXRlOiBzdG9yZUZuKCksXG4gICAgICBuYW1lXG4gICAgfTtcblxuICAgIGlmKCFpc0VtcHR5KG5hbWUpICYmICF0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXSkge1xuICAgICAgLy8gU2F2ZSBzdG9yZSBvYmplY3RcbiAgICAgIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdID0gc3RvcmVBY3Rpb247XG5cbiAgICAgIC8vIEdldCBkZWZhdWx0IHZhbHVlc1xuICAgICAgaWYoIXRoaXMuc3RhdGVbbmFtZV0pIHtcbiAgICAgICAgaWYoaW5pdGlhbFN0YXRlKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVtuYW1lXSA9IGNsb25lRGVlcChpbml0aWFsU3RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3RhdGVbbmFtZV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBzdG9yZSBjbGFzc1xuICAgIHJldHVybiB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUGx1Z2luKHR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogRmx1eFBsdWdpblR5cGVbXSB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMubWlkZGxld2FyZVtgJHt0eXBlfUxpc3RgXSB8fCBbXTtcblxuICAgIC8vIHJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHBsdWdpblxuICAgIHJldHVybiBsaXN0LmZpbHRlcigob2JqOiBGbHV4UGx1Z2luVHlwZSkgPT4gb2JqLm5hbWUgIT09IG5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdG9yYWdlID0gKCkgPT4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcblxuICBwcml2YXRlIGFzeW5jIHVzZVN0b3JhZ2UobmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qge3N0b3JhZ2UsIHN0YXRlLCBzdG9yYWdlV2FpdH0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAvLyBDYWNoZVxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZSB8fCBhd2FpdCBzdG9yYWdlLmdldFN0b3JhZ2VEYXRhKG5hbWUpIHx8IHt9O1xuICAgICAgICB0aGlzLnVwZGF0ZVN0b3JhZ2UgPSBkZWJvdW5jZShcbiAgICAgICAgICAoKSA9PiBzdG9yYWdlLnNldFN0b3JhZ2VEYXRhKG5hbWUsIHRoaXMuc3RhdGUpLFxuICAgICAgICAgIHN0b3JhZ2VXYWl0LFxuICAgICAgICAgIHtsZWFkaW5nOiB0cnVlLCB0cmFpbGluZzogdHJ1ZX1cbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQXJraGFtSlMgRXJyb3I6IFVzaW5nIHN0b3JhZ2UsIFwiJHtuYW1lfVwiLmApO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlIHx8IHt9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBGbHV4OiBGbHV4RnJhbWV3b3JrID0gbmV3IEZsdXhGcmFtZXdvcmsoKTtcbiJdfQ==
368
+ } else {
369
+ this.state = state || {};
370
+ }
371
+ return null;
372
+ }
373
+ }
374
+ FluxFramework.initFlux = false;
375
+ const Flux = new FluxFramework();
376
+ module.exports = __toCommonJS(Flux_exports);
377
+ // Annotate the CommonJS export names for ESM import in node:
378
+ 0 && (module.exports = {
379
+ Flux,
380
+ FluxFramework
381
+ });
382
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0ZsdXgvRmx1eC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCBFcnJvclN0YWNrUGFyc2VyIGZyb20gJ2Vycm9yLXN0YWNrLXBhcnNlcic7XG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdsb2Rhc2gvZGVib3VuY2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvZnAvY2xvbmVEZWVwJztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoL2ZwL2dldCc7XG5pbXBvcnQgaXNFbXB0eSBmcm9tICdsb2Rhc2gvZnAvaXNFbXB0eSc7XG5pbXBvcnQgbWVyZ2UgZnJvbSAnbG9kYXNoL2ZwL21lcmdlJztcbmltcG9ydCBzZXQgZnJvbSAnbG9kYXNoL2ZwL3NldCc7XG5cbmltcG9ydCB7QXJraGFtQ29uc3RhbnRzfSBmcm9tICcuLi9jb25zdGFudHMvQXJraGFtQ29uc3RhbnRzJztcbmltcG9ydCB7Rmx1eEFjdGlvbiwgRmx1eE1pZGRsZXdhcmVUeXBlLCBGbHV4T3B0aW9ucywgRmx1eFBsdWdpblR5cGUsIEZsdXhTdG9yZX0gZnJvbSAnLi9GbHV4LnR5cGVzJztcblxuLyoqXG4gKiBGbHV4RnJhbWV3b3JrXG4gKiBAdHlwZSB7RXZlbnRFbWl0dGVyfVxuICovXG5leHBvcnQgY2xhc3MgRmx1eEZyYW1ld29yayBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHN0YXRpYyBpbml0Rmx1eDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0luaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gUHVibGljIHByb3BlcnRpZXNcbiAgcGx1Z2luVHlwZXM6IHN0cmluZ1tdID0gWydwcmVEaXNwYXRjaCcsICdwb3N0RGlzcGF0Y2gnXTtcbiAgLy8gUHJpdmF0ZSBwcm9wZXJ0aWVzXG4gIHByaXZhdGUgc3RhdGU6IGFueSA9IHt9O1xuICBwcml2YXRlIHN0b3JlQWN0aW9uczogYW55ID0ge307XG4gIHByaXZhdGUgZGVmYXVsdE9wdGlvbnM6IEZsdXhPcHRpb25zID0ge1xuICAgIG5hbWU6ICdhcmtoYW1qcycsXG4gICAgcm91dGVyVHlwZTogJ2Jyb3dzZXInLFxuICAgIHNjcm9sbFRvVG9wOiB0cnVlLFxuICAgIHN0YXRlOiBudWxsLFxuICAgIHN0b3JhZ2U6IG51bGwsXG4gICAgc3RvcmFnZVdhaXQ6IDMwMCxcbiAgICBzdG9yZXM6IFtdLFxuICAgIHRpdGxlOiAnQXJraGFtSlMnXG4gIH07XG4gIHByaXZhdGUgbWlkZGxld2FyZTogYW55ID0ge307XG4gIHByaXZhdGUgb3B0aW9uczogRmx1eE9wdGlvbnMgPSB0aGlzLmRlZmF1bHRPcHRpb25zO1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEZsdXguICBOb3RlIHRoYXQgdGhlIEZsdXggb2JqZWN0XG4gICAqIGlzIGEgU2luZ2xldG9uIHBhdHRlcm4sIHNvIG9ubHkgb25lIHNob3VsZCBldmVyIGV4aXN0LlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHRoaXMge0ZsdXhGcmFtZXdvcmt9XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gTWV0aG9kc1xuICAgIHRoaXMuYWRkTWlkZGxld2FyZSA9IHRoaXMuYWRkTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuYWRkU3RvcmVzID0gdGhpcy5hZGRTdG9yZXMuYmluZCh0aGlzKTtcbiAgICB0aGlzLmNsZWFyQXBwRGF0YSA9IHRoaXMuY2xlYXJBcHBEYXRhLmJpbmQodGhpcyk7XG4gICAgdGhpcy5jbGVhck1pZGRsZXdhcmUgPSB0aGlzLmNsZWFyTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZGVyZWdpc3RlciA9IHRoaXMuZGVyZWdpc3Rlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZGlzcGF0Y2ggPSB0aGlzLmRpc3BhdGNoLmJpbmQodGhpcyk7XG4gICAgdGhpcy5nZXRPcHRpb25zID0gdGhpcy5nZXRPcHRpb25zLmJpbmQodGhpcyk7XG4gICAgdGhpcy5nZXRTdGF0ZSA9IHRoaXMuZ2V0U3RhdGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldFN0b3JlID0gdGhpcy5nZXRTdG9yZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaW5pdCA9IHRoaXMuaW5pdC5iaW5kKHRoaXMpO1xuICAgIHRoaXMub2ZmID0gdGhpcy5vZmYuYmluZCh0aGlzKTtcbiAgICB0aGlzLnJlZ2lzdGVyID0gdGhpcy5yZWdpc3Rlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVtb3ZlTWlkZGxld2FyZSA9IHRoaXMucmVtb3ZlTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVtb3ZlU3RvcmVzID0gdGhpcy5yZW1vdmVTdG9yZXMuYmluZCh0aGlzKTtcbiAgICB0aGlzLnJlc2V0ID0gdGhpcy5yZXNldC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuc2V0U3RhdGUgPSB0aGlzLnNldFN0YXRlLmJpbmQodGhpcyk7XG5cbiAgICAvLyBBZGQgbWlkZGxld2FyZSBwbHVnaW4gdHlwZXNcbiAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4gdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBtaWRkbGV3YXJlIHRvIGZyYW1ld29yay5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gbWlkZGxld2FyZSBBbiBhcnJheSBvZiBtaWRkbGV3YXJlIHRvIGFkZCB0byB0aGUgZnJhbWV3b3JrLlxuICAgKi9cbiAgYWRkTWlkZGxld2FyZShtaWRkbGV3YXJlOiBGbHV4TWlkZGxld2FyZVR5cGVbXSk6IHZvaWQge1xuICAgIG1pZGRsZXdhcmUuZm9yRWFjaCgobWlkZGxlT2JqOiBGbHV4TWlkZGxld2FyZVR5cGUpID0+IHtcbiAgICAgIC8vIE1ha2Ugc3VyZSBtaWRkbGV3YXJlIGlzIGVpdGhlciBhIGNsYXNzIG9yIG9iamVjdC5cbiAgICAgIGlmKCEhbWlkZGxlT2JqICYmICgodHlwZW9mIG1pZGRsZU9iaiA9PT0gJ2Z1bmN0aW9uJykgfHwgKHR5cGVvZiBtaWRkbGVPYmogPT09ICdvYmplY3QnKSkpIHtcbiAgICAgICAgY29uc3QgbWlkZGxlTmFtZTogc3RyaW5nID0gbWlkZGxlT2JqLm5hbWUgfHwgJyc7XG5cbiAgICAgICAgaWYoIW1pZGRsZU5hbWUpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBSZXF1aXJlcyBuYW1lIHByb3BlcnR5LiBDYW5ub3QgYWRkIHRvIEZsdXguJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3J0IG1pZGRsZXdhcmUgcGx1Z2lucyBmb3IgZWZmaWNpZW5jeVxuICAgICAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IG1pZGRsZU9ialt0eXBlXTtcbiAgICAgICAgICBjb25zdCBwbHVnaW46IEZsdXhQbHVnaW5UeXBlID0ge21ldGhvZCwgbmFtZTogbWlkZGxlTmFtZX07XG4gICAgICAgICAgdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gdGhpcy5hZGRQbHVnaW4odHlwZSwgcGx1Z2luKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBDYW5ub3QgYWRkIHRvIEZsdXguJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBhcHAgZGF0YSBmcm9tIHN0b3JhZ2UuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIGFwcCBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICovXG4gIGNsZWFyQXBwRGF0YSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBTZXQgYWxsIHN0b3JlIGRhdGEgdG8gaW5pdGlhbCBzdGF0ZVxuICAgIE9iamVjdFxuICAgICAgLmtleXModGhpcy5zdG9yZUFjdGlvbnMpXG4gICAgICAuZm9yRWFjaCgoc3RvcmVOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgc3RvcmVGbiA9IHRoaXMuc3RvcmVBY3Rpb25zW3N0b3JlTmFtZV07XG4gICAgICAgIHRoaXMuc3RhdGVbc3RvcmVGbi5uYW1lXSA9IGNsb25lRGVlcChzdG9yZUZuLmluaXRpYWxTdGF0ZSk7XG4gICAgICB9KTtcblxuICAgIGNvbnN0IHtuYW1lLCBzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHJldHVybiBzdG9yYWdlLnNldFN0b3JhZ2VEYXRhKG5hbWUsIHRoaXMuc3RhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBtaWRkbGV3YXJlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBtaWRkbGV3YXJlIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICovXG4gIGNsZWFyTWlkZGxld2FyZSgpOiBib29sZWFuIHtcbiAgICAvLyBTZXQgYWxsIHN0b3JlIGRhdGEgdG8gaW5pdGlhbCBzdGF0ZVxuICAgIE9iamVjdFxuICAgICAgLmtleXModGhpcy5taWRkbGV3YXJlKVxuICAgICAgLmZvckVhY2goKHBsdWdpblR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm1pZGRsZXdhcmVbcGx1Z2luVHlwZV0gPSBbXTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRGUtcmVnaXN0ZXJzIG5hbWVkIHN0b3Jlcy5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gc3RvcmVOYW1lcyBBbiBhcnJheSBvZiBzdG9yZSBuYW1lcyB0byByZW1vdmUgZnJvbSB0aGUgZnJhbWV3b3JrLlxuICAgKi9cbiAgcmVtb3ZlU3RvcmVzKHN0b3JlTmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgc3RvcmVOYW1lcy5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHRoaXMuZGVyZWdpc3RlcihuYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhbiBhY3Rpb24gdG8gYWxsIHN0b3Jlcy5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGFjdGlvbiB0byBkaXNwYXRjaCB0byBhbGwgdGhlIHN0b3Jlcy5cbiAgICogQHBhcmFtIHtib29sZWFufSBzaWxlbnQgVG8gc2lsZW5jZSBhbnkgZXZlbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgd2hlbiBhbmQgaWYgdGhlIGFwcCBzYXZlcyBkYXRhIHRvIHN0b3JhZ2UsIHJldHVybmluZ1xuICAgKiB0aGUgYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgZGlzcGF0Y2goYWN0aW9uOiBGbHV4QWN0aW9uLCBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Rmx1eEFjdGlvbj4ge1xuICAgIGlmKCFhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJraGFtSlMgRXJyb3I6IEZsdXguZGlzcGF0Y2ggcmVxdWlyZXMgYW4gYWN0aW9uLicpO1xuICAgIH1cblxuICAgIGxldCBjbG9uZWRBY3Rpb246IEZsdXhBY3Rpb24gPSBjbG9uZURlZXAoYWN0aW9uKTtcblxuICAgIC8vIExvZyBkdXJhdGlvbiBvZiBkaXNwYXRjaFxuICAgIGNvbnN0IHN0YXJ0VGltZTogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICAgIC8vIEdldCBzdGFja1xuICAgIGxldCBzdGFjayA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YWNrUHJvcGVydHk6IHN0cmluZyA9ICdzdGFja1RyYWNlTGltaXQnO1xuICAgICAgY29uc3Qge3N0YWNrVHJhY2VMaW1pdH06IGFueSA9IEVycm9yO1xuICAgICAgRXJyb3Jbc3RhY2tQcm9wZXJ0eV0gPSBJbmZpbml0eTtcbiAgICAgIHN0YWNrID0gRXJyb3JTdGFja1BhcnNlci5wYXJzZShuZXcgRXJyb3IoKSk7XG4gICAgICBFcnJvcltzdGFja1Byb3BlcnR5XSA9IHN0YWNrVHJhY2VMaW1pdDtcbiAgICB9IGNhdGNoKGVycm9yKSB7fVxuXG4gICAgLy8gR2V0IG9wdGlvbnNcbiAgICBjb25zdCBvcHRpb25zID0gY2xvbmVEZWVwKHRoaXMub3B0aW9ucyk7XG5cbiAgICAvLyBBcHAgaW5mb1xuICAgIGNvbnN0IGFwcEluZm8gPSB7ZHVyYXRpb246IDAsIG9wdGlvbnMsIHN0YWNrfTtcblxuICAgIC8vIEFwcGx5IG1pZGRsZXdhcmUgYmVmb3JlIHRoZSBhY3Rpb24gaXMgcHJvY2Vzc2VkXG4gICAgY29uc3Qge3Bvc3REaXNwYXRjaExpc3QgPSBbXSwgcHJlRGlzcGF0Y2hMaXN0ID0gW119ID0gdGhpcy5taWRkbGV3YXJlO1xuXG4gICAgaWYocHJlRGlzcGF0Y2hMaXN0Lmxlbmd0aCkge1xuICAgICAgY2xvbmVkQWN0aW9uID0gYXdhaXQgUHJvbWlzZVxuICAgICAgICAuYWxsKFxuICAgICAgICAgIHByZURpc3BhdGNoTGlzdC5tYXAoKHBsdWdpbjogRmx1eFBsdWdpblR5cGUpID0+IHBsdWdpbi5tZXRob2QoXG4gICAgICAgICAgICBjbG9uZURlZXAoY2xvbmVkQWN0aW9uKSwgY2xvbmVEZWVwKHRoaXMuc3RhdGUpLCBhcHBJbmZvKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAudGhlbihcbiAgICAgICAgICAoYWN0aW9ucykgPT4gYWN0aW9ucy5yZWR1Y2UoKHVwZGF0ZWRBY3Rpb24sIGFjdGlvbikgPT5cbiAgICAgICAgICAgIG1lcmdlKHVwZGF0ZWRBY3Rpb24sIGFjdGlvbiksIGNsb25lZEFjdGlvbikgYXMgRmx1eEFjdGlvblxuICAgICAgICApXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qge3R5cGUsIC4uLmRhdGF9ID0gY2xvbmVkQWN0aW9uO1xuXG4gICAgLy8gUmVxdWlyZSBhIHR5cGVcbiAgICBpZighdHlwZSB8fCB0eXBlID09PSAnJykge1xuICAgICAgY29uc29sZS53YXJuKCdBcmtoYW1KUyBXYXJuaW5nOiBGbHV4LmRpc3BhdGNoIGlzIG1pc3NpbmcgYW4gYWN0aW9uIHR5cGUgZm9yIHRoZSBwYXlsb2FkOicsIGRhdGEpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjbG9uZWRBY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIFdoZW4gYW4gYWN0aW9uIGNvbWVzIGluLCBpdCBtdXN0IGJlIGNvbXBsZXRlbHkgaGFuZGxlZCBieSBhbGwgc3RvcmVzXG4gICAgT2JqZWN0XG4gICAgICAua2V5cyh0aGlzLnN0b3JlQWN0aW9ucylcbiAgICAgIC5mb3JFYWNoKChzdG9yZU5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBzdG9yZUZuID0gdGhpcy5zdG9yZUFjdGlvbnNbc3RvcmVOYW1lXTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBjbG9uZURlZXAodGhpcy5zdGF0ZVtzdG9yZU5hbWVdKSB8fCBjbG9uZURlZXAoc3RvcmVGbi5pbml0aWFsU3RhdGUpIHx8IHt9O1xuICAgICAgICB0aGlzLnN0YXRlW3N0b3JlTmFtZV0gPSBjbG9uZURlZXAoc3RvcmVGbi5hY3Rpb24odHlwZSwgZGF0YSwgc3RhdGUpKSB8fCBzdGF0ZTtcbiAgICAgIH0pO1xuXG4gICAgLy8gU2F2ZSBjYWNoZSBpbiBzdG9yYWdlXG4gICAgY29uc3Qge3N0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYoc3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdG9yYWdlKCk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7fVxuICAgIH1cblxuICAgIGNvbnN0IGVuZFRpbWU6IG51bWJlciA9ICsobmV3IERhdGUoKSk7XG4gICAgY29uc3QgZHVyYXRpb246IG51bWJlciA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gICAgYXBwSW5mby5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuXG4gICAgaWYocG9zdERpc3BhdGNoTGlzdC5sZW5ndGgpIHtcbiAgICAgIGNsb25lZEFjdGlvbiA9IGF3YWl0IFByb21pc2VcbiAgICAgICAgLmFsbChcbiAgICAgICAgICBwb3N0RGlzcGF0Y2hMaXN0Lm1hcChcbiAgICAgICAgICAgIGFzeW5jIChwbHVnaW46IEZsdXhQbHVnaW5UeXBlKSA9PiBwbHVnaW4ubWV0aG9kKGNsb25lRGVlcChjbG9uZWRBY3Rpb24pLCBjbG9uZURlZXAodGhpcy5zdGF0ZSksIGFwcEluZm8pXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIC50aGVuKFxuICAgICAgICAgIChhY3Rpb25zKSA9PiBhY3Rpb25zLnJlZHVjZSgodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSA9PlxuICAgICAgICAgICAgbWVyZ2UodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSwgY2xvbmVkQWN0aW9uKSBhcyBGbHV4QWN0aW9uXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZighc2lsZW50KSB7XG4gICAgICB0aGlzLmVtaXQodHlwZSwgY2xvbmVkQWN0aW9uKTtcbiAgICAgIHRoaXMuZW1pdCgnYXJraGFtanMnLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNsb25lZEFjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IEZsdXggb3B0aW9ucy5cbiAgICpcbiAgICogQHJldHVybnMge0ZsdXhPcHRpb25zfSB0aGUgRmx1eCBvcHRpb25zIG9iamVjdC5cbiAgICovXG4gIGdldE9wdGlvbnMoKTogRmx1eE9wdGlvbnMge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8YXJyYXl9IFtuYW1lXSAob3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBzdG9yZSBmb3IgYW4gb2JqZWN0LCBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gYWxsIHN0b3JlXG4gICAqICAgb2JqZWN0cy4gWW91IGNhbiBhbHNvIHVzZSBhbiBhcnJheSB0byBzcGVjaWZ5IGEgcHJvcGVydHkgcGF0aCB3aXRoaW4gdGhlIG9iamVjdC5cbiAgICogQHBhcmFtIHthbnl9IFtkZWZhdWx0VmFsdWVdIChvcHRpb25hbCkgQSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiBudWxsLlxuICAgKiBAcmV0dXJucyB7YW55fSB0aGUgc3RhdGUgb2JqZWN0IG9yIGEgcHJvcGVydHkgdmFsdWUgd2l0aGluLlxuICAgKi9cbiAgZ2V0U3RhdGUocGF0aDogc3RyaW5nIHwgc3RyaW5nW10gPSAnJywgZGVmYXVsdFZhbHVlPyk6IGFueSB7XG4gICAgbGV0IHN0b3JlVmFsdWU7XG5cbiAgICBpZighcGF0aCkge1xuICAgICAgc3RvcmVWYWx1ZSA9IHRoaXMuc3RhdGUgfHwge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0b3JlVmFsdWUgPSBnZXQocGF0aCwgdGhpcy5zdGF0ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBzdG9yZVZhbHVlID8gY2xvbmVEZWVwKHN0b3JlVmFsdWUpIDogc3RvcmVWYWx1ZTtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0b3JlIG9iamVjdCByZWdpc3RlcmVkIHdpdGggRmx1eC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN0b3JlLlxuICAgKiBAcmV0dXJucyB7Rmx1eFN0b3JlfSB0aGUgc3RvcmUgb2JqZWN0LlxuICAgKi9cbiAgZ2V0U3RvcmUobmFtZTogc3RyaW5nID0gJycpOiBGbHV4U3RvcmUge1xuICAgIHJldHVybiB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGFuZCBzZXQgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqL1xuICBhc3luYyBpbml0KG9wdGlvbnM6IEZsdXhPcHRpb25zID0ge30sIHJlc2V0OiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPEZsdXhGcmFtZXdvcms+IHtcbiAgICAvLyBTaG91bGQgcmVzZXQgcHJldmlvdXMgcGFyYW1zXG4gICAgaWYocmVzZXQpIHtcbiAgICAgIHRoaXMuaXNJbml0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgb3B0aW9uc1xuICAgIGNvbnN0IHVwZGF0ZWRPcHRpb25zID0gey4uLm9wdGlvbnN9O1xuXG4gICAgaWYodGhpcy5pc0luaXQpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgbmFtZSBmcm9tIG9wdGlvbnMgaWYgYWxyZWFkeSBpbml0aWFsaXplZCwgb3RoZXJ3aXNlIHRoZSByb290IGFwcCB3aWxsIG5vdCBiZSBhYmxlIHRvIGFjY2Vzc1xuICAgICAgLy8gdGhlIHN0YXRlIHRyZWVcbiAgICAgIHVwZGF0ZWRPcHRpb25zLm5hbWUgPSB0aGlzLm9wdGlvbnMubmFtZTtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB7Li4udGhpcy5kZWZhdWx0T3B0aW9ucywgLi4udXBkYXRlZE9wdGlvbnN9O1xuICAgIGNvbnN0IHtkZWJ1ZywgbWlkZGxld2FyZSwgbmFtZSwgc3RvcmVzfSA9IHRoaXMub3B0aW9ucztcblxuICAgIC8vIFVwZGF0ZSBkZWZhdWx0IHN0b3JlXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudXNlU3RvcmFnZShuYW1lKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdBcmtoYW0gRXJyb3I6IFRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSB1c2luZyBzdG9yYWdlLicsIG5hbWUpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYoISFzdG9yZXMgJiYgc3RvcmVzLmxlbmd0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRTdG9yZXMoc3RvcmVzKTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQXJraGFtIEVycm9yOiBUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgYWRkaW5nIHN0b3Jlcy4nLCBzdG9yZXMpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZighIW1pZGRsZXdhcmUgJiYgbWlkZGxld2FyZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuYWRkTWlkZGxld2FyZShtaWRkbGV3YXJlKTtcbiAgICB9XG5cbiAgICBjb25zdCB3aW5kb3dQcm9wZXJ0eTogc3RyaW5nID0gJ2Fya2hhbWpzJztcblxuICAgIGlmKGRlYnVnKSB7XG4gICAgICB3aW5kb3dbd2luZG93UHJvcGVydHldID0gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHdpbmRvd1t3aW5kb3dQcm9wZXJ0eV07XG4gICAgfVxuXG4gICAgdGhpcy5pc0luaXQgPSB0cnVlO1xuICAgIHRoaXMuZW1pdChBcmtoYW1Db25zdGFudHMuSU5JVCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGluaXRpYWxpemF0aW9uIGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbbGlzdGVuZXJdIFRoZSBjYWxsYmFjayBhc3NvY2lhdGVkIHdpdGggdGhlIHN1YnNjcmliZWQgZXZlbnQuXG4gICAqL1xuICBvbkluaXQobGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub24oQXJraGFtQ29uc3RhbnRzLklOSVQsIGxpc3RlbmVyKTtcblxuICAgIGlmKHRoaXMuaXNJbml0KSB7XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBpbml0aWFsaXphdGlvbiBsaXN0ZW5lci5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2xpc3RlbmVyXSBUaGUgY2FsbGJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJzY3JpYmVkIGV2ZW50LlxuICAgKi9cbiAgb2ZmSW5pdChsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vZmYoQXJraGFtQ29uc3RhbnRzLklOSVQsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V2ZW50VHlwZV0gRXZlbnQgdG8gdW5zdWJzY3JpYmUuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtsaXN0ZW5lcl0gVGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Vic2NyaWJlZCBldmVudC5cbiAgICovXG4gIG9mZihldmVudFR5cGU6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXZlbnRUeXBlXSBFdmVudCB0byBzdWJzY3JpYmUuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtsaXN0ZW5lcl0gVGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Vic2NyaWJlZCBldmVudC5cbiAgICovXG4gIG9uKGV2ZW50VHlwZTogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIG5ldyBTdG9yZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IHN0b3JlcyBTdG9yZSBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0W10+fSB0aGUgY2xhc3Mgb2JqZWN0KHMpLlxuICAgKi9cbiAgYXN5bmMgYWRkU3RvcmVzKHN0b3JlczogYW55W10pOiBQcm9taXNlPG9iamVjdFtdPiB7XG4gICAgY29uc3QgcmVnaXN0ZXJlZFN0b3JlczogRmx1eFN0b3JlW10gPSBzdG9yZXMubWFwKChzdG9yZTogRmx1eFN0b3JlKSA9PiB0aGlzLnJlZ2lzdGVyKHN0b3JlKSk7XG5cbiAgICAvLyBTYXZlIGNhY2hlIGluIHNlc3Npb24gc3RvcmFnZVxuICAgIGNvbnN0IHtuYW1lLCBzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSwgdGhpcy5zdGF0ZSk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBjbGFzc2VzXG4gICAgcmV0dXJuIHJlZ2lzdGVyZWRTdG9yZXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIG1pZGRsZXdhcmUgZnJvbSBmcmFtZXdvcmsuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IHN0cmluZyBtaWRkbGV3YXJlIG5hbWVzIHRvIHJlbW92ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0W10+fSB0aGUgY2xhc3Mgb2JqZWN0KHMpLlxuICAgKi9cbiAgcmVtb3ZlTWlkZGxld2FyZShuYW1lczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBuYW1lcy5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIFJlbW92ZSBtaWRkbGV3YXJlIHBsdWdpbnNcbiAgICAgIHRoaXMucGx1Z2luVHlwZXMuZm9yRWFjaCgodHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubWlkZGxld2FyZVtgJHt0eXBlfUxpc3RgXSA9IHRoaXMucmVtb3ZlUGx1Z2luKHR5cGUsIG5hbWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgZnJhbWV3b3JrLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5fSBzdHJpbmcgbWlkZGxld2FyZSBuYW1lcyB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdFtdPn0gdGhlIGNsYXNzIG9iamVjdChzKS5cbiAgICovXG4gIGFzeW5jIHJlc2V0KGNsZWFyU3RvcmFnZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7bmFtZSwgc3RvcmFnZX0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAvLyBDbGVhciBwZXJzaXN0ZW50IGNhY2hlXG4gICAgaWYoc3RvcmFnZSAmJiBjbGVhclN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSwge30pO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhciBhbGwgcHJvcGVydGllc1xuICAgIHRoaXMubWlkZGxld2FyZSA9IHt9O1xuICAgIHRoaXMub3B0aW9ucyA9IHsuLi50aGlzLmRlZmF1bHRPcHRpb25zfTtcbiAgICB0aGlzLnN0YXRlID0ge307XG4gICAgdGhpcy5zdG9yZUFjdGlvbnMgPSB7fTtcbiAgICB0aGlzLmlzSW5pdCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgc3RhdGUgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gW25hbWVdIFRoZSBuYW1lIG9mIHRoZSBzdG9yZSB0byBzZXQuIFlvdSBjYW4gYWxzbyB1c2UgYW4gYXJyYXkgdG8gc3BlY2lmeSBhIHByb3BlcnR5IHBhdGhcbiAgICogd2l0aGluIHRoZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7YW55fSBbdmFsdWVdIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAqL1xuICBzZXRTdGF0ZShwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnLCB2YWx1ZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmKCEhcGF0aCkge1xuICAgICAgdGhpcy5zdGF0ZSA9IHNldChwYXRoLCBjbG9uZURlZXAodmFsdWUpLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgcGVyc2lzdGVudCBjYWNoZVxuICAgIGNvbnN0IHtzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVN0b3JhZ2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUGx1Z2luKHR5cGU6IHN0cmluZywgcGx1Z2luOiBGbHV4UGx1Z2luVHlwZSk6IEZsdXhQbHVnaW5UeXBlW10ge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gfHwgW107XG4gICAgY29uc3Qge21ldGhvZCwgbmFtZX0gPSBwbHVnaW47XG5cbiAgICBpZihtZXRob2QgJiYgdHlwZW9mIG1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQ2hlY2sgaWYgcGx1Z2luIGFscmVhZHkgZXhpc3RzXG4gICAgICBjb25zdCBleGlzdHM6IGJvb2xlYW4gPSAhIWxpc3QuZmlsdGVyKChvYmo6IEZsdXhQbHVnaW5UeXBlKSA9PiBvYmoubmFtZSA9PT0gbmFtZSkubGVuZ3RoO1xuXG4gICAgICAvLyBEbyBub3QgYWRkIGR1cGxpY2F0ZSBwbHVnaW5zXG4gICAgICBpZighZXhpc3RzKSB7XG4gICAgICAgIGxpc3QucHVzaCh7bWV0aG9kLCBuYW1lfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcihgJHtwbHVnaW4ubmFtZX0gbWlkZGxld2FyZSBpcyBub3QgY29uZmlndXJlZCBwcm9wZXJseS4gTWV0aG9kIGlzIG5vdCBhIGZ1bmN0aW9uLmApO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBkZXJlZ2lzdGVyKG5hbWU6IHN0cmluZyA9ICcnKTogdm9pZCB7XG4gICAgZGVsZXRlIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdO1xuICAgIGRlbGV0ZSB0aGlzLnN0YXRlW25hbWVdO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlcihzdG9yZUZuKTogRmx1eFN0b3JlIHtcbiAgICBpZighc3RvcmVGbikge1xuICAgICAgdGhyb3cgRXJyb3IoJ1N0b3JlIGlzIHVuZGVmaW5lZC4gQ2Fubm90IHJlZ2lzdGVyIHdpdGggRmx1eC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0ZuYzogYm9vbGVhbiA9IHR5cGVvZiBzdG9yZUZuID09PSAnZnVuY3Rpb24nO1xuXG4gICAgaWYoIWlzRm5jKSB7XG4gICAgICB0aHJvdyBFcnJvcihgJHtzdG9yZUZufSBpcyBub3QgYSBzdG9yZSBmdW5jdGlvbi4gQ2Fubm90IHJlZ2lzdGVyIHdpdGggRmx1eC5gKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgc3RvcmUgb2JqZWN0XG4gICAgY29uc3Qge25hbWV9ID0gc3RvcmVGbjtcbiAgICBjb25zdCBpbml0aWFsU3RhdGU6IGFueSA9IHN0b3JlRm4oKTtcbiAgICBjb25zdCBzdG9yZUFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogc3RvcmVGbixcbiAgICAgIGluaXRpYWxTdGF0ZTogc3RvcmVGbigpLFxuICAgICAgbmFtZVxuICAgIH07XG5cbiAgICBpZighaXNFbXB0eShuYW1lKSAmJiAhdGhpcy5zdG9yZUFjdGlvbnNbbmFtZV0pIHtcbiAgICAgIC8vIFNhdmUgc3RvcmUgb2JqZWN0XG4gICAgICB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXSA9IHN0b3JlQWN0aW9uO1xuXG4gICAgICAvLyBHZXQgZGVmYXVsdCB2YWx1ZXNcbiAgICAgIGlmKCF0aGlzLnN0YXRlW25hbWVdKSB7XG4gICAgICAgIGlmKGluaXRpYWxTdGF0ZSkge1xuICAgICAgICAgIHRoaXMuc3RhdGVbbmFtZV0gPSBjbG9uZURlZXAoaW5pdGlhbFN0YXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0YXRlW25hbWVdID0ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gc3RvcmUgY2xhc3NcbiAgICByZXR1cm4gdGhpcy5zdG9yZUFjdGlvbnNbbmFtZV07XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVBsdWdpbih0eXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IEZsdXhQbHVnaW5UeXBlW10ge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gfHwgW107XG5cbiAgICAvLyByZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBwbHVnaW5cbiAgICByZXR1cm4gbGlzdC5maWx0ZXIoKG9iajogRmx1eFBsdWdpblR5cGUpID0+IG9iai5uYW1lICE9PSBuYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RvcmFnZSA9ICgpID0+IFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG5cbiAgcHJpdmF0ZSBhc3luYyB1c2VTdG9yYWdlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtzdG9yYWdlLCBzdGF0ZSwgc3RvcmFnZVdhaXR9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgLy8gQ2FjaGVcbiAgICBpZihzdG9yYWdlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGUgfHwgYXdhaXQgc3RvcmFnZS5nZXRTdG9yYWdlRGF0YShuYW1lKSB8fCB7fTtcbiAgICAgICAgdGhpcy51cGRhdGVTdG9yYWdlID0gZGVib3VuY2UoXG4gICAgICAgICAgKCkgPT4gc3RvcmFnZS5zZXRTdG9yYWdlRGF0YShuYW1lLCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICBzdG9yYWdlV2FpdCxcbiAgICAgICAgICB7bGVhZGluZzogdHJ1ZSwgdHJhaWxpbmc6IHRydWV9XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEFya2hhbUpTIEVycm9yOiBVc2luZyBzdG9yYWdlLCBcIiR7bmFtZX1cIi5gKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZSB8fCB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgRmx1eDogRmx1eEZyYW1ld29yayA9IG5ldyBGbHV4RnJhbWV3b3JrKCk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7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