@decohere/flux 0.0.1-dev.8 → 0.0.1-dev.80

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.
Files changed (51) hide show
  1. package/commonjs/src/deferred-script-runner.js +58 -0
  2. package/commonjs/src/flux.command.js +29 -0
  3. package/commonjs/src/flux.module.js +38 -0
  4. package/commonjs/src/hot-reload-server.js +293 -160
  5. package/commonjs/src/index.js +33 -32
  6. package/commonjs/src/rewrite-serve-specifier.js +46 -0
  7. package/commonjs/src/run.action.js +71 -0
  8. package/commonjs/src/run.command.js +67 -0
  9. package/commonjs/src/serve.action.js +94 -10
  10. package/commonjs/src/serve.command.js +36 -4
  11. package/commonjs/src/slice-serve.js +132 -0
  12. package/commonjs/src/source-module-loader.js +216 -0
  13. package/es6/src/deferred-script-runner.js +48 -0
  14. package/es6/src/flux.command.js +19 -0
  15. package/es6/src/flux.module.js +28 -0
  16. package/es6/src/hot-reload-server.js +280 -117
  17. package/es6/src/index.js +6 -7
  18. package/es6/src/rewrite-serve-specifier.js +40 -0
  19. package/es6/src/run.action.js +58 -0
  20. package/es6/src/run.command.js +57 -0
  21. package/es6/src/serve.action.js +92 -10
  22. package/es6/src/serve.command.js +37 -5
  23. package/es6/src/slice-serve.js +107 -0
  24. package/es6/src/source-module-loader.js +160 -0
  25. package/package.json +8 -12
  26. package/types/src/deferred-script-runner.d.ts +18 -0
  27. package/types/src/{ember.command.d.ts → flux.command.d.ts} +1 -1
  28. package/types/src/flux.module.d.ts +16 -0
  29. package/types/src/hot-reload-server.d.ts +62 -22
  30. package/types/src/index.d.ts +8 -8
  31. package/types/src/rewrite-serve-specifier.d.ts +13 -0
  32. package/types/src/run.action.d.ts +17 -0
  33. package/types/src/run.command.d.ts +11 -0
  34. package/types/src/serve.action.d.ts +17 -2
  35. package/types/src/serve.command.d.ts +7 -2
  36. package/types/src/slice-serve.d.ts +52 -0
  37. package/types/src/source-module-loader.d.ts +49 -0
  38. package/commonjs/src/ember.command.js +0 -27
  39. package/commonjs/src/ember.module.js +0 -37
  40. package/commonjs/src/hot-module-hooks.js +0 -47
  41. package/commonjs/src/serve.js +0 -36
  42. package/commonjs/src/workspace-serve.action.js +0 -59
  43. package/es6/src/ember.command.js +0 -17
  44. package/es6/src/ember.module.js +0 -19
  45. package/es6/src/hot-module-hooks.js +0 -26
  46. package/es6/src/serve.js +0 -32
  47. package/es6/src/workspace-serve.action.js +0 -45
  48. package/types/src/ember.module.d.ts +0 -22
  49. package/types/src/hot-module-hooks.d.ts +0 -5
  50. package/types/src/serve.d.ts +0 -1
  51. package/types/src/workspace-serve.action.d.ts +0 -11
@@ -2,137 +2,316 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- Object.defineProperty(exports, "HotReloadServer", {
6
- enumerable: true,
7
- get: function() {
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get DEFAULT_REBOOT_DEBOUNCE_MS () {
13
+ return DEFAULT_REBOOT_DEBOUNCE_MS;
14
+ },
15
+ get HotReloadServer () {
8
16
  return HotReloadServer;
17
+ },
18
+ get resolveRebootDebounceMs () {
19
+ return resolveRebootDebounceMs;
9
20
  }
10
21
  });
11
22
  const _nodeevents = require("node:events");
12
23
  const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
13
24
  const _io = require("@decohere/nexus/io");
14
25
  const _system = require("@decohere/nexus/system");
15
- const _hotmodulehooks = require("./hot-module-hooks.js");
26
+ const _scribe = require("@decohere/scribe");
27
+ const _sourcemoduleloader = require("./source-module-loader.js");
16
28
  function _interop_require_default(obj) {
17
29
  return obj && obj.__esModule ? obj : {
18
30
  default: obj
19
31
  };
20
32
  }
21
- function _getRequireWildcardCache(nodeInterop) {
22
- if (typeof WeakMap !== "function") return null;
23
- var cacheBabelInterop = new WeakMap();
24
- var cacheNodeInterop = new WeakMap();
25
- return (_getRequireWildcardCache = function(nodeInterop) {
26
- return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
27
- })(nodeInterop);
28
- }
29
- function _interop_require_wildcard(obj, nodeInterop) {
30
- if (!nodeInterop && obj && obj.__esModule) {
31
- return obj;
32
- }
33
- if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
34
- return {
35
- default: obj
36
- };
37
- }
38
- var cache = _getRequireWildcardCache(nodeInterop);
39
- if (cache && cache.has(obj)) {
40
- return cache.get(obj);
41
- }
42
- var newObj = {
43
- __proto__: null
44
- };
45
- var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
46
- for(var key in obj){
47
- if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
48
- var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
49
- if (desc && (desc.get || desc.set)) {
50
- Object.defineProperty(newObj, key, desc);
51
- } else {
52
- newObj[key] = obj[key];
53
- }
54
- }
55
- }
56
- newObj.default = obj;
57
- if (cache) {
58
- cache.set(obj, newObj);
33
+ const currentFilePath = _io.io.fileUrlToPath(require("url").pathToFileURL(__filename).toString());
34
+ const VERSION_URL_PARAM = "version";
35
+ const DEFAULT_REBOOT_DEBOUNCE_MS = 250;
36
+ function resolveRebootDebounceMs(value) {
37
+ const delay = value ?? DEFAULT_REBOOT_DEBOUNCE_MS;
38
+ if (!Number.isFinite(delay) || delay < 0) {
39
+ throw new Error(`rebootDebounceMs must be a non-negative number, got ${String(value)}`);
59
40
  }
60
- return newObj;
41
+ return delay;
61
42
  }
62
- const currentFilePath = _io.io.fileUrlToPath(require("url").pathToFileURL(__filename).toString());
43
+ /** Process-wide: Node's ESM cache is process-global, including across HotReloadServer instances. */ let moduleVersionSeq = 0;
63
44
  class HotReloadServer extends _nodeevents.EventEmitter {
64
- logger;
45
+ // ── State ────────────────────────────────────────────────────────────────
46
+ logger = _scribe.scribe.logger(HotReloadServer.name);
47
+ loader = new _sourcemoduleloader.SourceModuleLoader();
65
48
  disposed = false;
66
- entryModule;
67
- entry;
68
- sourceFiles = [];
49
+ /** Absolute entry paths currently served (one or more Flux apps). */ entries = new Map();
50
+ pendingEntryReboots = new Set();
51
+ watchSubscription;
69
52
  moduleCache = new Map();
70
53
  dependencies = new Map();
71
- watchers = [];
72
- constructor(logger){
73
- super();
74
- this.logger = logger;
75
- }
76
- async start(entry, ...watchDirs) {
77
- this.entryModule = entry;
78
- this.sourceFiles = await this.getSourceFiles(watchDirs);
79
- this.configureModuleHooks();
54
+ rebootTail = Promise.resolve();
55
+ rebootDebounceGen = 0;
56
+ rebootInFlight = false;
57
+ rebootFollowUp = false;
58
+ rebootQueued = false;
59
+ /** Modules whose reverse-graph edges are pruned at reboot, not on schedule. */ pendingGraphPrune = new Set();
60
+ scheduleReboot = ()=>{};
61
+ // ── Public API ───────────────────────────────────────────────────────────
62
+ async start(options) {
63
+ this.disposed = false;
64
+ this.dependencies.clear();
65
+ this.moduleCache.clear();
66
+ this.entries.clear();
67
+ this.pendingEntryReboots.clear();
68
+ this.pendingGraphPrune.clear();
69
+ this.rebootTail = Promise.resolve();
70
+ this.rebootInFlight = false;
71
+ this.rebootFollowUp = false;
72
+ this.rebootQueued = false;
73
+ this.bindScheduleReboot(resolveRebootDebounceMs(options.rebootDebounceMs));
74
+ const { buildConfig } = options;
75
+ await this.loader.configure({
76
+ buildConfig,
77
+ workspace: options.workspace,
78
+ versionFileUrl: (fileUrl)=>this.getCachedOrNew(fileUrl),
79
+ onResolved: this.onPostResolve
80
+ });
81
+ const workspace = this.requireWorkspace();
82
+ const selected = this.resolveProjects(buildConfig, options);
83
+ for (const project of selected){
84
+ const entryPath = _nodepath.default.resolve(project.getSourceEntryPath());
85
+ this.entries.set(entryPath, {
86
+ path: entryPath
87
+ });
88
+ }
89
+ this.loader.registerHooks();
80
90
  this.invalidateAllSourceFiles();
81
- await this.watch(watchDirs);
82
- this.logger.trace("Serving", entry);
83
- this.logger.trace("Hot reload watching", watchDirs);
84
- await this.bootEntry();
91
+ await workspace.watch(buildConfig);
92
+ this.watchSubscription = workspace.projectFileChanged$.subscribe(this.onFileChange);
93
+ for (const entry of this.entries.values()){
94
+ this.logger.trace(`Serving ${entry.path}`);
95
+ }
96
+ await this.bootEntries([
97
+ ...this.entries.keys()
98
+ ]);
99
+ this.emit("start");
85
100
  }
86
101
  async dispose() {
87
102
  if (this.disposed) return;
88
103
  this.disposed = true;
89
- (0, _hotmodulehooks.removeResolverHook)(this.onResolve);
90
- for (const watcher of this.watchers){
91
- watcher.close();
104
+ this.rebootDebounceGen += 1;
105
+ this.watchSubscription?.unsubscribe();
106
+ await this.rebootTail;
107
+ await this.disposeEntries([
108
+ ...this.entries.keys()
109
+ ]);
110
+ this.loader.dispose();
111
+ }
112
+ async [Symbol.asyncDispose]() {
113
+ await this.dispose();
114
+ }
115
+ // ── Lifecycle ────────────────────────────────────────────────────────────
116
+ async bootEntries(entryPaths) {
117
+ await Promise.all(entryPaths.map((entryPath)=>this.bootEntry(entryPath)));
118
+ }
119
+ async bootEntry(entryPath) {
120
+ const state = this.entries.get(entryPath);
121
+ if (state == null) return;
122
+ try {
123
+ const mod = await this.loader.importEntry(entryPath);
124
+ state.module = mod?.default;
125
+ } catch (error) {
126
+ state.module = undefined;
127
+ this.logger.error("There was an error booting the entry point. Your application may not function as expected", error);
92
128
  }
93
- await this.disposeEntry();
94
129
  }
95
- removeSourceFiles(...sourceFiles) {
96
- this.sourceFiles = this.sourceFiles.filter((sourceFile)=>!sourceFiles.includes(sourceFile));
130
+ bindScheduleReboot(delayMs) {
131
+ const gen = ++this.rebootDebounceGen;
132
+ this.scheduleReboot = (0, _system.debounce)(async ()=>{
133
+ if (this.disposed || gen !== this.rebootDebounceGen) return;
134
+ this.requestReboot();
135
+ }, delayMs);
97
136
  }
98
- async getSourceFiles(dirs) {
99
- const patterns = dirs.map((dir)=>`${dir}/**/*.js`);
100
- const files = await _io.io.findFiles(patterns);
101
- return files.map((f)=>f.fullPath);
137
+ requestReboot() {
138
+ if (this.disposed) return;
139
+ if (this.rebootInFlight) {
140
+ this.rebootFollowUp = true;
141
+ return;
142
+ }
143
+ if (this.rebootQueued) return;
144
+ this.rebootQueued = true;
145
+ this.rebootTail = this.rebootTail.then(()=>this.runReboot(), ()=>this.runReboot());
146
+ }
147
+ async runReboot() {
148
+ this.rebootQueued = false;
149
+ if (this.disposed) return;
150
+ this.rebootInFlight = true;
151
+ try {
152
+ do {
153
+ this.rebootFollowUp = false;
154
+ if (this.disposed) return;
155
+ const toReboot = this.pendingEntryReboots.size > 0 ? [
156
+ ...this.pendingEntryReboots
157
+ ] : [
158
+ ...this.entries.keys()
159
+ ];
160
+ this.pendingEntryReboots.clear();
161
+ // Drop reverse edges only when rebooting so later saves in the debounce
162
+ // window can still walk the graph and reset the quiet timer.
163
+ this.prunePendingDependencyEdges();
164
+ this.logger.trace(`Rebooting ${toReboot.length} entry module(s)`);
165
+ await this.disposeEntries(toReboot);
166
+ await this.bootEntries(toReboot);
167
+ this.emit("reboot");
168
+ }while (this.rebootFollowUp && !this.disposed)
169
+ } finally{
170
+ const needsFollowUp = this.rebootFollowUp && !this.disposed;
171
+ this.rebootFollowUp = false;
172
+ this.rebootInFlight = false;
173
+ if (needsFollowUp) this.requestReboot();
174
+ }
175
+ }
176
+ async disposeEntries(entryPaths) {
177
+ await Promise.all(entryPaths.map((entryPath)=>this.disposeEntry(entryPath)));
102
178
  }
103
- configureModuleHooks() {
104
- (0, _hotmodulehooks.initModuleHooks)();
105
- (0, _hotmodulehooks.addResolverHook)(this.onResolve);
179
+ async disposeEntry(entryPath) {
180
+ const paths = entryPath != null ? [
181
+ entryPath
182
+ ] : [
183
+ ...this.entries.keys()
184
+ ];
185
+ for (const p of paths){
186
+ const state = this.entries.get(p);
187
+ if (state == null) continue;
188
+ const entry = state.module;
189
+ state.module = undefined;
190
+ try {
191
+ await entry?.[Symbol.asyncDispose]();
192
+ } catch (error) {
193
+ this.logger.error("Entry asyncDispose failed", error);
194
+ }
195
+ }
106
196
  }
107
- onResolve = (result, parentUrl)=>{
197
+ // ── Setup ────────────────────────────────────────────────────────────────
198
+ requireWorkspace() {
199
+ const workspace = this.loader.getWorkspace();
200
+ if (workspace == null) {
201
+ throw new Error("SourceModuleLoader has no workspace after configure");
202
+ }
203
+ return workspace;
204
+ }
205
+ resolveProjects(buildConfig, options) {
206
+ const projects = this.loader.getWorkspace()?.getProjects(buildConfig) ?? [];
207
+ const names = options.projects != null && options.projects.length > 0 ? options.projects : options.project != null ? [
208
+ options.project
209
+ ] : undefined;
210
+ if (names == null) {
211
+ const first = projects.at(0);
212
+ if (first == null) {
213
+ throw new Error(`No projects found for configuration: ${buildConfig}`);
214
+ }
215
+ return [
216
+ first
217
+ ];
218
+ }
219
+ const selected = [];
220
+ for (const name of names){
221
+ const found = projects.find((p)=>p.name === name);
222
+ if (found == null) {
223
+ throw new Error(`Project "${name}" not found in workspace`);
224
+ }
225
+ selected.push(found);
226
+ }
227
+ return selected;
228
+ }
229
+ /**
230
+ * Post-next dependency tracker: records which source files import which
231
+ * other source files so that reloadIfAffected can traverse the graph.
232
+ */ onPostResolve = (result, parentUrl)=>{
108
233
  const { url } = result;
109
234
  const parentUrlClean = parentUrl.split("?")[0];
110
- const isSource = this.isSourceModule(url);
111
- const parentIsSource = this.isSourceModule(parentUrlClean);
235
+ let filePath;
236
+ let parentPath;
237
+ try {
238
+ const urlObj = new URL(url);
239
+ urlObj.search = "";
240
+ filePath = _io.io.fileUrlToPath(urlObj.toString());
241
+ } catch {
242
+ return;
243
+ }
244
+ try {
245
+ parentPath = _io.io.fileUrlToPath(parentUrlClean);
246
+ } catch {
247
+ parentPath = "";
248
+ }
249
+ const isSource = this.loader.hasSourceFile(filePath);
250
+ const parentIsSource = this.loader.hasSourceFile(parentPath);
112
251
  if (isSource || parentIsSource) {
113
- this.trackDependency(url, parentUrl);
252
+ this.trackDependency(filePath, parentPath);
114
253
  }
115
- if (!isSource) {
254
+ };
255
+ // ── File watching ────────────────────────────────────────────────────────
256
+ onFileChange = (evt)=>{
257
+ const { file, eventName, project } = evt;
258
+ const fullPath = file.fullPath;
259
+ this.logger.trace(`File ${eventName}: ${fullPath}`);
260
+ if (eventName === _io.io.WatchEvents.unlink) {
261
+ this.loader.invalidateTranspile(fullPath);
262
+ this.moduleCache.set(fullPath, null);
116
263
  return;
117
264
  }
118
- result.url = this.getCachedOrNew(url);
265
+ if (eventName === _io.io.WatchEvents.add) {
266
+ if (project.isSourceFile(file)) {
267
+ this.loader.setSourceFile(fullPath, project);
268
+ this.moduleCache.set(fullPath, null);
269
+ this.reloadIfAffected(fullPath);
270
+ }
271
+ return;
272
+ }
273
+ // change
274
+ if (!project.isSourceFile(file)) return;
275
+ this.loader.invalidateTranspile(fullPath);
276
+ this.reloadIfAffected(fullPath);
119
277
  };
120
- isSourceModule(url) {
121
- const path = _io.io.fileUrlToPath(url);
122
- return this.sourceFiles.includes(path);
278
+ reloadIfAffected(fullPath) {
279
+ const deps = this.getDependencyGraph(fullPath);
280
+ const modules = [
281
+ ...new Set([
282
+ ...deps,
283
+ fullPath
284
+ ])
285
+ ];
286
+ const affectedEntries = [
287
+ ...this.entries.keys()
288
+ ].filter((entryPath)=>modules.includes(entryPath));
289
+ if (affectedEntries.length === 0) {
290
+ this.logger.trace(`Change in ${fullPath} does not affect entry — skipping reload`);
291
+ return false;
292
+ }
293
+ this.logger.trace(`Change in ${fullPath} affects ${modules.length} module(s) — scheduling reload`);
294
+ this.invalidateModuleCaches(...modules);
295
+ for (const module of modules){
296
+ this.pendingGraphPrune.add(module);
297
+ }
298
+ for (const entryPath of affectedEntries){
299
+ this.pendingEntryReboots.add(entryPath);
300
+ }
301
+ this.scheduleReboot();
302
+ return true;
123
303
  }
304
+ // ── Dependency graph ─────────────────────────────────────────────────────
124
305
  getDependencyGraph(moduleId, parentModules = []) {
125
- if (this.isSelf(moduleId)) {
126
- return [];
127
- }
306
+ if (this.isSelf(moduleId)) return [];
128
307
  const moduleDeps = this.dependencies.get(moduleId) ?? [];
129
308
  if (parentModules.includes(moduleId)) {
130
309
  this.logger.error(`Circular reference detected: ${moduleId}`);
131
310
  return [];
132
311
  }
133
- let subDeps = Array.of();
312
+ let subDeps = [];
134
313
  for (const dep of moduleDeps){
135
- if (!this.sourceFiles.includes(dep)) continue;
314
+ if (!this.loader.hasSourceFile(dep)) continue;
136
315
  const subs = this.getDependencyGraph(dep, [
137
316
  moduleId,
138
317
  ...parentModules
@@ -149,9 +328,8 @@ class HotReloadServer extends _nodeevents.EventEmitter {
149
328
  ])
150
329
  ];
151
330
  }
152
- trackDependency(url, parentUrl) {
153
- const filePath = _io.io.fileUrlToPath(url);
154
- const parentPath = _io.io.fileUrlToPath(parentUrl.split("?")[0]);
331
+ trackDependency(filePath, parentPath) {
332
+ if (!parentPath) return;
155
333
  const deps = this.dependencies.get(filePath) ?? [];
156
334
  const updatedDeps = new Set([
157
335
  ...deps,
@@ -161,6 +339,7 @@ class HotReloadServer extends _nodeevents.EventEmitter {
161
339
  ...updatedDeps
162
340
  ]);
163
341
  }
342
+ // ── Module cache ─────────────────────────────────────────────────────────
164
343
  getCachedOrNew(moduleUrl) {
165
344
  const filePath = _io.io.fileUrlToPath(moduleUrl);
166
345
  const cached = this.moduleCache.get(filePath);
@@ -170,88 +349,42 @@ class HotReloadServer extends _nodeevents.EventEmitter {
170
349
  }
171
350
  versionModule(moduleUrl) {
172
351
  const versionedUrl = new URL(moduleUrl);
173
- versionedUrl.searchParams.set("version", Date.now().toString());
352
+ versionedUrl.searchParams.set(VERSION_URL_PARAM, String(++moduleVersionSeq));
174
353
  return versionedUrl.toString();
175
354
  }
176
- watch = async (dirs)=>{
177
- for (const dir of dirs){
178
- const watcher = _io.io.watch(dir, {
179
- include: [
180
- "**/*.js"
181
- ],
182
- ignoreInitial: true
183
- });
184
- watcher.on("add", this.onFileAdded).on("change", this.onSourceFileChanged).on("unlink", this.onFileDeleted);
185
- this.watchers.push(watcher);
186
- }
187
- };
188
- onFileAdded = async ({ fullPath })=>{
189
- this.sourceFiles.push(fullPath);
190
- this.moduleCache.set(fullPath, null);
191
- this.reloadIfAffected(fullPath);
192
- };
193
- onSourceFileChanged = async ({ fullPath })=>{
194
- if (!this.reloadIfAffected(fullPath)) {
195
- this.logger.trace(`${fullPath} is not part of the current dependency graph. Not reloading entry.`);
355
+ invalidateModuleCaches(...modules) {
356
+ for (const module of modules){
357
+ this.moduleCache.set(module, null);
358
+ this.loader.invalidateTranspile(module);
196
359
  }
197
- };
198
- onFileDeleted = async ({ fullPath })=>{
199
- this.removeSourceFiles(fullPath);
200
- };
201
- reloadIfAffected(fullPath) {
202
- const deps = this.getDependencyGraph(fullPath);
360
+ }
361
+ prunePendingDependencyEdges() {
203
362
  const modules = [
204
- ...new Set([
205
- ...deps,
206
- fullPath
207
- ])
363
+ ...this.pendingGraphPrune
208
364
  ];
209
- if (!modules.includes(this.entryModule)) {
210
- return false;
211
- }
212
- this.invlidateModule(...modules);
213
- this.disposeAndBoot();
214
- return true;
215
- }
216
- isSelf(urlLike) {
217
- return currentFilePath === _nodepath.default.resolve(_io.io.fileUrlToPath(urlLike));
365
+ this.pendingGraphPrune.clear();
366
+ this.pruneDependencyParents(...modules);
218
367
  }
219
- invlidateModule(...modules) {
368
+ /** Remove these modules as parents so boot can rebuild edges without stale importers. */ pruneDependencyParents(...modules) {
220
369
  for (const module of modules){
221
- this.moduleCache.set(module, null);
222
- }
223
- // Prune invalidated modules from all parent lists so stale relationships
224
- // are cleared. The fresh boot rebuilds only what is actually imported.
225
- for (const [child, parents] of this.dependencies){
226
- const pruned = parents.filter((p)=>!modules.includes(p));
227
- if (pruned.length === 0) {
228
- this.dependencies.delete(child);
229
- } else {
230
- this.dependencies.set(child, pruned);
370
+ for (const [key, parents] of this.dependencies){
371
+ const filtered = parents.filter((p)=>p !== module);
372
+ if (filtered.length === 0) {
373
+ this.dependencies.delete(key);
374
+ } else {
375
+ this.dependencies.set(key, filtered);
376
+ }
231
377
  }
232
378
  }
233
379
  }
234
380
  invalidateAllSourceFiles() {
235
- for (const file of this.sourceFiles){
236
- this.moduleCache.set(file, null);
381
+ for (const filePath of this.loader.sourceFilePaths()){
382
+ this.moduleCache.set(filePath, null);
237
383
  }
238
384
  }
239
- disposeAndBoot = (0, _system.debounce)(async ()=>{
240
- await this.disposeEntry();
241
- await this.bootEntry();
242
- }, 250);
243
- async disposeEntry() {
244
- await this.entry?.[Symbol.asyncDispose]();
245
- }
246
- async bootEntry() {
247
- try {
248
- const version = this.versionModule(_io.io.pathToFileUrl(this.entryModule));
249
- this.entry = (await Promise.resolve(version).then((p)=>/*#__PURE__*/ _interop_require_wildcard(require(p))))?.default;
250
- this.emit("reboot");
251
- } catch (error) {
252
- this.logger.error(`There was an error booting the entry point. Your application may not function as expected`, error);
253
- }
385
+ isSelf(filePath) {
386
+ return currentFilePath === _nodepath.default.resolve(filePath);
254
387
  }
255
388
  }
256
389
 
257
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRm5PdXRwdXQgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHR5cGUgRmlsZSwgaW8gfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2lvXCI7XG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvc3lzdGVtXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG5pbXBvcnQgeyBhZGRSZXNvbHZlckhvb2ssIGluaXRNb2R1bGVIb29rcywgcmVtb3ZlUmVzb2x2ZXJIb29rIH0gZnJvbSBcIi4vaG90LW1vZHVsZS1ob29rcy5qc1wiO1xuXG5jb25zdCBjdXJyZW50RmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyRXZlbnRzIHtcblx0cmVib290OiBbXTtcbn1cblxuZXhwb3J0IGNsYXNzIEhvdFJlbG9hZFNlcnZlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxIb3RSZWxvYWRTZXJ2ZXJFdmVudHM+IHtcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblx0cHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXHRwcml2YXRlIGVudHJ5TW9kdWxlOiBzdHJpbmc7XG5cdHByaXZhdGUgZW50cnk6IEFzeW5jRGlzcG9zYWJsZTtcblx0cHJpdmF0ZSBzb3VyY2VGaWxlczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSBtb2R1bGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCBudWxsPigpO1xuXHRwcml2YXRlIGRlcGVuZGVuY2llcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcblx0cHJpdmF0ZSB3YXRjaGVyczogUmV0dXJuVHlwZTx0eXBlb2YgaW8ud2F0Y2g+W10gPSBbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IobG9nZ2VyOiBMb2dnZXIpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIHN0YXJ0KGVudHJ5OiBzdHJpbmcsIC4uLndhdGNoRGlyczogc3RyaW5nW10pIHtcblx0XHR0aGlzLmVudHJ5TW9kdWxlID0gZW50cnk7XG5cdFx0dGhpcy5zb3VyY2VGaWxlcyA9IGF3YWl0IHRoaXMuZ2V0U291cmNlRmlsZXMod2F0Y2hEaXJzKTtcblx0XHR0aGlzLmNvbmZpZ3VyZU1vZHVsZUhvb2tzKCk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlQWxsU291cmNlRmlsZXMoKTtcblx0XHRhd2FpdCB0aGlzLndhdGNoKHdhdGNoRGlycyk7XG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoXCJTZXJ2aW5nXCIsIGVudHJ5KTtcblx0XHR0aGlzLmxvZ2dlci50cmFjZShcIkhvdCByZWxvYWQgd2F0Y2hpbmdcIiwgd2F0Y2hEaXJzKTtcblx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyeSgpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGRpc3Bvc2UoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcblx0XHRyZW1vdmVSZXNvbHZlckhvb2sodGhpcy5vblJlc29sdmUpO1xuXHRcdGZvciAoY29uc3Qgd2F0Y2hlciBvZiB0aGlzLndhdGNoZXJzKSB7XG5cdFx0XHR3YXRjaGVyLmNsb3NlKCk7XG5cdFx0fVxuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJ5KCk7XG5cdH1cblxuXHRwcml2YXRlIHJlbW92ZVNvdXJjZUZpbGVzKC4uLnNvdXJjZUZpbGVzOiBzdHJpbmdbXSkge1xuXHRcdHRoaXMuc291cmNlRmlsZXMgPSB0aGlzLnNvdXJjZUZpbGVzLmZpbHRlcihcblx0XHRcdChzb3VyY2VGaWxlKSA9PiAhc291cmNlRmlsZXMuaW5jbHVkZXMoc291cmNlRmlsZSksXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZ2V0U291cmNlRmlsZXMoZGlyczogc3RyaW5nW10pIHtcblx0XHRjb25zdCBwYXR0ZXJucyA9IGRpcnMubWFwKChkaXIpID0+IGAke2Rpcn0vKiovKi5qc2ApO1xuXHRcdGNvbnN0IGZpbGVzID0gYXdhaXQgaW8uZmluZEZpbGVzKHBhdHRlcm5zKTtcblx0XHRyZXR1cm4gZmlsZXMubWFwKChmKSA9PiBmLmZ1bGxQYXRoKTtcblx0fVxuXG5cdHByaXZhdGUgY29uZmlndXJlTW9kdWxlSG9va3MoKSB7XG5cdFx0aW5pdE1vZHVsZUhvb2tzKCk7XG5cdFx0YWRkUmVzb2x2ZXJIb29rKHRoaXMub25SZXNvbHZlKTtcblx0fVxuXG5cdHByaXZhdGUgb25SZXNvbHZlID0gKHJlc3VsdDogUmVzb2x2ZUZuT3V0cHV0LCBwYXJlbnRVcmw6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHsgdXJsIH0gPSByZXN1bHQ7XG5cdFx0Y29uc3QgcGFyZW50VXJsQ2xlYW4gPSBwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdO1xuXHRcdGNvbnN0IGlzU291cmNlID0gdGhpcy5pc1NvdXJjZU1vZHVsZSh1cmwpO1xuXHRcdGNvbnN0IHBhcmVudElzU291cmNlID0gdGhpcy5pc1NvdXJjZU1vZHVsZShwYXJlbnRVcmxDbGVhbik7XG5cblx0XHRpZiAoaXNTb3VyY2UgfHwgcGFyZW50SXNTb3VyY2UpIHtcblx0XHRcdHRoaXMudHJhY2tEZXBlbmRlbmN5KHVybCwgcGFyZW50VXJsKTtcblx0XHR9XG5cblx0XHRpZiAoIWlzU291cmNlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmVzdWx0LnVybCA9IHRoaXMuZ2V0Q2FjaGVkT3JOZXcodXJsKTtcblx0fTtcblxuXHRwcml2YXRlIGlzU291cmNlTW9kdWxlKHVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgcGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsKTtcblx0XHRyZXR1cm4gdGhpcy5zb3VyY2VGaWxlcy5pbmNsdWRlcyhwYXRoKTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0RGVwZW5kZW5jeUdyYXBoKG1vZHVsZUlkOiBzdHJpbmcsIHBhcmVudE1vZHVsZXM6IHN0cmluZ1tdID0gW10pIHtcblx0XHRpZiAodGhpcy5pc1NlbGYobW9kdWxlSWQpKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kdWxlRGVwcyA9IHRoaXMuZGVwZW5kZW5jaWVzLmdldChtb2R1bGVJZCkgPz8gW107XG5cdFx0aWYgKHBhcmVudE1vZHVsZXMuaW5jbHVkZXMobW9kdWxlSWQpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkOiAke21vZHVsZUlkfWApO1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdGxldCBzdWJEZXBzID0gQXJyYXkub2Y8c3RyaW5nPigpO1xuXHRcdGZvciAoY29uc3QgZGVwIG9mIG1vZHVsZURlcHMpIHtcblx0XHRcdGlmICghdGhpcy5zb3VyY2VGaWxlcy5pbmNsdWRlcyhkZXApKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IHN1YnMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChkZXAsIFttb2R1bGVJZCwgLi4ucGFyZW50TW9kdWxlc10pO1xuXHRcdFx0c3ViRGVwcyA9IFsuLi5zdWJEZXBzLCAuLi5zdWJzXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gWy4uLm5ldyBTZXQoWy4uLm1vZHVsZURlcHMsIC4uLnN1YkRlcHNdKV07XG5cdH1cblxuXHRwcml2YXRlIHRyYWNrRGVwZW5kZW5jeSh1cmw6IHN0cmluZywgcGFyZW50VXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsKTtcblx0XHRjb25zdCBwYXJlbnRQYXRoID0gaW8uZmlsZVVybFRvUGF0aChwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdKTtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KGZpbGVQYXRoKSA/PyBbXTtcblx0XHRjb25zdCB1cGRhdGVkRGVwcyA9IG5ldyBTZXQoWy4uLmRlcHMsIHBhcmVudFBhdGhdKTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoZmlsZVBhdGgsIFsuLi51cGRhdGVkRGVwc10pO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRDYWNoZWRPck5ldyhtb2R1bGVVcmw6IHN0cmluZykge1xuXHRcdGNvbnN0IGZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aChtb2R1bGVVcmwpO1xuXHRcdGNvbnN0IGNhY2hlZCA9IHRoaXMubW9kdWxlQ2FjaGUuZ2V0KGZpbGVQYXRoKTtcblx0XHRjb25zdCB2ZXJzaW9uZWQgPSBjYWNoZWQgPz8gdGhpcy52ZXJzaW9uTW9kdWxlKG1vZHVsZVVybCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZmlsZVBhdGgsIHZlcnNpb25lZCk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZDtcblx0fVxuXG5cdHByaXZhdGUgdmVyc2lvbk1vZHVsZShtb2R1bGVVcmw6IHN0cmluZykge1xuXHRcdGNvbnN0IHZlcnNpb25lZFVybCA9IG5ldyBVUkwobW9kdWxlVXJsKTtcblx0XHR2ZXJzaW9uZWRVcmwuc2VhcmNoUGFyYW1zLnNldChcInZlcnNpb25cIiwgRGF0ZS5ub3coKS50b1N0cmluZygpKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkVXJsLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRwcml2YXRlIHdhdGNoID0gYXN5bmMgKGRpcnM6IHN0cmluZ1tdKSA9PiB7XG5cdFx0Zm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuXHRcdFx0Y29uc3Qgd2F0Y2hlciA9IGlvLndhdGNoKGRpciwgeyBpbmNsdWRlOiBbXCIqKi8qLmpzXCJdLCBpZ25vcmVJbml0aWFsOiB0cnVlIH0pO1xuXHRcdFx0d2F0Y2hlclxuXHRcdFx0XHQub24oXCJhZGRcIiwgdGhpcy5vbkZpbGVBZGRlZClcblx0XHRcdFx0Lm9uKFwiY2hhbmdlXCIsIHRoaXMub25Tb3VyY2VGaWxlQ2hhbmdlZClcblx0XHRcdFx0Lm9uKFwidW5saW5rXCIsIHRoaXMub25GaWxlRGVsZXRlZCk7XG5cdFx0XHR0aGlzLndhdGNoZXJzLnB1c2god2F0Y2hlcik7XG5cdFx0fVxuXHR9O1xuXG5cdHByaXZhdGUgb25GaWxlQWRkZWQgPSBhc3luYyAoeyBmdWxsUGF0aCB9OiBGaWxlKSA9PiB7XG5cdFx0dGhpcy5zb3VyY2VGaWxlcy5wdXNoKGZ1bGxQYXRoKTtcblx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmdWxsUGF0aCwgbnVsbCk7XG5cdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIG9uU291cmNlRmlsZUNoYW5nZWQgPSBhc3luYyAoeyBmdWxsUGF0aCB9OiBGaWxlKSA9PiB7XG5cdFx0aWYgKCF0aGlzLnJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGgpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci50cmFjZShcblx0XHRcdFx0YCR7ZnVsbFBhdGh9IGlzIG5vdCBwYXJ0IG9mIHRoZSBjdXJyZW50IGRlcGVuZGVuY3kgZ3JhcGguIE5vdCByZWxvYWRpbmcgZW50cnkuYCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xuXG5cdHByaXZhdGUgb25GaWxlRGVsZXRlZCA9IGFzeW5jICh7IGZ1bGxQYXRoIH06IEZpbGUpID0+IHtcblx0XHR0aGlzLnJlbW92ZVNvdXJjZUZpbGVzKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIHJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChmdWxsUGF0aCk7XG5cdFx0Y29uc3QgbW9kdWxlcyA9IFsuLi5uZXcgU2V0KFsuLi5kZXBzLCBmdWxsUGF0aF0pXTtcblxuXHRcdGlmICghbW9kdWxlcy5pbmNsdWRlcyh0aGlzLmVudHJ5TW9kdWxlKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMuaW52bGlkYXRlTW9kdWxlKC4uLm1vZHVsZXMpO1xuXHRcdHRoaXMuZGlzcG9zZUFuZEJvb3QoKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHByaXZhdGUgaXNTZWxmKHVybExpa2U6IHN0cmluZykge1xuXHRcdHJldHVybiBjdXJyZW50RmlsZVBhdGggPT09IHBhdGgucmVzb2x2ZShpby5maWxlVXJsVG9QYXRoKHVybExpa2UpKTtcblx0fVxuXG5cdHByaXZhdGUgaW52bGlkYXRlTW9kdWxlKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHR9XG5cdFx0Ly8gUHJ1bmUgaW52YWxpZGF0ZWQgbW9kdWxlcyBmcm9tIGFsbCBwYXJlbnQgbGlzdHMgc28gc3RhbGUgcmVsYXRpb25zaGlwc1xuXHRcdC8vIGFyZSBjbGVhcmVkLiBUaGUgZnJlc2ggYm9vdCByZWJ1aWxkcyBvbmx5IHdoYXQgaXMgYWN0dWFsbHkgaW1wb3J0ZWQuXG5cdFx0Zm9yIChjb25zdCBbY2hpbGQsIHBhcmVudHNdIG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG5cdFx0XHRjb25zdCBwcnVuZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gIW1vZHVsZXMuaW5jbHVkZXMocCkpO1xuXHRcdFx0aWYgKHBydW5lZC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZGVsZXRlKGNoaWxkKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChjaGlsZCwgcHJ1bmVkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpIHtcblx0XHRmb3IgKGNvbnN0IGZpbGUgb2YgdGhpcy5zb3VyY2VGaWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZmlsZSwgbnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBkaXNwb3NlQW5kQm9vdCA9IGRlYm91bmNlKGFzeW5jICgpID0+IHtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyeSgpO1xuXHRcdGF3YWl0IHRoaXMuYm9vdEVudHJ5KCk7XG5cdH0sIDI1MCk7XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwb3NlRW50cnkoKSB7XG5cdFx0YXdhaXQgdGhpcy5lbnRyeT8uW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyeSgpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdmVyc2lvbiA9IHRoaXMudmVyc2lvbk1vZHVsZShpby5wYXRoVG9GaWxlVXJsKHRoaXMuZW50cnlNb2R1bGUpKTtcblx0XHRcdHRoaXMuZW50cnkgPSAoYXdhaXQgaW1wb3J0KHZlcnNpb24pKT8uZGVmYXVsdDtcblx0XHRcdHRoaXMuZW1pdChcInJlYm9vdFwiKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdGBUaGVyZSB3YXMgYW4gZXJyb3IgYm9vdGluZyB0aGUgZW50cnkgcG9pbnQuIFlvdXIgYXBwbGljYXRpb24gbWF5IG5vdCBmdW5jdGlvbiBhcyBleHBlY3RlZGAsXG5cdFx0XHRcdGVycm9yLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJIb3RSZWxvYWRTZXJ2ZXIiLCJjdXJyZW50RmlsZVBhdGgiLCJpbyIsImZpbGVVcmxUb1BhdGgiLCJFdmVudEVtaXR0ZXIiLCJsb2dnZXIiLCJkaXNwb3NlZCIsImVudHJ5TW9kdWxlIiwiZW50cnkiLCJzb3VyY2VGaWxlcyIsIm1vZHVsZUNhY2hlIiwiTWFwIiwiZGVwZW5kZW5jaWVzIiwid2F0Y2hlcnMiLCJzdGFydCIsIndhdGNoRGlycyIsImdldFNvdXJjZUZpbGVzIiwiY29uZmlndXJlTW9kdWxlSG9va3MiLCJpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMiLCJ3YXRjaCIsInRyYWNlIiwiYm9vdEVudHJ5IiwiZGlzcG9zZSIsInJlbW92ZVJlc29sdmVySG9vayIsIm9uUmVzb2x2ZSIsIndhdGNoZXIiLCJjbG9zZSIsImRpc3Bvc2VFbnRyeSIsInJlbW92ZVNvdXJjZUZpbGVzIiwiZmlsdGVyIiwic291cmNlRmlsZSIsImluY2x1ZGVzIiwiZGlycyIsInBhdHRlcm5zIiwibWFwIiwiZGlyIiwiZmlsZXMiLCJmaW5kRmlsZXMiLCJmIiwiZnVsbFBhdGgiLCJpbml0TW9kdWxlSG9va3MiLCJhZGRSZXNvbHZlckhvb2siLCJyZXN1bHQiLCJwYXJlbnRVcmwiLCJ1cmwiLCJwYXJlbnRVcmxDbGVhbiIsInNwbGl0IiwiaXNTb3VyY2UiLCJpc1NvdXJjZU1vZHVsZSIsInBhcmVudElzU291cmNlIiwidHJhY2tEZXBlbmRlbmN5IiwiZ2V0Q2FjaGVkT3JOZXciLCJwYXRoIiwiZ2V0RGVwZW5kZW5jeUdyYXBoIiwibW9kdWxlSWQiLCJwYXJlbnRNb2R1bGVzIiwiaXNTZWxmIiwibW9kdWxlRGVwcyIsImdldCIsImVycm9yIiwic3ViRGVwcyIsIkFycmF5Iiwib2YiLCJkZXAiLCJzdWJzIiwiU2V0IiwiZmlsZVBhdGgiLCJwYXJlbnRQYXRoIiwiZGVwcyIsInVwZGF0ZWREZXBzIiwic2V0IiwibW9kdWxlVXJsIiwiY2FjaGVkIiwidmVyc2lvbmVkIiwidmVyc2lvbk1vZHVsZSIsInZlcnNpb25lZFVybCIsIlVSTCIsInNlYXJjaFBhcmFtcyIsIkRhdGUiLCJub3ciLCJ0b1N0cmluZyIsImluY2x1ZGUiLCJpZ25vcmVJbml0aWFsIiwib24iLCJvbkZpbGVBZGRlZCIsIm9uU291cmNlRmlsZUNoYW5nZWQiLCJvbkZpbGVEZWxldGVkIiwicHVzaCIsInJlbG9hZElmQWZmZWN0ZWQiLCJtb2R1bGVzIiwiaW52bGlkYXRlTW9kdWxlIiwiZGlzcG9zZUFuZEJvb3QiLCJ1cmxMaWtlIiwicmVzb2x2ZSIsIm1vZHVsZSIsImNoaWxkIiwicGFyZW50cyIsInBydW5lZCIsInAiLCJsZW5ndGgiLCJkZWxldGUiLCJmaWxlIiwiZGVib3VuY2UiLCJTeW1ib2wiLCJhc3luY0Rpc3Bvc2UiLCJ2ZXJzaW9uIiwicGF0aFRvRmlsZVVybCIsImRlZmF1bHQiLCJlbWl0Il0sIm1hcHBpbmdzIjoiOzs7OytCQWNhQTs7O2VBQUFBOzs7NEJBZGdCO2lFQUVaO29CQUNhO3dCQUNMO2dDQUU0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFckUsTUFBTUMsa0JBQWtCQyxNQUFFLENBQUNDLGFBQWEsQ0FBQztBQU1sQyxNQUFNSCx3QkFBd0JJLHdCQUFZO0lBQy9CQyxPQUFlO0lBQ3hCQyxXQUFXLE1BQU07SUFDakJDLFlBQW9CO0lBQ3BCQyxNQUF1QjtJQUN2QkMsY0FBd0IsRUFBRSxDQUFDO0lBQzNCQyxjQUFjLElBQUlDLE1BQTZCO0lBQy9DQyxlQUFlLElBQUlELE1BQXdCO0lBQzNDRSxXQUEwQyxFQUFFLENBQUM7SUFFckQsWUFBbUJSLE1BQWMsQ0FBRTtRQUNsQyxLQUFLO1FBQ0wsSUFBSSxDQUFDQSxNQUFNLEdBQUdBO0lBQ2Y7SUFFQSxNQUFhUyxNQUFNTixLQUFhLEVBQUUsR0FBR08sU0FBbUIsRUFBRTtRQUN6RCxJQUFJLENBQUNSLFdBQVcsR0FBR0M7UUFDbkIsSUFBSSxDQUFDQyxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUNPLGNBQWMsQ0FBQ0Q7UUFDN0MsSUFBSSxDQUFDRSxvQkFBb0I7UUFDekIsSUFBSSxDQUFDQyx3QkFBd0I7UUFDN0IsTUFBTSxJQUFJLENBQUNDLEtBQUssQ0FBQ0o7UUFDakIsSUFBSSxDQUFDVixNQUFNLENBQUNlLEtBQUss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
390
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRm5PdXRwdXQgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9zeXN0ZW1cIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgU291cmNlTW9kdWxlTG9hZGVyIH0gZnJvbSBcIi4vc291cmNlLW1vZHVsZS1sb2FkZXIuanNcIjtcblxuY29uc3QgY3VycmVudEZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgVkVSU0lPTl9VUkxfUEFSQU0gPSBcInZlcnNpb25cIjtcbi8qKiBEZWZhdWx0IHF1aWV0IHdpbmRvdyBiZWZvcmUgYSBmaWxlLWNoYW5nZSByZWJvb3QuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMgPSAyNTA7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVib290RGVib3VuY2VNcyh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcblx0Y29uc3QgZGVsYXkgPSB2YWx1ZSA/PyBERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NUztcblx0aWYgKCFOdW1iZXIuaXNGaW5pdGUoZGVsYXkpIHx8IGRlbGF5IDwgMCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgcmVib290RGVib3VuY2VNcyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlciwgZ290ICR7U3RyaW5nKHZhbHVlKX1gKTtcblx0fVxuXHRyZXR1cm4gZGVsYXk7XG59XG5cbi8qKiBQcm9jZXNzLXdpZGU6IE5vZGUncyBFU00gY2FjaGUgaXMgcHJvY2Vzcy1nbG9iYWwsIGluY2x1ZGluZyBhY3Jvc3MgSG90UmVsb2FkU2VydmVyIGluc3RhbmNlcy4gKi9cbmxldCBtb2R1bGVWZXJzaW9uU2VxID0gMDtcblxuZXhwb3J0IGludGVyZmFjZSBIb3RSZWxvYWRTZXJ2ZXJFdmVudHMge1xuXHRzdGFydDogW107XG5cdHJlYm9vdDogW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyT3B0aW9ucyB7XG5cdC8qKiBCdWlsZCBjb25maWd1cmF0aW9uIG5hbWUuICovXG5cdGJ1aWxkQ29uZmlnOiBzdHJpbmc7XG5cdC8qKiBOYW1lIG9mIHRoZSBwcm9qZWN0IHRvIHNlcnZlLiBEZWZhdWx0cyB0byB0aGUgZmlyc3QgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlLiAqL1xuXHRwcm9qZWN0Pzogc3RyaW5nO1xuXHQvKipcblx0ICogTXVsdGlwbGUgRmx1eCBhcHAgcGFja2FnZSBuYW1lcyB0byBib290IGluIG9uZSBwcm9jZXNzIChkaXJlY3Rvcnkgc2xpY2UpLlxuXHQgKiBXaGVuIHNldCwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHtAbGluayBwcm9qZWN0fS5cblx0ICovXG5cdHByb2plY3RzPzogcmVhZG9ubHkgc3RyaW5nW107XG5cdC8qKlxuXHQgKiBQcmUtYnVpbHQgV29ya3NwYWNlIGluc3RhbmNlIHRvIHVzZSBpbnN0ZWFkIG9mIHJ1bm5pbmcgV29ya3NwYWNlRmFjdG9yeS5cblx0ICogVXNlZnVsIGluIHRlc3RzIHRvIGJ5cGFzcyBmaWxlc3lzdGVtLWJhc2VkIHdvcmtzcGFjZSBkaXNjb3ZlcnkuXG5cdCAqL1xuXHR3b3Jrc3BhY2U/OiBXb3Jrc3BhY2U7XG5cdC8qKlxuXHQgKiBRdWlldCB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHRoZSBsYXN0IGFmZmVjdGluZyBzYXZlIGJlZm9yZSBhIHJlYm9vdC5cblx0ICogRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TfS4gUmFpc2UgdGhpcyBmb3IgYWdlbnQgc2F2ZSB0cmFpbnMuXG5cdCAqL1xuXHRyZWJvb3REZWJvdW5jZU1zPzogbnVtYmVyO1xufVxuXG50eXBlIEVudHJ5U3RhdGUgPSB7IHBhdGg6IHN0cmluZzsgbW9kdWxlPzogQXN5bmNEaXNwb3NhYmxlIH07XG5cbmV4cG9ydCBjbGFzcyBIb3RSZWxvYWRTZXJ2ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXI8SG90UmVsb2FkU2VydmVyRXZlbnRzPiB7XG5cdC8vIOKUgOKUgCBTdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlciA9IHNjcmliZS5sb2dnZXIoSG90UmVsb2FkU2VydmVyLm5hbWUpO1xuXHRwcml2YXRlIHJlYWRvbmx5IGxvYWRlciA9IG5ldyBTb3VyY2VNb2R1bGVMb2FkZXIoKTtcblx0cHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXHQvKiogQWJzb2x1dGUgZW50cnkgcGF0aHMgY3VycmVudGx5IHNlcnZlZCAob25lIG9yIG1vcmUgRmx1eCBhcHBzKS4gKi9cblx0cHJpdmF0ZSBlbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIEVudHJ5U3RhdGU+KCk7XG5cdHByaXZhdGUgcGVuZGluZ0VudHJ5UmVib290cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRwcml2YXRlIHdhdGNoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXHRwcml2YXRlIG1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cdHByaXZhdGUgZGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXHRwcml2YXRlIHJlYm9vdFRhaWw6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0cHJpdmF0ZSByZWJvb3REZWJvdW5jZUdlbiA9IDA7XG5cdHByaXZhdGUgcmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0cHJpdmF0ZSByZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRwcml2YXRlIHJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHQvKiogTW9kdWxlcyB3aG9zZSByZXZlcnNlLWdyYXBoIGVkZ2VzIGFyZSBwcnVuZWQgYXQgcmVib290LCBub3Qgb24gc2NoZWR1bGUuICovXG5cdHByaXZhdGUgcGVuZGluZ0dyYXBoUHJ1bmUgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0cHJpdmF0ZSBzY2hlZHVsZVJlYm9vdDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG5cdC8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHB1YmxpYyBhc3luYyBzdGFydChvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKSB7XG5cdFx0dGhpcy5kaXNwb3NlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5jbGVhcigpO1xuXHRcdHRoaXMuZW50cmllcy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ0dyYXBoUHJ1bmUuY2xlYXIoKTtcblx0XHR0aGlzLnJlYm9vdFRhaWwgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR0aGlzLnJlYm9vdEluRmxpZ2h0ID0gZmFsc2U7XG5cdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRcdHRoaXMucmVib290UXVldWVkID0gZmFsc2U7XG5cdFx0dGhpcy5iaW5kU2NoZWR1bGVSZWJvb3QocmVzb2x2ZVJlYm9vdERlYm91bmNlTXMob3B0aW9ucy5yZWJvb3REZWJvdW5jZU1zKSk7XG5cblx0XHRjb25zdCB7IGJ1aWxkQ29uZmlnIH0gPSBvcHRpb25zO1xuXG5cdFx0YXdhaXQgdGhpcy5sb2FkZXIuY29uZmlndXJlKHtcblx0XHRcdGJ1aWxkQ29uZmlnLFxuXHRcdFx0d29ya3NwYWNlOiBvcHRpb25zLndvcmtzcGFjZSxcblx0XHRcdHZlcnNpb25GaWxlVXJsOiAoZmlsZVVybCkgPT4gdGhpcy5nZXRDYWNoZWRPck5ldyhmaWxlVXJsKSxcblx0XHRcdG9uUmVzb2x2ZWQ6IHRoaXMub25Qb3N0UmVzb2x2ZSxcblx0XHR9KTtcblxuXHRcdGNvbnN0IHdvcmtzcGFjZSA9IHRoaXMucmVxdWlyZVdvcmtzcGFjZSgpO1xuXHRcdGNvbnN0IHNlbGVjdGVkID0gdGhpcy5yZXNvbHZlUHJvamVjdHMoYnVpbGRDb25maWcsIG9wdGlvbnMpO1xuXHRcdGZvciAoY29uc3QgcHJvamVjdCBvZiBzZWxlY3RlZCkge1xuXHRcdFx0Y29uc3QgZW50cnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZ2V0U291cmNlRW50cnlQYXRoKCkpO1xuXHRcdFx0dGhpcy5lbnRyaWVzLnNldChlbnRyeVBhdGgsIHsgcGF0aDogZW50cnlQYXRoIH0pO1xuXHRcdH1cblxuXHRcdHRoaXMubG9hZGVyLnJlZ2lzdGVySG9va3MoKTtcblx0XHR0aGlzLmludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpO1xuXG5cdFx0YXdhaXQgd29ya3NwYWNlLndhdGNoKGJ1aWxkQ29uZmlnKTtcblx0XHR0aGlzLndhdGNoU3Vic2NyaXB0aW9uID0gd29ya3NwYWNlLnByb2plY3RGaWxlQ2hhbmdlZCQuc3Vic2NyaWJlKHRoaXMub25GaWxlQ2hhbmdlKTtcblxuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5lbnRyaWVzLnZhbHVlcygpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci50cmFjZShgU2VydmluZyAke2VudHJ5LnBhdGh9YCk7XG5cdFx0fVxuXHRcdGF3YWl0IHRoaXMuYm9vdEVudHJpZXMoWy4uLnRoaXMuZW50cmllcy5rZXlzKCldKTtcblx0XHR0aGlzLmVtaXQoXCJzdGFydFwiKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBkaXNwb3NlKCkge1xuXHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0dGhpcy5kaXNwb3NlZCA9IHRydWU7XG5cdFx0dGhpcy5yZWJvb3REZWJvdW5jZUdlbiArPSAxO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cdFx0YXdhaXQgdGhpcy5yZWJvb3RUYWlsO1xuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJpZXMoWy4uLnRoaXMuZW50cmllcy5rZXlzKCldKTtcblx0XHR0aGlzLmxvYWRlci5kaXNwb3NlKCk7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkge1xuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZSgpO1xuXHR9XG5cblx0Ly8g4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyaWVzKGVudHJ5UGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKSB7XG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoZW50cnlQYXRocy5tYXAoKGVudHJ5UGF0aCkgPT4gdGhpcy5ib290RW50cnkoZW50cnlQYXRoKSkpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBib290RW50cnkoZW50cnlQYXRoOiBzdHJpbmcpIHtcblx0XHRjb25zdCBzdGF0ZSA9IHRoaXMuZW50cmllcy5nZXQoZW50cnlQYXRoKTtcblx0XHRpZiAoc3RhdGUgPT0gbnVsbCkgcmV0dXJuO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBtb2QgPSAoYXdhaXQgdGhpcy5sb2FkZXIuaW1wb3J0RW50cnkoZW50cnlQYXRoKSkgYXMge1xuXHRcdFx0XHRkZWZhdWx0PzogQXN5bmNEaXNwb3NhYmxlO1xuXHRcdFx0fTtcblx0XHRcdHN0YXRlLm1vZHVsZSA9IG1vZD8uZGVmYXVsdDtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0c3RhdGUubW9kdWxlID0gdW5kZWZpbmVkO1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdFwiVGhlcmUgd2FzIGFuIGVycm9yIGJvb3RpbmcgdGhlIGVudHJ5IHBvaW50LiBZb3VyIGFwcGxpY2F0aW9uIG1heSBub3QgZnVuY3Rpb24gYXMgZXhwZWN0ZWRcIixcblx0XHRcdFx0ZXJyb3IsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYmluZFNjaGVkdWxlUmVib290KGRlbGF5TXM6IG51bWJlcikge1xuXHRcdGNvbnN0IGdlbiA9ICsrdGhpcy5yZWJvb3REZWJvdW5jZUdlbjtcblx0XHR0aGlzLnNjaGVkdWxlUmVib290ID0gZGVib3VuY2UoYXN5bmMgKCkgPT4ge1xuXHRcdFx0aWYgKHRoaXMuZGlzcG9zZWQgfHwgZ2VuICE9PSB0aGlzLnJlYm9vdERlYm91bmNlR2VuKSByZXR1cm47XG5cdFx0XHR0aGlzLnJlcXVlc3RSZWJvb3QoKTtcblx0XHR9LCBkZWxheU1zKTtcblx0fVxuXG5cdHByaXZhdGUgcmVxdWVzdFJlYm9vdCgpIHtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdGlmICh0aGlzLnJlYm9vdEluRmxpZ2h0KSB7XG5cdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gdHJ1ZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKHRoaXMucmVib290UXVldWVkKSByZXR1cm47XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSB0cnVlO1xuXHRcdHRoaXMucmVib290VGFpbCA9IHRoaXMucmVib290VGFpbC50aGVuKFxuXHRcdFx0KCkgPT4gdGhpcy5ydW5SZWJvb3QoKSxcblx0XHRcdCgpID0+IHRoaXMucnVuUmVib290KCksXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcnVuUmVib290KCkge1xuXHRcdHRoaXMucmVib290UXVldWVkID0gZmFsc2U7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLnJlYm9vdEluRmxpZ2h0ID0gdHJ1ZTtcblx0XHR0cnkge1xuXHRcdFx0ZG8ge1xuXHRcdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0XHRcdGNvbnN0IHRvUmVib290ID1cblx0XHRcdFx0XHR0aGlzLnBlbmRpbmdFbnRyeVJlYm9vdHMuc2l6ZSA+IDBcblx0XHRcdFx0XHRcdD8gWy4uLnRoaXMucGVuZGluZ0VudHJ5UmVib290c11cblx0XHRcdFx0XHRcdDogWy4uLnRoaXMuZW50cmllcy5rZXlzKCldO1xuXHRcdFx0XHR0aGlzLnBlbmRpbmdFbnRyeVJlYm9vdHMuY2xlYXIoKTtcblx0XHRcdFx0Ly8gRHJvcCByZXZlcnNlIGVkZ2VzIG9ubHkgd2hlbiByZWJvb3Rpbmcgc28gbGF0ZXIgc2F2ZXMgaW4gdGhlIGRlYm91bmNlXG5cdFx0XHRcdC8vIHdpbmRvdyBjYW4gc3RpbGwgd2FsayB0aGUgZ3JhcGggYW5kIHJlc2V0IHRoZSBxdWlldCB0aW1lci5cblx0XHRcdFx0dGhpcy5wcnVuZVBlbmRpbmdEZXBlbmRlbmN5RWRnZXMoKTtcblx0XHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYFJlYm9vdGluZyAke3RvUmVib290Lmxlbmd0aH0gZW50cnkgbW9kdWxlKHMpYCk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJpZXModG9SZWJvb3QpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyaWVzKHRvUmVib290KTtcblx0XHRcdFx0dGhpcy5lbWl0KFwicmVib290XCIpO1xuXHRcdFx0fSB3aGlsZSAodGhpcy5yZWJvb3RGb2xsb3dVcCAmJiAhdGhpcy5kaXNwb3NlZCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGNvbnN0IG5lZWRzRm9sbG93VXAgPSB0aGlzLnJlYm9vdEZvbGxvd1VwICYmICF0aGlzLmRpc3Bvc2VkO1xuXHRcdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5yZWJvb3RJbkZsaWdodCA9IGZhbHNlO1xuXHRcdFx0aWYgKG5lZWRzRm9sbG93VXApIHRoaXMucmVxdWVzdFJlYm9vdCgpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZGlzcG9zZUVudHJpZXMoZW50cnlQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pIHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChlbnRyeVBhdGhzLm1hcCgoZW50cnlQYXRoKSA9PiB0aGlzLmRpc3Bvc2VFbnRyeShlbnRyeVBhdGgpKSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGRpc3Bvc2VFbnRyeShlbnRyeVBhdGg/OiBzdHJpbmcpIHtcblx0XHRjb25zdCBwYXRocyA9IGVudHJ5UGF0aCAhPSBudWxsID8gW2VudHJ5UGF0aF0gOiBbLi4udGhpcy5lbnRyaWVzLmtleXMoKV07XG5cdFx0Zm9yIChjb25zdCBwIG9mIHBhdGhzKSB7XG5cdFx0XHRjb25zdCBzdGF0ZSA9IHRoaXMuZW50cmllcy5nZXQocCk7XG5cdFx0XHRpZiAoc3RhdGUgPT0gbnVsbCkgY29udGludWU7XG5cdFx0XHRjb25zdCBlbnRyeSA9IHN0YXRlLm1vZHVsZTtcblx0XHRcdHN0YXRlLm1vZHVsZSA9IHVuZGVmaW5lZDtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGVudHJ5Py5bU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFwiRW50cnkgYXN5bmNEaXNwb3NlIGZhaWxlZFwiLCBlcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8g4pSA4pSAIFNldHVwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgcmVxdWlyZVdvcmtzcGFjZSgpOiBXb3Jrc3BhY2Uge1xuXHRcdGNvbnN0IHdvcmtzcGFjZSA9IHRoaXMubG9hZGVyLmdldFdvcmtzcGFjZSgpO1xuXHRcdGlmICh3b3Jrc3BhY2UgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiU291cmNlTW9kdWxlTG9hZGVyIGhhcyBubyB3b3Jrc3BhY2UgYWZ0ZXIgY29uZmlndXJlXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gd29ya3NwYWNlO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlUHJvamVjdHMoYnVpbGRDb25maWc6IHN0cmluZywgb3B0aW9uczogSG90UmVsb2FkU2VydmVyT3B0aW9ucyk6IFByb2plY3RbXSB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSB0aGlzLmxvYWRlci5nZXRXb3Jrc3BhY2UoKT8uZ2V0UHJvamVjdHMoYnVpbGRDb25maWcpID8/IFtdO1xuXHRcdGNvbnN0IG5hbWVzID1cblx0XHRcdG9wdGlvbnMucHJvamVjdHMgIT0gbnVsbCAmJiBvcHRpb25zLnByb2plY3RzLmxlbmd0aCA+IDBcblx0XHRcdFx0PyBvcHRpb25zLnByb2plY3RzXG5cdFx0XHRcdDogb3B0aW9ucy5wcm9qZWN0ICE9IG51bGxcblx0XHRcdFx0XHQ/IFtvcHRpb25zLnByb2plY3RdXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cblx0XHRpZiAobmFtZXMgPT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgZmlyc3QgPSBwcm9qZWN0cy5hdCgwKTtcblx0XHRcdGlmIChmaXJzdCA9PSBudWxsKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgTm8gcHJvamVjdHMgZm91bmQgZm9yIGNvbmZpZ3VyYXRpb246ICR7YnVpbGRDb25maWd9YCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gW2ZpcnN0XTtcblx0XHR9XG5cblx0XHRjb25zdCBzZWxlY3RlZDogUHJvamVjdFtdID0gW107XG5cdFx0Zm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG5cdFx0XHRjb25zdCBmb3VuZCA9IHByb2plY3RzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gbmFtZSk7XG5cdFx0XHRpZiAoZm91bmQgPT0gbnVsbCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFByb2plY3QgXCIke25hbWV9XCIgbm90IGZvdW5kIGluIHdvcmtzcGFjZWApO1xuXHRcdFx0fVxuXHRcdFx0c2VsZWN0ZWQucHVzaChmb3VuZCk7XG5cdFx0fVxuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBQb3N0LW5leHQgZGVwZW5kZW5jeSB0cmFja2VyOiByZWNvcmRzIHdoaWNoIHNvdXJjZSBmaWxlcyBpbXBvcnQgd2hpY2hcblx0ICogb3RoZXIgc291cmNlIGZpbGVzIHNvIHRoYXQgcmVsb2FkSWZBZmZlY3RlZCBjYW4gdHJhdmVyc2UgdGhlIGdyYXBoLlxuXHQgKi9cblx0cHJpdmF0ZSBvblBvc3RSZXNvbHZlID0gKHJlc3VsdDogUmVzb2x2ZUZuT3V0cHV0LCBwYXJlbnRVcmw6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHsgdXJsIH0gPSByZXN1bHQ7XG5cdFx0Y29uc3QgcGFyZW50VXJsQ2xlYW4gPSBwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0bGV0IGZpbGVQYXRoOiBzdHJpbmc7XG5cdFx0bGV0IHBhcmVudFBhdGg6IHN0cmluZztcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cdFx0XHR1cmxPYmouc2VhcmNoID0gXCJcIjtcblx0XHRcdGZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aCh1cmxPYmoudG9TdHJpbmcoKSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdHBhcmVudFBhdGggPSBpby5maWxlVXJsVG9QYXRoKHBhcmVudFVybENsZWFuKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHBhcmVudFBhdGggPSBcIlwiO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzU291cmNlID0gdGhpcy5sb2FkZXIuaGFzU291cmNlRmlsZShmaWxlUGF0aCk7XG5cdFx0Y29uc3QgcGFyZW50SXNTb3VyY2UgPSB0aGlzLmxvYWRlci5oYXNTb3VyY2VGaWxlKHBhcmVudFBhdGgpO1xuXG5cdFx0aWYgKGlzU291cmNlIHx8IHBhcmVudElzU291cmNlKSB7XG5cdFx0XHR0aGlzLnRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aCwgcGFyZW50UGF0aCk7XG5cdFx0fVxuXHR9O1xuXG5cdC8vIOKUgOKUgCBGaWxlIHdhdGNoaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgb25GaWxlQ2hhbmdlID0gKGV2dDogUHJvamVjdEZpbGVFdmVudCkgPT4ge1xuXHRcdGNvbnN0IHsgZmlsZSwgZXZlbnROYW1lLCBwcm9qZWN0IH0gPSBldnQ7XG5cdFx0Y29uc3QgZnVsbFBhdGggPSBmaWxlLmZ1bGxQYXRoO1xuXG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoYEZpbGUgJHtldmVudE5hbWV9OiAke2Z1bGxQYXRofWApO1xuXG5cdFx0aWYgKGV2ZW50TmFtZSA9PT0gaW8uV2F0Y2hFdmVudHMudW5saW5rKSB7XG5cdFx0XHR0aGlzLmxvYWRlci5pbnZhbGlkYXRlVHJhbnNwaWxlKGZ1bGxQYXRoKTtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZ1bGxQYXRoLCBudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy5hZGQpIHtcblx0XHRcdGlmIChwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkge1xuXHRcdFx0XHR0aGlzLmxvYWRlci5zZXRTb3VyY2VGaWxlKGZ1bGxQYXRoLCBwcm9qZWN0KTtcblx0XHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZnVsbFBhdGgsIG51bGwpO1xuXHRcdFx0XHR0aGlzLnJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGgpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGNoYW5nZVxuXHRcdGlmICghcHJvamVjdC5pc1NvdXJjZUZpbGUoZmlsZSkpIHJldHVybjtcblx0XHR0aGlzLmxvYWRlci5pbnZhbGlkYXRlVHJhbnNwaWxlKGZ1bGxQYXRoKTtcblx0XHR0aGlzLnJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGgpO1xuXHR9O1xuXG5cdHByaXZhdGUgcmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZGVwcyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGZ1bGxQYXRoKTtcblx0XHRjb25zdCBtb2R1bGVzID0gWy4uLm5ldyBTZXQoWy4uLmRlcHMsIGZ1bGxQYXRoXSldO1xuXHRcdGNvbnN0IGFmZmVjdGVkRW50cmllcyA9IFsuLi50aGlzLmVudHJpZXMua2V5cygpXS5maWx0ZXIoKGVudHJ5UGF0aCkgPT5cblx0XHRcdG1vZHVsZXMuaW5jbHVkZXMoZW50cnlQYXRoKSxcblx0XHQpO1xuXG5cdFx0aWYgKGFmZmVjdGVkRW50cmllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gZG9lcyBub3QgYWZmZWN0IGVudHJ5IOKAlCBza2lwcGluZyByZWxvYWRgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShcblx0XHRcdGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gYWZmZWN0cyAke21vZHVsZXMubGVuZ3RofSBtb2R1bGUocykg4oCUIHNjaGVkdWxpbmcgcmVsb2FkYCxcblx0XHQpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZU1vZHVsZUNhY2hlcyguLi5tb2R1bGVzKTtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHR0aGlzLnBlbmRpbmdHcmFwaFBydW5lLmFkZChtb2R1bGUpO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IGVudHJ5UGF0aCBvZiBhZmZlY3RlZEVudHJpZXMpIHtcblx0XHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5hZGQoZW50cnlQYXRoKTtcblx0XHR9XG5cdFx0dGhpcy5zY2hlZHVsZVJlYm9vdCgpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8g4pSA4pSAIERlcGVuZGVuY3kgZ3JhcGgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBnZXREZXBlbmRlbmN5R3JhcGgobW9kdWxlSWQ6IHN0cmluZywgcGFyZW50TW9kdWxlczogc3RyaW5nW10gPSBbXSk6IHN0cmluZ1tdIHtcblx0XHRpZiAodGhpcy5pc1NlbGYobW9kdWxlSWQpKSByZXR1cm4gW107XG5cblx0XHRjb25zdCBtb2R1bGVEZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KG1vZHVsZUlkKSA/PyBbXTtcblx0XHRpZiAocGFyZW50TW9kdWxlcy5pbmNsdWRlcyhtb2R1bGVJZCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQ6ICR7bW9kdWxlSWR9YCk7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0bGV0IHN1YkRlcHM6IHN0cmluZ1tdID0gW107XG5cdFx0Zm9yIChjb25zdCBkZXAgb2YgbW9kdWxlRGVwcykge1xuXHRcdFx0aWYgKCF0aGlzLmxvYWRlci5oYXNTb3VyY2VGaWxlKGRlcCkpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3Qgc3VicyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGRlcCwgW21vZHVsZUlkLCAuLi5wYXJlbnRNb2R1bGVzXSk7XG5cdFx0XHRzdWJEZXBzID0gWy4uLnN1YkRlcHMsIC4uLnN1YnNdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbLi4ubmV3IFNldChbLi4ubW9kdWxlRGVwcywgLi4uc3ViRGVwc10pXTtcblx0fVxuXG5cdHByaXZhdGUgdHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoOiBzdHJpbmcsIHBhcmVudFBhdGg6IHN0cmluZykge1xuXHRcdGlmICghcGFyZW50UGF0aCkgcmV0dXJuO1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQoZmlsZVBhdGgpID8/IFtdO1xuXHRcdGNvbnN0IHVwZGF0ZWREZXBzID0gbmV3IFNldChbLi4uZGVwcywgcGFyZW50UGF0aF0pO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChmaWxlUGF0aCwgWy4uLnVwZGF0ZWREZXBzXSk7XG5cdH1cblxuXHQvLyDilIDilIAgTW9kdWxlIGNhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0Q2FjaGVkT3JOZXcobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgobW9kdWxlVXJsKTtcblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLm1vZHVsZUNhY2hlLmdldChmaWxlUGF0aCk7XG5cdFx0Y29uc3QgdmVyc2lvbmVkID0gY2FjaGVkID8/IHRoaXMudmVyc2lvbk1vZHVsZShtb2R1bGVVcmwpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCB2ZXJzaW9uZWQpO1xuXHRcdHJldHVybiB2ZXJzaW9uZWQ7XG5cdH1cblxuXHRwcml2YXRlIHZlcnNpb25Nb2R1bGUobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCB2ZXJzaW9uZWRVcmwgPSBuZXcgVVJMKG1vZHVsZVVybCk7XG5cdFx0dmVyc2lvbmVkVXJsLnNlYXJjaFBhcmFtcy5zZXQoVkVSU0lPTl9VUkxfUEFSQU0sIFN0cmluZygrK21vZHVsZVZlcnNpb25TZXEpKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkVXJsLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVNb2R1bGVDYWNoZXMoLi4ubW9kdWxlczogc3RyaW5nW10pIHtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChtb2R1bGUsIG51bGwpO1xuXHRcdFx0dGhpcy5sb2FkZXIuaW52YWxpZGF0ZVRyYW5zcGlsZShtb2R1bGUpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgcHJ1bmVQZW5kaW5nRGVwZW5kZW5jeUVkZ2VzKCkge1xuXHRcdGNvbnN0IG1vZHVsZXMgPSBbLi4udGhpcy5wZW5kaW5nR3JhcGhQcnVuZV07XG5cdFx0dGhpcy5wZW5kaW5nR3JhcGhQcnVuZS5jbGVhcigpO1xuXHRcdHRoaXMucHJ1bmVEZXBlbmRlbmN5UGFyZW50cyguLi5tb2R1bGVzKTtcblx0fVxuXG5cdC8qKiBSZW1vdmUgdGhlc2UgbW9kdWxlcyBhcyBwYXJlbnRzIHNvIGJvb3QgY2FuIHJlYnVpbGQgZWRnZXMgd2l0aG91dCBzdGFsZSBpbXBvcnRlcnMuICovXG5cdHByaXZhdGUgcHJ1bmVEZXBlbmRlbmN5UGFyZW50cyguLi5tb2R1bGVzOiBzdHJpbmdbXSkge1xuXHRcdGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcblx0XHRcdGZvciAoY29uc3QgW2tleSwgcGFyZW50c10gb2YgdGhpcy5kZXBlbmRlbmNpZXMpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gcCAhPT0gbW9kdWxlKTtcblx0XHRcdFx0aWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmRlbGV0ZShrZXkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChrZXksIGZpbHRlcmVkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzKCkge1xuXHRcdGZvciAoY29uc3QgZmlsZVBhdGggb2YgdGhpcy5sb2FkZXIuc291cmNlRmlsZVBhdGhzKCkpIHtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCBudWxsKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGlzU2VsZihmaWxlUGF0aDogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGN1cnJlbnRGaWxlUGF0aCA9PT0gcGF0aC5yZXNvbHZlKGZpbGVQYXRoKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkRFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TIiwiSG90UmVsb2FkU2VydmVyIiwicmVzb2x2ZVJlYm9vdERlYm91bmNlTXMiLCJjdXJyZW50RmlsZVBhdGgiLCJpbyIsImZpbGVVcmxUb1BhdGgiLCJWRVJTSU9OX1VSTF9QQVJBTSIsInZhbHVlIiwiZGVsYXkiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsIkVycm9yIiwiU3RyaW5nIiwibW9kdWxlVmVyc2lvblNlcSIsIkV2ZW50RW1pdHRlciIsImxvZ2dlciIsInNjcmliZSIsIm5hbWUiLCJsb2FkZXIiLCJTb3VyY2VNb2R1bGVMb2FkZXIiLCJkaXNwb3NlZCIsImVudHJpZXMiLCJNYXAiLCJwZW5kaW5nRW50cnlSZWJvb3RzIiwiU2V0Iiwid2F0Y2hTdWJzY3JpcHRpb24iLCJtb2R1bGVDYWNoZSIsImRlcGVuZGVuY2llcyIsInJlYm9vdFRhaWwiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlYm9vdERlYm91bmNlR2VuIiwicmVib290SW5GbGlnaHQiLCJyZWJvb3RGb2xsb3dVcCIsInJlYm9vdFF1ZXVlZCIsInBlbmRpbmdHcmFwaFBydW5lIiwic2NoZWR1bGVSZWJvb3QiLCJzdGFydCIsIm9wdGlvbnMiLCJjbGVhciIsImJpbmRTY2hlZHVsZVJlYm9vdCIsInJlYm9vdERlYm91bmNlTXMiLCJidWlsZENvbmZpZyIsImNvbmZpZ3VyZSIsIndvcmtzcGFjZSIsInZlcnNpb25GaWxlVXJsIiwiZmlsZVVybCIsImdldENhY2hlZE9yTmV3Iiwib25SZXNvbHZlZCIsIm9uUG9zdFJlc29sdmUiLCJyZXF1aXJlV29ya3NwYWNlIiwic2VsZWN0ZWQiLCJyZXNvbHZlUHJvamVjdHMiLCJwcm9qZWN0IiwiZW50cnlQYXRoIiwicGF0aCIsImdldFNvdXJjZUVudHJ5UGF0aCIsInNldCIsInJlZ2lzdGVySG9va3MiLCJpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMiLCJ3YXRjaCIsInByb2plY3RGaWxlQ2hhbmdlZCQiLCJzdWJzY3JpYmUiLCJvbkZpbGVDaGFuZ2UiLCJlbnRyeSIsInZhbHVlcyIsInRyYWNlIiwiYm9vdEVudHJpZXMiLCJrZXlzIiwiZW1pdCIsImRpc3Bvc2UiLCJ1bnN1YnNjcmliZSIsImRpc3Bvc2VFbnRyaWVzIiwiU3ltYm9sIiwiYXN5bmNEaXNwb3NlIiwiZW50cnlQYXRocyIsImFsbCIsIm1hcCIsImJvb3RFbnRyeSIsInN0YXRlIiwiZ2V0IiwibW9kIiwiaW1wb3J0RW50cnkiLCJtb2R1bGUiLCJkZWZhdWx0IiwiZXJyb3IiLCJ1bmRlZmluZWQiLCJkZWxheU1zIiwiZ2VuIiwiZGVib3VuY2UiLCJyZXF1ZXN0UmVib290IiwidGhlbiIsInJ1blJlYm9vdCIsInRvUmVib290Iiwic2l6ZSIsInBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcyIsImxlbmd0aCIsIm5lZWRzRm9sbG93VXAiLCJkaXNwb3NlRW50cnkiLCJwYXRocyIsInAiLCJnZXRXb3Jrc3BhY2UiLCJwcm9qZWN0cyIsImdldFByb2plY3RzIiwibmFtZXMiLCJmaXJzdCIsImF0IiwiZm91bmQiLCJmaW5kIiwicHVzaCIsInJlc3VsdCIsInBhcmVudFVybCIsInVybCIsInBhcmVudFVybENsZWFuIiwic3BsaXQiLCJmaWxlUGF0aCIsInBhcmVudFBhdGgiLCJ1cmxPYmoiLCJVUkwiLCJzZWFyY2giLCJ0b1N0cmluZyIsImlzU291cmNlIiwiaGFzU291cmNlRmlsZSIsInBhcmVudElzU291cmNlIiwidHJhY2tEZXBlbmRlbmN5IiwiZXZ0IiwiZmlsZSIsImV2ZW50TmFtZSIsImZ1bGxQYXRoIiwiV2F0Y2hFdmVudHMiLCJ1bmxpbmsiLCJpbnZhbGlkYXRlVHJhbnNwaWxlIiwiYWRkIiwiaXNTb3VyY2VGaWxlIiwic2V0U291cmNlRmlsZSIsInJlbG9hZElmQWZmZWN0ZWQiLCJkZXBzIiwiZ2V0RGVwZW5kZW5jeUdyYXBoIiwibW9kdWxlcyIsImFmZmVjdGVkRW50cmllcyIsImZpbHRlciIsImluY2x1ZGVzIiwiaW52YWxpZGF0ZU1vZHVsZUNhY2hlcyIsIm1vZHVsZUlkIiwicGFyZW50TW9kdWxlcyIsImlzU2VsZiIsIm1vZHVsZURlcHMiLCJzdWJEZXBzIiwiZGVwIiwic3VicyIsInVwZGF0ZWREZXBzIiwibW9kdWxlVXJsIiwiY2FjaGVkIiwidmVyc2lvbmVkIiwidmVyc2lvbk1vZHVsZSIsInZlcnNpb25lZFVybCIsInNlYXJjaFBhcmFtcyIsInBydW5lRGVwZW5kZW5jeVBhcmVudHMiLCJrZXkiLCJwYXJlbnRzIiwiZmlsdGVyZWQiLCJkZWxldGUiLCJzb3VyY2VGaWxlUGF0aHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O1FBYWFBO2VBQUFBOztRQTBDQUM7ZUFBQUE7O1FBeENHQztlQUFBQTs7OzRCQWZhO2lFQUVaO29CQUVFO3dCQUNNO3dCQUNXO29DQUVEOzs7Ozs7QUFFbkMsTUFBTUMsa0JBQWtCQyxNQUFFLENBQUNDLGFBQWEsQ0FBQztBQUN6QyxNQUFNQyxvQkFBb0I7QUFFbkIsTUFBTU4sNkJBQTZCO0FBRW5DLFNBQVNFLHdCQUF3QkssS0FBeUI7SUFDaEUsTUFBTUMsUUFBUUQsU0FBU1A7SUFDdkIsSUFBSSxDQUFDUyxPQUFPQyxRQUFRLENBQUNGLFVBQVVBLFFBQVEsR0FBRztRQUN6QyxNQUFNLElBQUlHLE1BQU0sQ0FBQyxvREFBb0QsRUFBRUMsT0FBT0wsUUFBUTtJQUN2RjtJQUNBLE9BQU9DO0FB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