@decohere/flux 0.0.1-dev.63 → 0.0.1-dev.65
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/commonjs/src/hot-reload-server.js +43 -29
- package/commonjs/src/rewrite-serve-specifier.js +46 -0
- package/es6/src/hot-reload-server.js +44 -30
- package/es6/src/rewrite-serve-specifier.js +40 -0
- package/package.json +6 -6
- package/types/src/hot-reload-server.d.ts +6 -8
- package/types/src/rewrite-serve-specifier.d.ts +13 -0
|
@@ -16,6 +16,7 @@ const _mesh = require("@decohere/mesh");
|
|
|
16
16
|
const _io = require("@decohere/nexus/io");
|
|
17
17
|
const _system = require("@decohere/nexus/system");
|
|
18
18
|
const _scribe = require("@decohere/scribe");
|
|
19
|
+
const _rewriteservespecifier = require("./rewrite-serve-specifier.js");
|
|
19
20
|
function _interop_require_default(obj) {
|
|
20
21
|
return obj && obj.__esModule ? obj : {
|
|
21
22
|
default: obj
|
|
@@ -65,6 +66,7 @@ function _interop_require_wildcard(obj, nodeInterop) {
|
|
|
65
66
|
const currentFilePath = _io.io.fileUrlToPath(require("url").pathToFileURL(__filename).toString());
|
|
66
67
|
const VERSION_URL_PARAM = "version";
|
|
67
68
|
const REBOOT_DEBOUNCE_MS = 250;
|
|
69
|
+
/** Process-wide: Node's ESM cache is process-global, including across HotReloadServer instances. */ let moduleVersionSeq = 0;
|
|
68
70
|
class HotReloadServer extends _nodeevents.EventEmitter {
|
|
69
71
|
// ── State ────────────────────────────────────────────────────────────────
|
|
70
72
|
logger = _scribe.scribe.logger(HotReloadServer.name);
|
|
@@ -80,18 +82,23 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
80
82
|
dependencies = new Map();
|
|
81
83
|
transpileCache = new Map();
|
|
82
84
|
transpiler = new _forge.SwcTranspiler();
|
|
85
|
+
aliasPaths = {};
|
|
86
|
+
aliasBaseUrl = _nodepath.default.resolve(".");
|
|
87
|
+
rebootTail = Promise.resolve();
|
|
83
88
|
// ── Public API ───────────────────────────────────────────────────────────
|
|
84
89
|
async start(options) {
|
|
85
90
|
this.disposed = false;
|
|
86
91
|
this.dependencies.clear();
|
|
87
92
|
this.moduleCache.clear();
|
|
88
93
|
this.transpileCache.clear();
|
|
94
|
+
this.rebootTail = Promise.resolve();
|
|
89
95
|
const { buildConfig } = options;
|
|
90
96
|
this.buildConfig = buildConfig;
|
|
91
97
|
this.workspace = await this.resolveWorkspace(options);
|
|
92
98
|
const project = this.resolveProject(buildConfig, options.project);
|
|
93
99
|
this.entryModulePath = _nodepath.default.resolve(project.getSourceEntryPath());
|
|
94
100
|
this.fileInfoMap = await this.buildFileInfoMap(buildConfig);
|
|
101
|
+
this.aliasPaths = await this.buildAliasPaths();
|
|
95
102
|
this.registerHooks();
|
|
96
103
|
this.invalidateAllSourceFiles();
|
|
97
104
|
await this.workspace.watch(buildConfig);
|
|
@@ -105,6 +112,7 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
105
112
|
this.disposed = true;
|
|
106
113
|
this.watchSubscription?.unsubscribe();
|
|
107
114
|
this.workspace?.[Symbol.dispose]();
|
|
115
|
+
await this.rebootTail;
|
|
108
116
|
await this.disposeEntry();
|
|
109
117
|
}
|
|
110
118
|
async [Symbol.asyncDispose]() {
|
|
@@ -116,19 +124,29 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
116
124
|
const url = this.versionModule(_io.io.pathToFileUrl(this.entryModulePath));
|
|
117
125
|
this.entryModule = (await Promise.resolve(url).then((p)=>/*#__PURE__*/ _interop_require_wildcard(require(p))))?.default;
|
|
118
126
|
} catch (error) {
|
|
127
|
+
this.entryModule = undefined;
|
|
119
128
|
this.logger.error("There was an error booting the entry point. Your application may not function as expected", error);
|
|
120
129
|
}
|
|
121
130
|
}
|
|
122
|
-
async
|
|
131
|
+
scheduleReboot = (0, _system.debounce)(async ()=>{
|
|
132
|
+
this.rebootTail = this.rebootTail.then(()=>this.runReboot(), ()=>this.runReboot());
|
|
133
|
+
}, REBOOT_DEBOUNCE_MS);
|
|
134
|
+
async runReboot() {
|
|
135
|
+
if (this.disposed) return;
|
|
123
136
|
this.logger.trace("Rebooting entry module");
|
|
124
137
|
await this.disposeEntry();
|
|
125
|
-
this.emit("reboot");
|
|
126
138
|
await this.bootEntry();
|
|
139
|
+
this.emit("reboot");
|
|
127
140
|
}
|
|
128
141
|
async disposeEntry() {
|
|
129
|
-
|
|
142
|
+
const entry = this.entryModule;
|
|
143
|
+
this.entryModule = undefined;
|
|
144
|
+
try {
|
|
145
|
+
await entry?.[Symbol.asyncDispose]();
|
|
146
|
+
} catch (error) {
|
|
147
|
+
this.logger.error("Entry asyncDispose failed", error);
|
|
148
|
+
}
|
|
130
149
|
}
|
|
131
|
-
scheduleReboot = (0, _system.debounce)(()=>this.reboot(), REBOOT_DEBOUNCE_MS);
|
|
132
150
|
// ── Setup ────────────────────────────────────────────────────────────────
|
|
133
151
|
async resolveWorkspace(options) {
|
|
134
152
|
return options.workspace ?? _mesh.WorkspaceFactory.create({
|
|
@@ -164,7 +182,13 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
164
182
|
resolve: (specifier, context, next)=>{
|
|
165
183
|
if (this.disposed) return next(specifier, context);
|
|
166
184
|
const parentUrl = context.parentURL ?? "";
|
|
167
|
-
const rewritten =
|
|
185
|
+
const rewritten = (0, _rewriteservespecifier.rewriteServeSpecifier)({
|
|
186
|
+
specifier,
|
|
187
|
+
parentUrl,
|
|
188
|
+
isWatchedTs: (filePath)=>this.fileInfoMap.has(filePath),
|
|
189
|
+
resolveBare: (bare)=>_mesh.packageAliases.resolvePath(bare, this.aliasPaths, this.aliasBaseUrl),
|
|
190
|
+
versionFileUrl: (fileUrl)=>this.getCachedOrNew(fileUrl)
|
|
191
|
+
}) ?? specifier;
|
|
168
192
|
const result = next(rewritten, context);
|
|
169
193
|
this.onPostResolve(result, parentUrl);
|
|
170
194
|
return result;
|
|
@@ -182,26 +206,13 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
182
206
|
});
|
|
183
207
|
}
|
|
184
208
|
// ── Module hooks ─────────────────────────────────────────────────────────
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
if (!parentClean) return null;
|
|
193
|
-
let jsPath;
|
|
194
|
-
try {
|
|
195
|
-
const resolved = new URL(specifier, parentClean);
|
|
196
|
-
jsPath = _io.io.fileUrlToPath(resolved.toString());
|
|
197
|
-
} catch {
|
|
198
|
-
return null;
|
|
199
|
-
}
|
|
200
|
-
if (!jsPath.endsWith(".js")) return null;
|
|
201
|
-
const tsPath = jsPath.replace(/\.js$/, ".ts");
|
|
202
|
-
if (!this.fileInfoMap.has(tsPath)) return null;
|
|
203
|
-
return this.getCachedOrNew(_io.io.pathToFileUrl(tsPath));
|
|
204
|
-
};
|
|
209
|
+
async buildAliasPaths() {
|
|
210
|
+
const workspace = this.workspace;
|
|
211
|
+
if (workspace == null) return {};
|
|
212
|
+
const packageAliases = workspace.getPackageAliases(this.buildConfig);
|
|
213
|
+
this.aliasBaseUrl = packageAliases.baseUrl;
|
|
214
|
+
return packageAliases.paths;
|
|
215
|
+
}
|
|
205
216
|
/**
|
|
206
217
|
* Post-next dependency tracker: records which source files import which
|
|
207
218
|
* other source files so that reloadIfAffected can traverse the graph.
|
|
@@ -252,7 +263,9 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
252
263
|
});
|
|
253
264
|
if (response.outcome !== "success") {
|
|
254
265
|
this.logger.error(`Failed to transpile ${cleanPath}`, response);
|
|
255
|
-
|
|
266
|
+
// Do not fall through to next(): Vitest/Node loaders can deadlock on a
|
|
267
|
+
// versioned .ts URL. Fail the import so bootEntry can catch and continue.
|
|
268
|
+
throw new Error(`Failed to transpile ${cleanPath}`);
|
|
256
269
|
}
|
|
257
270
|
this.transpileCache.set(cleanPath, response.code);
|
|
258
271
|
return {
|
|
@@ -265,7 +278,8 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
265
278
|
const fullPath = file.fullPath;
|
|
266
279
|
this.logger.trace(`File ${eventName}: ${fullPath}`);
|
|
267
280
|
if (eventName === _io.io.WatchEvents.unlink) {
|
|
268
|
-
this.
|
|
281
|
+
this.transpileCache.delete(fullPath);
|
|
282
|
+
this.moduleCache.set(fullPath, null);
|
|
269
283
|
return;
|
|
270
284
|
}
|
|
271
285
|
if (eventName === _io.io.WatchEvents.add) {
|
|
@@ -351,7 +365,7 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
351
365
|
}
|
|
352
366
|
versionModule(moduleUrl) {
|
|
353
367
|
const versionedUrl = new URL(moduleUrl);
|
|
354
|
-
versionedUrl.searchParams.set(VERSION_URL_PARAM,
|
|
368
|
+
versionedUrl.searchParams.set(VERSION_URL_PARAM, String(++moduleVersionSeq));
|
|
355
369
|
return versionedUrl.toString();
|
|
356
370
|
}
|
|
357
371
|
invalidateModule(...modules) {
|
|
@@ -380,4 +394,4 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
380
394
|
}
|
|
381
395
|
}
|
|
382
396
|
|
|
383
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUge1xuXHRMb2FkRm5PdXRwdXQsXG5cdExvYWRIb29rQ29udGV4dCxcblx0UmVzb2x2ZUZuT3V0cHV0LFxuXHRSZXNvbHZlSG9va0NvbnRleHQsXG59IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJIb29rcyB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQnVpbGRUYXJnZXRzLCBTd2NUcmFuc3BpbGVyLCBXb3Jrc3BhY2VEZWZhdWx0cyB9IGZyb20gXCJAZGVjb2hlcmUvZm9yZ2VcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBXb3Jrc3BhY2VGYWN0b3J5IH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBGaWxlRXgsIGlvIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9pb1wiO1xuaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL3N5c3RlbVwiO1xuaW1wb3J0IHsgdHlwZSBMb2dnZXIsIHNjcmliZSB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG5pbXBvcnQgdHlwZSB7IFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5cbnR5cGUgTG9hZERlbGVnYXRlID0gKHVybDogc3RyaW5nKSA9PiB7IHNvdXJjZTogc3RyaW5nIH0gfCBudWxsO1xuXG5jb25zdCBjdXJyZW50RmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG5jb25zdCBWRVJTSU9OX1VSTF9QQVJBTSA9IFwidmVyc2lvblwiO1xuY29uc3QgUkVCT09UX0RFQk9VTkNFX01TID0gMjUwO1xuXG5leHBvcnQgaW50ZXJmYWNlIEhvdFJlbG9hZFNlcnZlckV2ZW50cyB7XG5cdHN0YXJ0OiBbXTtcblx0cmVib290OiBbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zIHtcblx0LyoqIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbmFtZS4gKi9cblx0YnVpbGRDb25maWc6IHN0cmluZztcblx0LyoqIE5hbWUgb2YgdGhlIHByb2plY3QgdG8gc2VydmUuIERlZmF1bHRzIHRvIHRoZSBmaXJzdCBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UuICovXG5cdHByb2plY3Q/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBQcmUtYnVpbHQgV29ya3NwYWNlIGluc3RhbmNlIHRvIHVzZSBpbnN0ZWFkIG9mIHJ1bm5pbmcgV29ya3NwYWNlRmFjdG9yeS5cblx0ICogVXNlZnVsIGluIHRlc3RzIHRvIGJ5cGFzcyBmaWxlc3lzdGVtLWJhc2VkIHdvcmtzcGFjZSBkaXNjb3ZlcnkuXG5cdCAqL1xuXHR3b3Jrc3BhY2U/OiBXb3Jrc3BhY2U7XG59XG5cbnR5cGUgRmlsZUluZm8gPSB7IHByb2plY3Q6IFByb2plY3QgfTtcblxuZXhwb3J0IGNsYXNzIEhvdFJlbG9hZFNlcnZlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxIb3RSZWxvYWRTZXJ2ZXJFdmVudHM+IHtcblx0Ly8g4pSA4pSAIFN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXHRwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyID0gc2NyaWJlLmxvZ2dlcihIb3RSZWxvYWRTZXJ2ZXIubmFtZSk7XG5cdHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBob29rc1JlZ2lzdGVyZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBlbnRyeU1vZHVsZVBhdGghOiBzdHJpbmc7XG5cdHByaXZhdGUgZW50cnlNb2R1bGU/OiBBc3luY0Rpc3Bvc2FibGU7XG5cdHByaXZhdGUgd29ya3NwYWNlPzogV29ya3NwYWNlO1xuXHRwcml2YXRlIGJ1aWxkQ29uZmlnID0gXCJkZWJ1Z1wiO1xuXHRwcml2YXRlIHdhdGNoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXHQvKiogTWFwIGZyb20gYWJzb2x1dGUgLnRzIHNvdXJjZSBmaWxlIHBhdGggdG8gcHJvamVjdCBpbmZvICovXG5cdHByaXZhdGUgZmlsZUluZm9NYXAgPSBuZXcgTWFwPHN0cmluZywgRmlsZUluZm8+KCk7XG5cdHByaXZhdGUgbW9kdWxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4oKTtcblx0cHJpdmF0ZSBkZXBlbmRlbmNpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cdHByaXZhdGUgdHJhbnNwaWxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXHRwcml2YXRlIHRyYW5zcGlsZXIgPSBuZXcgU3djVHJhbnNwaWxlcigpO1xuXG5cdC8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHB1YmxpYyBhc3luYyBzdGFydChvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKSB7XG5cdFx0dGhpcy5kaXNwb3NlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5jbGVhcigpO1xuXHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuY2xlYXIoKTtcblxuXHRcdGNvbnN0IHsgYnVpbGRDb25maWcgfSA9IG9wdGlvbnM7XG5cdFx0dGhpcy5idWlsZENvbmZpZyA9IGJ1aWxkQ29uZmlnO1xuXHRcdHRoaXMud29ya3NwYWNlID0gYXdhaXQgdGhpcy5yZXNvbHZlV29ya3NwYWNlKG9wdGlvbnMpO1xuXHRcdGNvbnN0IHByb2plY3QgPSB0aGlzLnJlc29sdmVQcm9qZWN0KGJ1aWxkQ29uZmlnLCBvcHRpb25zLnByb2plY3QpO1xuXG5cdFx0dGhpcy5lbnRyeU1vZHVsZVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5nZXRTb3VyY2VFbnRyeVBhdGgoKSk7XG5cdFx0dGhpcy5maWxlSW5mb01hcCA9IGF3YWl0IHRoaXMuYnVpbGRGaWxlSW5mb01hcChidWlsZENvbmZpZyk7XG5cblx0XHR0aGlzLnJlZ2lzdGVySG9va3MoKTtcblx0XHR0aGlzLmludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpO1xuXG5cdFx0YXdhaXQgdGhpcy53b3Jrc3BhY2Uud2F0Y2goYnVpbGRDb25maWcpO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24gPSB0aGlzLndvcmtzcGFjZS5wcm9qZWN0RmlsZUNoYW5nZWQkLnN1YnNjcmliZSh0aGlzLm9uRmlsZUNoYW5nZSk7XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShgU2VydmluZyAke3RoaXMuZW50cnlNb2R1bGVQYXRofWApO1xuXHRcdGF3YWl0IHRoaXMuYm9vdEVudHJ5KCk7XG5cdFx0dGhpcy5lbWl0KFwic3RhcnRcIik7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgZGlzcG9zZSgpIHtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cdFx0dGhpcy53b3Jrc3BhY2U/LltTeW1ib2wuZGlzcG9zZV0oKTtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyeSgpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpIHtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2UoKTtcblx0fVxuXG5cdC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBhc3luYyBib290RW50cnkoKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHVybCA9IHRoaXMudmVyc2lvbk1vZHVsZShpby5wYXRoVG9GaWxlVXJsKHRoaXMuZW50cnlNb2R1bGVQYXRoKSk7XG5cdFx0XHR0aGlzLmVudHJ5TW9kdWxlID0gKGF3YWl0IGltcG9ydCh1cmwpKT8uZGVmYXVsdDtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdFwiVGhlcmUgd2FzIGFuIGVycm9yIGJvb3RpbmcgdGhlIGVudHJ5IHBvaW50LiBZb3VyIGFwcGxpY2F0aW9uIG1heSBub3QgZnVuY3Rpb24gYXMgZXhwZWN0ZWRcIixcblx0XHRcdFx0ZXJyb3IsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcmVib290KCkge1xuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKFwiUmVib290aW5nIGVudHJ5IG1vZHVsZVwiKTtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyeSgpO1xuXHRcdHRoaXMuZW1pdChcInJlYm9vdFwiKTtcblx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyeSgpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwb3NlRW50cnkoKSB7XG5cdFx0YXdhaXQgdGhpcy5lbnRyeU1vZHVsZT8uW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk7XG5cdH1cblxuXHRwcml2YXRlIHNjaGVkdWxlUmVib290ID0gZGVib3VuY2UoKCkgPT4gdGhpcy5yZWJvb3QoKSwgUkVCT09UX0RFQk9VTkNFX01TKTtcblxuXHQvLyDilIDilIAgU2V0dXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBhc3luYyByZXNvbHZlV29ya3NwYWNlKG9wdGlvbnM6IEhvdFJlbG9hZFNlcnZlck9wdGlvbnMpOiBQcm9taXNlPFdvcmtzcGFjZT4ge1xuXHRcdHJldHVybiAoXG5cdFx0XHRvcHRpb25zLndvcmtzcGFjZSA/P1xuXHRcdFx0V29ya3NwYWNlRmFjdG9yeS5jcmVhdGUoeyAuLi5Xb3Jrc3BhY2VEZWZhdWx0cywgcm9vdERpcjogcHJvY2Vzcy5jd2QoKSB9KVxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIHJlc29sdmVQcm9qZWN0KGJ1aWxkQ29uZmlnOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcpOiBQcm9qZWN0IHtcblx0XHRjb25zdCBwcm9qZWN0cyA9IHRoaXMud29ya3NwYWNlPy5nZXRQcm9qZWN0cyhidWlsZENvbmZpZykgPz8gW107XG5cdFx0Y29uc3QgZm91bmQgPSBuYW1lID09IG51bGwgPyBwcm9qZWN0cy5hdCgwKSA6IHByb2plY3RzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gbmFtZSk7XG5cdFx0aWYgKGZvdW5kID09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0bmFtZSA9PSBudWxsXG5cdFx0XHRcdFx0PyBgTm8gcHJvamVjdHMgZm91bmQgZm9yIGNvbmZpZ3VyYXRpb246ICR7YnVpbGRDb25maWd9YFxuXHRcdFx0XHRcdDogYFByb2plY3QgXCIke25hbWV9XCIgbm90IGZvdW5kIGluIHdvcmtzcGFjZWAsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gZm91bmQ7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGJ1aWxkRmlsZUluZm9NYXAoYnVpbGRDb25maWc6IHN0cmluZyk6IFByb21pc2U8TWFwPHN0cmluZywgRmlsZUluZm8+PiB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSB0aGlzLndvcmtzcGFjZT8uZ2V0UHJvamVjdHMoYnVpbGRDb25maWcpID8/IFtdO1xuXHRcdGNvbnN0IGVudHJpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdHByb2plY3RzLm1hcChhc3luYyAocHJvamVjdCkgPT4ge1xuXHRcdFx0XHRjb25zdCBmaWxlcyA9IGF3YWl0IHByb2plY3QuZ2V0QWxsRmlsZXMoKTtcblx0XHRcdFx0cmV0dXJuIGZpbGVzLm1hcCgoZmlsZSk6IFtzdHJpbmcsIEZpbGVJbmZvXSA9PiBbZmlsZS5mdWxsUGF0aCwgeyBwcm9qZWN0IH1dKTtcblx0XHRcdH0pLFxuXHRcdCk7XG5cdFx0cmV0dXJuIG5ldyBNYXAoZW50cmllcy5mbGF0KCkpO1xuXHR9XG5cblx0cHJpdmF0ZSByZWdpc3Rlckhvb2tzKCkge1xuXHRcdGlmICh0aGlzLmhvb2tzUmVnaXN0ZXJlZCkgcmV0dXJuO1xuXHRcdHRoaXMuaG9va3NSZWdpc3RlcmVkID0gdHJ1ZTtcblx0XHRyZWdpc3Rlckhvb2tzKHtcblx0XHRcdHJlc29sdmU6IChcblx0XHRcdFx0c3BlY2lmaWVyOiBzdHJpbmcsXG5cdFx0XHRcdGNvbnRleHQ6IFJlc29sdmVIb29rQ29udGV4dCxcblx0XHRcdFx0bmV4dDogKHNwZWNpZmllcjogc3RyaW5nLCBjb250ZXh0PzogUGFydGlhbDxSZXNvbHZlSG9va0NvbnRleHQ+KSA9PiBSZXNvbHZlRm5PdXRwdXQsXG5cdFx0XHQpID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybiBuZXh0KHNwZWNpZmllciwgY29udGV4dCk7XG5cdFx0XHRcdGNvbnN0IHBhcmVudFVybCA9IGNvbnRleHQucGFyZW50VVJMID8/IFwiXCI7XG5cdFx0XHRcdGNvbnN0IHJld3JpdHRlbiA9IHRoaXMucmV3cml0ZUpzVG9UcyhzcGVjaWZpZXIsIHBhcmVudFVybCkgPz8gc3BlY2lmaWVyO1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBuZXh0KHJld3JpdHRlbiwgY29udGV4dCkgYXMgUmVzb2x2ZUZuT3V0cHV0O1xuXHRcdFx0XHR0aGlzLm9uUG9zdFJlc29sdmUocmVzdWx0LCBwYXJlbnRVcmwpO1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSxcblx0XHRcdGxvYWQ6IChcblx0XHRcdFx0dXJsOiBzdHJpbmcsXG5cdFx0XHRcdGNvbnRleHQ6IExvYWRIb29rQ29udGV4dCxcblx0XHRcdFx0bmV4dDogKHVybDogc3RyaW5nLCBjb250ZXh0PzogUGFydGlhbDxMb2FkSG9va0NvbnRleHQ+KSA9PiBMb2FkRm5PdXRwdXQsXG5cdFx0XHQpOiBMb2FkRm5PdXRwdXQgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuIG5leHQodXJsLCBjb250ZXh0KTtcblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gdGhpcy5sb2FkVHModXJsKTtcblx0XHRcdFx0aWYgKHJlc3VsdCAhPSBudWxsKVxuXHRcdFx0XHRcdHJldHVybiB7IGZvcm1hdDogXCJtb2R1bGVcIiwgc291cmNlOiByZXN1bHQuc291cmNlLCBzaG9ydENpcmN1aXQ6IHRydWUgfTtcblx0XHRcdFx0cmV0dXJuIG5leHQodXJsLCBjb250ZXh0KTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH1cblxuXHQvLyDilIDilIAgTW9kdWxlIGhvb2tzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdC8qKlxuXHQgKiBQcmUtbmV4dCBzcGVjaWZpZXIgcmV3cml0ZXI6IGlmIHNwZWNpZmllciBpcyBhIC5qcyBpbXBvcnQgdGhhdCBtYXBzIHRvIGFcblx0ICoga25vd24gLnRzIHNvdXJjZSBmaWxlLCByZXR1cm5zIHRoZSB2ZXJzaW9uZWQgLnRzIGZpbGUgVVJMIHNvIG5leHQoKSBuZXZlclxuXHQgKiB0cmllcyB0byBsb2FkIGEgbm9uLWV4aXN0ZW50IC5qcyBmaWxlIGZyb20gZGlzay5cblx0ICovXG5cdHByaXZhdGUgcmV3cml0ZUpzVG9UcyA9IChzcGVjaWZpZXI6IHN0cmluZywgcGFyZW50VXJsOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsID0+IHtcblx0XHRpZiAoIXNwZWNpZmllci5lbmRzV2l0aChcIi5qc1wiKSkgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCBwYXJlbnRDbGVhbiA9IHBhcmVudFVybC5zcGxpdChcIj9cIilbMF07XG5cdFx0aWYgKCFwYXJlbnRDbGVhbikgcmV0dXJuIG51bGw7XG5cblx0XHRsZXQganNQYXRoOiBzdHJpbmc7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHJlc29sdmVkID0gbmV3IFVSTChzcGVjaWZpZXIsIHBhcmVudENsZWFuKTtcblx0XHRcdGpzUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgocmVzb2x2ZWQudG9TdHJpbmcoKSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAoIWpzUGF0aC5lbmRzV2l0aChcIi5qc1wiKSkgcmV0dXJuIG51bGw7XG5cdFx0Y29uc3QgdHNQYXRoID0ganNQYXRoLnJlcGxhY2UoL1xcLmpzJC8sIFwiLnRzXCIpO1xuXHRcdGlmICghdGhpcy5maWxlSW5mb01hcC5oYXModHNQYXRoKSkgcmV0dXJuIG51bGw7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRDYWNoZWRPck5ldyhpby5wYXRoVG9GaWxlVXJsKHRzUGF0aCkpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBQb3N0LW5leHQgZGVwZW5kZW5jeSB0cmFja2VyOiByZWNvcmRzIHdoaWNoIHNvdXJjZSBmaWxlcyBpbXBvcnQgd2hpY2hcblx0ICogb3RoZXIgc291cmNlIGZpbGVzIHNvIHRoYXQgcmVsb2FkSWZBZmZlY3RlZCBjYW4gdHJhdmVyc2UgdGhlIGdyYXBoLlxuXHQgKi9cblx0cHJpdmF0ZSBvblBvc3RSZXNvbHZlID0gKHJlc3VsdDogUmVzb2x2ZUZuT3V0cHV0LCBwYXJlbnRVcmw6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHsgdXJsIH0gPSByZXN1bHQ7XG5cdFx0Y29uc3QgcGFyZW50VXJsQ2xlYW4gPSBwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0bGV0IGZpbGVQYXRoOiBzdHJpbmc7XG5cdFx0bGV0IHBhcmVudFBhdGg6IHN0cmluZztcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cdFx0XHR1cmxPYmouc2VhcmNoID0gXCJcIjtcblx0XHRcdGZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aCh1cmxPYmoudG9TdHJpbmcoKSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdHBhcmVudFBhdGggPSBpby5maWxlVXJsVG9QYXRoKHBhcmVudFVybENsZWFuKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHBhcmVudFBhdGggPSBcIlwiO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzU291cmNlID0gdGhpcy5maWxlSW5mb01hcC5oYXMoZmlsZVBhdGgpO1xuXHRcdGNvbnN0IHBhcmVudElzU291cmNlID0gdGhpcy5maWxlSW5mb01hcC5oYXMocGFyZW50UGF0aCk7XG5cblx0XHRpZiAoaXNTb3VyY2UgfHwgcGFyZW50SXNTb3VyY2UpIHtcblx0XHRcdHRoaXMudHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoLCBwYXJlbnRQYXRoKTtcblx0XHR9XG5cdH07XG5cblx0cHJpdmF0ZSBsb2FkVHM6IExvYWREZWxlZ2F0ZSA9ICh1cmw6IHN0cmluZykgPT4ge1xuXHRcdGlmICghdXJsLnN0YXJ0c1dpdGgoXCJmaWxlOlwiKSkgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCBjbGVhblBhdGggPSBuZXcgVVJMKHVybCkucGF0aG5hbWU7XG5cdFx0Y29uc3QgZmlsZUluZm8gPSB0aGlzLmZpbGVJbmZvTWFwLmdldChjbGVhblBhdGgpO1xuXHRcdGlmIChmaWxlSW5mbyA9PSBudWxsKSByZXR1cm4gbnVsbDtcblxuXHRcdGNvbnN0IGNhY2hlZCA9IHRoaXMudHJhbnNwaWxlQ2FjaGUuZ2V0KGNsZWFuUGF0aCk7XG5cdFx0aWYgKGNhY2hlZCAhPSBudWxsKSByZXR1cm4geyBzb3VyY2U6IGNhY2hlZCB9O1xuXG5cdFx0Y29uc3QgeyBwcm9qZWN0IH0gPSBmaWxlSW5mbztcblx0XHRjb25zdCB0c0NvbmZpZyA9IHByb2plY3QuZ2V0VHNDb25maWdTeW5jKCk7XG5cdFx0Y29uc3QgdXNlckNvbmZpZyA9IHByb2plY3QuZ2V0U3djQ29uZmlnU3luYygpO1xuXG5cdFx0Y29uc3QgZmlsZSA9IG5ldyBGaWxlRXgoeyBmdWxsUGF0aDogY2xlYW5QYXRoIH0pO1xuXHRcdGNvbnN0IHJlc3BvbnNlID0gdGhpcy50cmFuc3BpbGVyLnRyYW5zZm9ybUZpbGVTeW5jKGZpbGUsIEJ1aWxkVGFyZ2V0cy5lczYsIHtcblx0XHRcdHRzQ29uZmlnLFxuXHRcdFx0YWxpYXNQYXRoczogdHJ1ZSxcblx0XHRcdHVzZXJDb25maWcsXG5cdFx0XHR3b3Jrc3BhY2U6IHRoaXMud29ya3NwYWNlLFxuXHRcdFx0cHJvamVjdHM6IHRoaXMud29ya3NwYWNlPy5nZXRQcm9qZWN0cyh0aGlzLmJ1aWxkQ29uZmlnKSxcblx0XHR9KTtcblxuXHRcdGlmIChyZXNwb25zZS5vdXRjb21lICE9PSBcInN1Y2Nlc3NcIikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byB0cmFuc3BpbGUgJHtjbGVhblBhdGh9YCwgcmVzcG9uc2UpO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5zZXQoY2xlYW5QYXRoLCByZXNwb25zZS5jb2RlKTtcblx0XHRyZXR1cm4geyBzb3VyY2U6IHJlc3BvbnNlLmNvZGUgfTtcblx0fTtcblxuXHQvLyDilIDilIAgRmlsZSB3YXRjaGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIG9uRmlsZUNoYW5nZSA9IChldnQ6IFByb2plY3RGaWxlRXZlbnQpID0+IHtcblx0XHRjb25zdCB7IGZpbGUsIGV2ZW50TmFtZSwgcHJvamVjdCB9ID0gZXZ0O1xuXHRcdGNvbnN0IGZ1bGxQYXRoID0gZmlsZS5mdWxsUGF0aDtcblxuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBGaWxlICR7ZXZlbnROYW1lfTogJHtmdWxsUGF0aH1gKTtcblxuXHRcdGlmIChldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLnVubGluaykge1xuXHRcdFx0dGhpcy5maWxlSW5mb01hcC5kZWxldGUoZnVsbFBhdGgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLmFkZCkge1xuXHRcdFx0aWYgKHByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSB7XG5cdFx0XHRcdHRoaXMuZmlsZUluZm9NYXAuc2V0KGZ1bGxQYXRoLCB7IHByb2plY3QgfSk7XG5cdFx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZ1bGxQYXRoLCBudWxsKTtcblx0XHRcdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBjaGFuZ2Vcblx0XHRpZiAoIXByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSByZXR1cm47XG5cdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5kZWxldGUoZnVsbFBhdGgpO1xuXHRcdHRoaXMudHJhbnNwaWxlci5pbnZhbGlkYXRlQ29udGVudENhY2hlKG5ldyBGaWxlRXgoeyBmdWxsUGF0aCB9KSk7XG5cdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIHJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChmdWxsUGF0aCk7XG5cdFx0Y29uc3QgbW9kdWxlcyA9IFsuLi5uZXcgU2V0KFsuLi5kZXBzLCBmdWxsUGF0aF0pXTtcblxuXHRcdGlmICghbW9kdWxlcy5pbmNsdWRlcyh0aGlzLmVudHJ5TW9kdWxlUGF0aCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gZG9lcyBub3QgYWZmZWN0IGVudHJ5IOKAlCBza2lwcGluZyByZWxvYWRgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShcblx0XHRcdGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gYWZmZWN0cyAke21vZHVsZXMubGVuZ3RofSBtb2R1bGUocykg4oCUIHNjaGVkdWxpbmcgcmVsb2FkYCxcblx0XHQpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZU1vZHVsZSguLi5tb2R1bGVzKTtcblx0XHR0aGlzLnNjaGVkdWxlUmVib290KCk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyDilIDilIAgRGVwZW5kZW5jeSBncmFwaCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGdldERlcGVuZGVuY3lHcmFwaChtb2R1bGVJZDogc3RyaW5nLCBwYXJlbnRNb2R1bGVzOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nW10ge1xuXHRcdGlmICh0aGlzLmlzU2VsZihtb2R1bGVJZCkpIHJldHVybiBbXTtcblxuXHRcdGNvbnN0IG1vZHVsZURlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQobW9kdWxlSWQpID8/IFtdO1xuXHRcdGlmIChwYXJlbnRNb2R1bGVzLmluY2x1ZGVzKG1vZHVsZUlkKSkge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZDogJHttb2R1bGVJZH1gKTtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRsZXQgc3ViRGVwczogc3RyaW5nW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IGRlcCBvZiBtb2R1bGVEZXBzKSB7XG5cdFx0XHRpZiAoIXRoaXMuZmlsZUluZm9NYXAuaGFzKGRlcCkpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3Qgc3VicyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGRlcCwgW21vZHVsZUlkLCAuLi5wYXJlbnRNb2R1bGVzXSk7XG5cdFx0XHRzdWJEZXBzID0gWy4uLnN1YkRlcHMsIC4uLnN1YnNdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbLi4ubmV3IFNldChbLi4ubW9kdWxlRGVwcywgLi4uc3ViRGVwc10pXTtcblx0fVxuXG5cdHByaXZhdGUgdHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoOiBzdHJpbmcsIHBhcmVudFBhdGg6IHN0cmluZykge1xuXHRcdGlmICghcGFyZW50UGF0aCkgcmV0dXJuO1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQoZmlsZVBhdGgpID8/IFtdO1xuXHRcdGNvbnN0IHVwZGF0ZWREZXBzID0gbmV3IFNldChbLi4uZGVwcywgcGFyZW50UGF0aF0pO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChmaWxlUGF0aCwgWy4uLnVwZGF0ZWREZXBzXSk7XG5cdH1cblxuXHQvLyDilIDilIAgTW9kdWxlIGNhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0Q2FjaGVkT3JOZXcobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgobW9kdWxlVXJsKTtcblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLm1vZHVsZUNhY2hlLmdldChmaWxlUGF0aCk7XG5cdFx0Y29uc3QgdmVyc2lvbmVkID0gY2FjaGVkID8/IHRoaXMudmVyc2lvbk1vZHVsZShtb2R1bGVVcmwpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCB2ZXJzaW9uZWQpO1xuXHRcdHJldHVybiB2ZXJzaW9uZWQ7XG5cdH1cblxuXHRwcml2YXRlIHZlcnNpb25Nb2R1bGUobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCB2ZXJzaW9uZWRVcmwgPSBuZXcgVVJMKG1vZHVsZVVybCk7XG5cdFx0dmVyc2lvbmVkVXJsLnNlYXJjaFBhcmFtcy5zZXQoVkVSU0lPTl9VUkxfUEFSQU0sIERhdGUubm93KCkudG9TdHJpbmcoKSk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZFVybC50b1N0cmluZygpO1xuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlTW9kdWxlKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuZGVsZXRlKG1vZHVsZSk7XG5cdFx0XHQvLyBQcnVuZSBzdGFsZSBvdXRnb2luZyBlZGdlczogcmVtb3ZlIHRoaXMgbW9kdWxlIGFzIGEgcGFyZW50IGZyb20gYWxsIGRlcGVuZGVuY3kgbGlzdHNcblx0XHRcdGZvciAoY29uc3QgW2tleSwgcGFyZW50c10gb2YgdGhpcy5kZXBlbmRlbmNpZXMpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gcCAhPT0gbW9kdWxlKTtcblx0XHRcdFx0aWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmRlbGV0ZShrZXkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChrZXksIGZpbHRlcmVkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzKCkge1xuXHRcdGZvciAoY29uc3QgZmlsZVBhdGggb2YgdGhpcy5maWxlSW5mb01hcC5rZXlzKCkpIHtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCBudWxsKTtcblx0XHR9XG5cdH1cblxuXHQvLyDilIDilIAgVXRpbGl0aWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgaXNTZWxmKGZpbGVQYXRoOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gY3VycmVudEZpbGVQYXRoID09PSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiSG90UmVsb2FkU2VydmVyIiwiY3VycmVudEZpbGVQYXRoIiwiaW8iLCJmaWxlVXJsVG9QYXRoIiwiVkVSU0lPTl9VUkxfUEFSQU0iLCJSRUJPT1RfREVCT1VOQ0VfTVMiLCJFdmVudEVtaXR0ZXIiLCJsb2dnZXIiLCJzY3JpYmUiLCJuYW1lIiwiZGlzcG9zZWQiLCJob29rc1JlZ2lzdGVyZWQiLCJlbnRyeU1vZHVsZVBhdGgiLCJlbnRyeU1vZHVsZSIsIndvcmtzcGFjZSIsImJ1aWxkQ29uZmlnIiwid2F0Y2hTdWJzY3JpcHRpb24iLCJmaWxlSW5mb01hcCIsIk1hcCIsIm1vZHVsZUNhY2hlIiwiZGVwZW5kZW5jaWVzIiwidHJhbnNwaWxlQ2FjaGUiLCJ0cmFuc3BpbGVyIiwiU3djVHJhbnNwaWxlciIsInN0YXJ0Iiwib3B0aW9ucyIsImNsZWFyIiwicmVzb2x2ZVdvcmtzcGFjZSIsInByb2plY3QiLCJyZXNvbHZlUHJvamVjdCIsInBhdGgiLCJyZXNvbHZlIiwiZ2V0U291cmNlRW50cnlQYXRoIiwiYnVpbGRGaWxlSW5mb01hcCIsInJlZ2lzdGVySG9va3MiLCJpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMiLCJ3YXRjaCIsInByb2plY3RGaWxlQ2hhbmdlZCQiLCJzdWJzY3JpYmUiLCJvbkZpbGVDaGFuZ2UiLCJ0cmFjZSIsImJvb3RFbnRyeSIsImVtaXQiLCJkaXNwb3NlIiwidW5zdWJzY3JpYmUiLCJTeW1ib2wiLCJkaXNwb3NlRW50cnkiLCJhc3luY0Rpc3Bvc2UiLCJ1cmwiLCJ2ZXJzaW9uTW9kdWxlIiwicGF0aFRvRmlsZVVybCIsImRlZmF1bHQiLCJlcnJvciIsInJlYm9vdCIsInNjaGVkdWxlUmVib290IiwiZGVib3VuY2UiLCJXb3Jrc3BhY2VGYWN0b3J5IiwiY3JlYXRlIiwiV29ya3NwYWNlRGVmYXVsdHMiLCJyb290RGlyIiwicHJvY2VzcyIsImN3ZCIsInByb2plY3RzIiwiZ2V0UHJvamVjdHMiLCJmb3VuZCIsImF0IiwiZmluZCIsInAiLCJFcnJvciIsImVudHJpZXMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwiZmlsZXMiLCJnZXRBbGxGaWxlcyIsImZpbGUiLCJmdWxsUGF0aCIsImZsYXQiLCJzcGVjaWZpZXIiLCJjb250ZXh0IiwibmV4dCIsInBhcmVudFVybCIsInBhcmVudFVSTCIsInJld3JpdHRlbiIsInJld3JpdGVKc1RvVHMiLCJyZXN1bHQiLCJvblBvc3RSZXNvbHZlIiwibG9hZCIsImxvYWRUcyIsImZvcm1hdCIsInNvdXJjZSIsInNob3J0Q2lyY3VpdCIsImVuZHNXaXRoIiwicGFyZW50Q2xlYW4iLCJzcGxpdCIsImpzUGF0aCIsInJlc29sdmVkIiwiVVJMIiwidG9TdHJpbmciLCJ0c1BhdGgiLCJyZXBsYWNlIiwiaGFzIiwiZ2V0Q2FjaGVkT3JOZXciLCJwYXJlbnRVcmxDbGVhbiIsImZpbGVQYXRoIiwicGFyZW50UGF0aCIsInVybE9iaiIsInNlYXJjaCIsImlzU291cmNlIiwicGFyZW50SXNTb3VyY2UiLCJ0cmFja0RlcGVuZGVuY3kiLCJzdGFydHNXaXRoIiwiY2xlYW5QYXRoIiwicGF0aG5hbWUiLCJmaWxlSW5mbyIsImdldCIsImNhY2hlZCIsInRzQ29uZmlnIiwiZ2V0VHNDb25maWdTeW5jIiwidXNlckNvbmZpZyIsImdldFN3Y0NvbmZpZ1N5bmMiLCJGaWxlRXgiLCJyZXNwb25zZSIsInRyYW5zZm9ybUZpbGVTeW5jIiwiQnVpbGRUYXJnZXRzIiwiZXM2IiwiYWxpYXNQYXRocyIsIm91dGNvbWUiLCJzZXQiLCJjb2RlIiwiZXZ0IiwiZXZlbnROYW1lIiwiV2F0Y2hFdmVudHMiLCJ1bmxpbmsiLCJkZWxldGUiLCJhZGQiLCJpc1NvdXJjZUZpbGUiLCJyZWxvYWRJZkFmZmVjdGVkIiwiaW52YWxpZGF0ZUNvbnRlbnRDYWNoZSIsImRlcHMiLCJnZXREZXBlbmRlbmN5R3JhcGgiLCJtb2R1bGVzIiwiU2V0IiwiaW5jbHVkZXMiLCJsZW5ndGgiLCJpbnZhbGlkYXRlTW9kdWxlIiwibW9kdWxlSWQiLCJwYXJlbnRNb2R1bGVzIiwiaXNTZWxmIiwibW9kdWxlRGVwcyIsInN1YkRlcHMiLCJkZXAiLCJzdWJzIiwidXBkYXRlZERlcHMiLCJtb2R1bGVVcmwiLCJ2ZXJzaW9uZWQiLCJ2ZXJzaW9uZWRVcmwiLCJzZWFyY2hQYXJhbXMiLCJEYXRlIiwibm93IiwibW9kdWxlIiwia2V5IiwicGFyZW50cyIsImZpbHRlcmVkIiwiZmlsdGVyIiwia2V5cyJdLCJtYXBwaW5ncyI6Ijs7OzsrQkEwQ2FBOzs7ZUFBQUE7Ozs0QkExQ2dCOzRCQU9DO2lFQUNiO3VCQUM4QztzQkFFOUI7b0JBQ047d0JBQ0Y7d0JBQ1c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBS3BDLE1BQU1DLGtCQUFrQkMsTUFBRSxDQUFDQyxhQUFhLENBQUM7QUFDekMsTUFBTUMsb0JBQW9CO0FBQzFCLE1BQU1DLHFCQUFxQjtBQXFCcEIsTUFBTUwsd0JBQXdCTSx3QkFBWTtJQUNoRCw0RUFBNEU7SUFDM0RDLFNBQWlCQyxjQUFNLENBQUNELE1BQU0sQ0FBQ1AsZ0JBQWdCUyxJQUFJLEVBQUU7SUFDOURDLFdBQVcsTUFBTTtJQUNqQkMsa0JBQWtCLE1BQU07SUFDeEJDLGdCQUF5QjtJQUN6QkMsWUFBOEI7SUFDOUJDLFVBQXNCO0lBQ3RCQyxjQUFjLFFBQVE7SUFDdEJDLGtCQUFpQztJQUN6QywyREFBMkQsR0FDM0QsQUFBUUMsY0FBYyxJQUFJQyxNQUF3QjtJQUMxQ0Ms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
|
|
397
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUge1xuXHRMb2FkRm5PdXRwdXQsXG5cdExvYWRIb29rQ29udGV4dCxcblx0UmVzb2x2ZUZuT3V0cHV0LFxuXHRSZXNvbHZlSG9va0NvbnRleHQsXG59IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJIb29rcyB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQnVpbGRUYXJnZXRzLCBTd2NUcmFuc3BpbGVyLCBXb3Jrc3BhY2VEZWZhdWx0cyB9IGZyb20gXCJAZGVjb2hlcmUvZm9yZ2VcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBwYWNrYWdlQWxpYXNlcywgV29ya3NwYWNlRmFjdG9yeSB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHsgRmlsZUV4LCBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9zeXN0ZW1cIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgcmV3cml0ZVNlcnZlU3BlY2lmaWVyIH0gZnJvbSBcIi4vcmV3cml0ZS1zZXJ2ZS1zcGVjaWZpZXIuanNcIjtcblxudHlwZSBMb2FkRGVsZWdhdGUgPSAodXJsOiBzdHJpbmcpID0+IHsgc291cmNlOiBzdHJpbmcgfSB8IG51bGw7XG5cbmNvbnN0IGN1cnJlbnRGaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IFZFUlNJT05fVVJMX1BBUkFNID0gXCJ2ZXJzaW9uXCI7XG5jb25zdCBSRUJPT1RfREVCT1VOQ0VfTVMgPSAyNTA7XG5cbi8qKiBQcm9jZXNzLXdpZGU6IE5vZGUncyBFU00gY2FjaGUgaXMgcHJvY2Vzcy1nbG9iYWwsIGluY2x1ZGluZyBhY3Jvc3MgSG90UmVsb2FkU2VydmVyIGluc3RhbmNlcy4gKi9cbmxldCBtb2R1bGVWZXJzaW9uU2VxID0gMDtcblxuZXhwb3J0IGludGVyZmFjZSBIb3RSZWxvYWRTZXJ2ZXJFdmVudHMge1xuXHRzdGFydDogW107XG5cdHJlYm9vdDogW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyT3B0aW9ucyB7XG5cdC8qKiBCdWlsZCBjb25maWd1cmF0aW9uIG5hbWUuICovXG5cdGJ1aWxkQ29uZmlnOiBzdHJpbmc7XG5cdC8qKiBOYW1lIG9mIHRoZSBwcm9qZWN0IHRvIHNlcnZlLiBEZWZhdWx0cyB0byB0aGUgZmlyc3QgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlLiAqL1xuXHRwcm9qZWN0Pzogc3RyaW5nO1xuXHQvKipcblx0ICogUHJlLWJ1aWx0IFdvcmtzcGFjZSBpbnN0YW5jZSB0byB1c2UgaW5zdGVhZCBvZiBydW5uaW5nIFdvcmtzcGFjZUZhY3RvcnkuXG5cdCAqIFVzZWZ1bCBpbiB0ZXN0cyB0byBieXBhc3MgZmlsZXN5c3RlbS1iYXNlZCB3b3Jrc3BhY2UgZGlzY292ZXJ5LlxuXHQgKi9cblx0d29ya3NwYWNlPzogV29ya3NwYWNlO1xufVxuXG50eXBlIEZpbGVJbmZvID0geyBwcm9qZWN0OiBQcm9qZWN0IH07XG5cbmV4cG9ydCBjbGFzcyBIb3RSZWxvYWRTZXJ2ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXI8SG90UmVsb2FkU2VydmVyRXZlbnRzPiB7XG5cdC8vIOKUgOKUgCBTdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlciA9IHNjcmliZS5sb2dnZXIoSG90UmVsb2FkU2VydmVyLm5hbWUpO1xuXHRwcml2YXRlIGRpc3Bvc2VkID0gZmFsc2U7XG5cdHByaXZhdGUgaG9va3NSZWdpc3RlcmVkID0gZmFsc2U7XG5cdHByaXZhdGUgZW50cnlNb2R1bGVQYXRoITogc3RyaW5nO1xuXHRwcml2YXRlIGVudHJ5TW9kdWxlPzogQXN5bmNEaXNwb3NhYmxlO1xuXHRwcml2YXRlIHdvcmtzcGFjZT86IFdvcmtzcGFjZTtcblx0cHJpdmF0ZSBidWlsZENvbmZpZyA9IFwiZGVidWdcIjtcblx0cHJpdmF0ZSB3YXRjaFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblx0LyoqIE1hcCBmcm9tIGFic29sdXRlIC50cyBzb3VyY2UgZmlsZSBwYXRoIHRvIHByb2plY3QgaW5mbyAqL1xuXHRwcml2YXRlIGZpbGVJbmZvTWFwID0gbmV3IE1hcDxzdHJpbmcsIEZpbGVJbmZvPigpO1xuXHRwcml2YXRlIG1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cdHByaXZhdGUgZGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXHRwcml2YXRlIHRyYW5zcGlsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblx0cHJpdmF0ZSB0cmFuc3BpbGVyID0gbmV3IFN3Y1RyYW5zcGlsZXIoKTtcblx0cHJpdmF0ZSBhbGlhc1BhdGhzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcblx0cHJpdmF0ZSBhbGlhc0Jhc2VVcmwgPSBwYXRoLnJlc29sdmUoXCIuXCIpO1xuXHRwcml2YXRlIHJlYm9vdFRhaWw6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblxuXHQvLyDilIDilIAgUHVibGljIEFQSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwdWJsaWMgYXN5bmMgc3RhcnQob3B0aW9uczogSG90UmVsb2FkU2VydmVyT3B0aW9ucykge1xuXHRcdHRoaXMuZGlzcG9zZWQgPSBmYWxzZTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5jbGVhcigpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuY2xlYXIoKTtcblx0XHR0aGlzLnRyYW5zcGlsZUNhY2hlLmNsZWFyKCk7XG5cdFx0dGhpcy5yZWJvb3RUYWlsID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0XHRjb25zdCB7IGJ1aWxkQ29uZmlnIH0gPSBvcHRpb25zO1xuXHRcdHRoaXMuYnVpbGRDb25maWcgPSBidWlsZENvbmZpZztcblx0XHR0aGlzLndvcmtzcGFjZSA9IGF3YWl0IHRoaXMucmVzb2x2ZVdvcmtzcGFjZShvcHRpb25zKTtcblx0XHRjb25zdCBwcm9qZWN0ID0gdGhpcy5yZXNvbHZlUHJvamVjdChidWlsZENvbmZpZywgb3B0aW9ucy5wcm9qZWN0KTtcblxuXHRcdHRoaXMuZW50cnlNb2R1bGVQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZ2V0U291cmNlRW50cnlQYXRoKCkpO1xuXHRcdHRoaXMuZmlsZUluZm9NYXAgPSBhd2FpdCB0aGlzLmJ1aWxkRmlsZUluZm9NYXAoYnVpbGRDb25maWcpO1xuXHRcdHRoaXMuYWxpYXNQYXRocyA9IGF3YWl0IHRoaXMuYnVpbGRBbGlhc1BhdGhzKCk7XG5cblx0XHR0aGlzLnJlZ2lzdGVySG9va3MoKTtcblx0XHR0aGlzLmludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpO1xuXG5cdFx0YXdhaXQgdGhpcy53b3Jrc3BhY2Uud2F0Y2goYnVpbGRDb25maWcpO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24gPSB0aGlzLndvcmtzcGFjZS5wcm9qZWN0RmlsZUNoYW5nZWQkLnN1YnNjcmliZSh0aGlzLm9uRmlsZUNoYW5nZSk7XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShgU2VydmluZyAke3RoaXMuZW50cnlNb2R1bGVQYXRofWApO1xuXHRcdGF3YWl0IHRoaXMuYm9vdEVudHJ5KCk7XG5cdFx0dGhpcy5lbWl0KFwic3RhcnRcIik7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgZGlzcG9zZSgpIHtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cdFx0dGhpcy53b3Jrc3BhY2U/LltTeW1ib2wuZGlzcG9zZV0oKTtcblx0XHRhd2FpdCB0aGlzLnJlYm9vdFRhaWw7XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlRW50cnkoKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlKCk7XG5cdH1cblxuXHQvLyDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgYXN5bmMgYm9vdEVudHJ5KCkge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB1cmwgPSB0aGlzLnZlcnNpb25Nb2R1bGUoaW8ucGF0aFRvRmlsZVVybCh0aGlzLmVudHJ5TW9kdWxlUGF0aCkpO1xuXHRcdFx0dGhpcy5lbnRyeU1vZHVsZSA9IChhd2FpdCBpbXBvcnQodXJsKSk/LmRlZmF1bHQ7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRoaXMuZW50cnlNb2R1bGUgPSB1bmRlZmluZWQ7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcblx0XHRcdFx0XCJUaGVyZSB3YXMgYW4gZXJyb3IgYm9vdGluZyB0aGUgZW50cnkgcG9pbnQuIFlvdXIgYXBwbGljYXRpb24gbWF5IG5vdCBmdW5jdGlvbiBhcyBleHBlY3RlZFwiLFxuXHRcdFx0XHRlcnJvcixcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBzY2hlZHVsZVJlYm9vdCA9IGRlYm91bmNlKGFzeW5jICgpID0+IHtcblx0XHR0aGlzLnJlYm9vdFRhaWwgPSB0aGlzLnJlYm9vdFRhaWwudGhlbihcblx0XHRcdCgpID0+IHRoaXMucnVuUmVib290KCksXG5cdFx0XHQoKSA9PiB0aGlzLnJ1blJlYm9vdCgpLFxuXHRcdCk7XG5cdH0sIFJFQk9PVF9ERUJPVU5DRV9NUyk7XG5cblx0cHJpdmF0ZSBhc3luYyBydW5SZWJvb3QoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLmxvZ2dlci50cmFjZShcIlJlYm9vdGluZyBlbnRyeSBtb2R1bGVcIik7XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlRW50cnkoKTtcblx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyeSgpO1xuXHRcdHRoaXMuZW1pdChcInJlYm9vdFwiKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZGlzcG9zZUVudHJ5KCkge1xuXHRcdGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyeU1vZHVsZTtcblx0XHR0aGlzLmVudHJ5TW9kdWxlID0gdW5kZWZpbmVkO1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCBlbnRyeT8uW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFwiRW50cnkgYXN5bmNEaXNwb3NlIGZhaWxlZFwiLCBlcnJvcik7XG5cdFx0fVxuXHR9XG5cblx0Ly8g4pSA4pSAIFNldHVwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgYXN5bmMgcmVzb2x2ZVdvcmtzcGFjZShvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKTogUHJvbWlzZTxXb3Jrc3BhY2U+IHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0b3B0aW9ucy53b3Jrc3BhY2UgPz9cblx0XHRcdFdvcmtzcGFjZUZhY3RvcnkuY3JlYXRlKHsgLi4uV29ya3NwYWNlRGVmYXVsdHMsIHJvb3REaXI6IHByb2Nlc3MuY3dkKCkgfSlcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlUHJvamVjdChidWlsZENvbmZpZzogc3RyaW5nLCBuYW1lPzogc3RyaW5nKTogUHJvamVjdCB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSB0aGlzLndvcmtzcGFjZT8uZ2V0UHJvamVjdHMoYnVpbGRDb25maWcpID8/IFtdO1xuXHRcdGNvbnN0IGZvdW5kID0gbmFtZSA9PSBudWxsID8gcHJvamVjdHMuYXQoMCkgOiBwcm9qZWN0cy5maW5kKChwKSA9PiBwLm5hbWUgPT09IG5hbWUpO1xuXHRcdGlmIChmb3VuZCA9PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdG5hbWUgPT0gbnVsbFxuXHRcdFx0XHRcdD8gYE5vIHByb2plY3RzIGZvdW5kIGZvciBjb25maWd1cmF0aW9uOiAke2J1aWxkQ29uZmlnfWBcblx0XHRcdFx0XHQ6IGBQcm9qZWN0IFwiJHtuYW1lfVwiIG5vdCBmb3VuZCBpbiB3b3Jrc3BhY2VgLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIGZvdW5kO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBidWlsZEZpbGVJbmZvTWFwKGJ1aWxkQ29uZmlnOiBzdHJpbmcpOiBQcm9taXNlPE1hcDxzdHJpbmcsIEZpbGVJbmZvPj4ge1xuXHRcdGNvbnN0IHByb2plY3RzID0gdGhpcy53b3Jrc3BhY2U/LmdldFByb2plY3RzKGJ1aWxkQ29uZmlnKSA/PyBbXTtcblx0XHRjb25zdCBlbnRyaWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRwcm9qZWN0cy5tYXAoYXN5bmMgKHByb2plY3QpID0+IHtcblx0XHRcdFx0Y29uc3QgZmlsZXMgPSBhd2FpdCBwcm9qZWN0LmdldEFsbEZpbGVzKCk7XG5cdFx0XHRcdHJldHVybiBmaWxlcy5tYXAoKGZpbGUpOiBbc3RyaW5nLCBGaWxlSW5mb10gPT4gW2ZpbGUuZnVsbFBhdGgsIHsgcHJvamVjdCB9XSk7XG5cdFx0XHR9KSxcblx0XHQpO1xuXHRcdHJldHVybiBuZXcgTWFwKGVudHJpZXMuZmxhdCgpKTtcblx0fVxuXG5cdHByaXZhdGUgcmVnaXN0ZXJIb29rcygpIHtcblx0XHRpZiAodGhpcy5ob29rc1JlZ2lzdGVyZWQpIHJldHVybjtcblx0XHR0aGlzLmhvb2tzUmVnaXN0ZXJlZCA9IHRydWU7XG5cdFx0cmVnaXN0ZXJIb29rcyh7XG5cdFx0XHRyZXNvbHZlOiAoXG5cdFx0XHRcdHNwZWNpZmllcjogc3RyaW5nLFxuXHRcdFx0XHRjb250ZXh0OiBSZXNvbHZlSG9va0NvbnRleHQsXG5cdFx0XHRcdG5leHQ6IChzcGVjaWZpZXI6IHN0cmluZywgY29udGV4dD86IFBhcnRpYWw8UmVzb2x2ZUhvb2tDb250ZXh0PikgPT4gUmVzb2x2ZUZuT3V0cHV0LFxuXHRcdFx0KSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm4gbmV4dChzcGVjaWZpZXIsIGNvbnRleHQpO1xuXHRcdFx0XHRjb25zdCBwYXJlbnRVcmwgPSBjb250ZXh0LnBhcmVudFVSTCA/PyBcIlwiO1xuXHRcdFx0XHRjb25zdCByZXdyaXR0ZW4gPVxuXHRcdFx0XHRcdHJld3JpdGVTZXJ2ZVNwZWNpZmllcih7XG5cdFx0XHRcdFx0XHRzcGVjaWZpZXIsXG5cdFx0XHRcdFx0XHRwYXJlbnRVcmwsXG5cdFx0XHRcdFx0XHRpc1dhdGNoZWRUczogKGZpbGVQYXRoKSA9PiB0aGlzLmZpbGVJbmZvTWFwLmhhcyhmaWxlUGF0aCksXG5cdFx0XHRcdFx0XHRyZXNvbHZlQmFyZTogKGJhcmUpID0+XG5cdFx0XHRcdFx0XHRcdHBhY2thZ2VBbGlhc2VzLnJlc29sdmVQYXRoKGJhcmUsIHRoaXMuYWxpYXNQYXRocywgdGhpcy5hbGlhc0Jhc2VVcmwpLFxuXHRcdFx0XHRcdFx0dmVyc2lvbkZpbGVVcmw6IChmaWxlVXJsKSA9PiB0aGlzLmdldENhY2hlZE9yTmV3KGZpbGVVcmwpLFxuXHRcdFx0XHRcdH0pID8/IHNwZWNpZmllcjtcblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gbmV4dChyZXdyaXR0ZW4sIGNvbnRleHQpIGFzIFJlc29sdmVGbk91dHB1dDtcblx0XHRcdFx0dGhpcy5vblBvc3RSZXNvbHZlKHJlc3VsdCwgcGFyZW50VXJsKTtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH0sXG5cdFx0XHRsb2FkOiAoXG5cdFx0XHRcdHVybDogc3RyaW5nLFxuXHRcdFx0XHRjb250ZXh0OiBMb2FkSG9va0NvbnRleHQsXG5cdFx0XHRcdG5leHQ6ICh1cmw6IHN0cmluZywgY29udGV4dD86IFBhcnRpYWw8TG9hZEhvb2tDb250ZXh0PikgPT4gTG9hZEZuT3V0cHV0LFxuXHRcdFx0KTogTG9hZEZuT3V0cHV0ID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybiBuZXh0KHVybCwgY29udGV4dCk7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IHRoaXMubG9hZFRzKHVybCk7XG5cdFx0XHRcdGlmIChyZXN1bHQgIT0gbnVsbClcblx0XHRcdFx0XHRyZXR1cm4geyBmb3JtYXQ6IFwibW9kdWxlXCIsIHNvdXJjZTogcmVzdWx0LnNvdXJjZSwgc2hvcnRDaXJjdWl0OiB0cnVlIH07XG5cdFx0XHRcdHJldHVybiBuZXh0KHVybCwgY29udGV4dCk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9XG5cblx0Ly8g4pSA4pSAIE1vZHVsZSBob29rcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGFzeW5jIGJ1aWxkQWxpYXNQYXRocygpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPj4ge1xuXHRcdGNvbnN0IHdvcmtzcGFjZSA9IHRoaXMud29ya3NwYWNlO1xuXHRcdGlmICh3b3Jrc3BhY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuXG5cdFx0Y29uc3QgcGFja2FnZUFsaWFzZXMgPSB3b3Jrc3BhY2UuZ2V0UGFja2FnZUFsaWFzZXModGhpcy5idWlsZENvbmZpZyk7XG5cdFx0dGhpcy5hbGlhc0Jhc2VVcmwgPSBwYWNrYWdlQWxpYXNlcy5iYXNlVXJsO1xuXHRcdHJldHVybiBwYWNrYWdlQWxpYXNlcy5wYXRocztcblx0fVxuXG5cdC8qKlxuXHQgKiBQb3N0LW5leHQgZGVwZW5kZW5jeSB0cmFja2VyOiByZWNvcmRzIHdoaWNoIHNvdXJjZSBmaWxlcyBpbXBvcnQgd2hpY2hcblx0ICogb3RoZXIgc291cmNlIGZpbGVzIHNvIHRoYXQgcmVsb2FkSWZBZmZlY3RlZCBjYW4gdHJhdmVyc2UgdGhlIGdyYXBoLlxuXHQgKi9cblx0cHJpdmF0ZSBvblBvc3RSZXNvbHZlID0gKHJlc3VsdDogUmVzb2x2ZUZuT3V0cHV0LCBwYXJlbnRVcmw6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHsgdXJsIH0gPSByZXN1bHQ7XG5cdFx0Y29uc3QgcGFyZW50VXJsQ2xlYW4gPSBwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0bGV0IGZpbGVQYXRoOiBzdHJpbmc7XG5cdFx0bGV0IHBhcmVudFBhdGg6IHN0cmluZztcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cdFx0XHR1cmxPYmouc2VhcmNoID0gXCJcIjtcblx0XHRcdGZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aCh1cmxPYmoudG9TdHJpbmcoKSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdHBhcmVudFBhdGggPSBpby5maWxlVXJsVG9QYXRoKHBhcmVudFVybENsZWFuKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHBhcmVudFBhdGggPSBcIlwiO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzU291cmNlID0gdGhpcy5maWxlSW5mb01hcC5oYXMoZmlsZVBhdGgpO1xuXHRcdGNvbnN0IHBhcmVudElzU291cmNlID0gdGhpcy5maWxlSW5mb01hcC5oYXMocGFyZW50UGF0aCk7XG5cblx0XHRpZiAoaXNTb3VyY2UgfHwgcGFyZW50SXNTb3VyY2UpIHtcblx0XHRcdHRoaXMudHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoLCBwYXJlbnRQYXRoKTtcblx0XHR9XG5cdH07XG5cblx0cHJpdmF0ZSBsb2FkVHM6IExvYWREZWxlZ2F0ZSA9ICh1cmw6IHN0cmluZykgPT4ge1xuXHRcdGlmICghdXJsLnN0YXJ0c1dpdGgoXCJmaWxlOlwiKSkgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCBjbGVhblBhdGggPSBuZXcgVVJMKHVybCkucGF0aG5hbWU7XG5cdFx0Y29uc3QgZmlsZUluZm8gPSB0aGlzLmZpbGVJbmZvTWFwLmdldChjbGVhblBhdGgpO1xuXHRcdGlmIChmaWxlSW5mbyA9PSBudWxsKSByZXR1cm4gbnVsbDtcblxuXHRcdGNvbnN0IGNhY2hlZCA9IHRoaXMudHJhbnNwaWxlQ2FjaGUuZ2V0KGNsZWFuUGF0aCk7XG5cdFx0aWYgKGNhY2hlZCAhPSBudWxsKSByZXR1cm4geyBzb3VyY2U6IGNhY2hlZCB9O1xuXG5cdFx0Y29uc3QgeyBwcm9qZWN0IH0gPSBmaWxlSW5mbztcblx0XHRjb25zdCB0c0NvbmZpZyA9IHByb2plY3QuZ2V0VHNDb25maWdTeW5jKCk7XG5cdFx0Y29uc3QgdXNlckNvbmZpZyA9IHByb2plY3QuZ2V0U3djQ29uZmlnU3luYygpO1xuXG5cdFx0Y29uc3QgZmlsZSA9IG5ldyBGaWxlRXgoeyBmdWxsUGF0aDogY2xlYW5QYXRoIH0pO1xuXHRcdGNvbnN0IHJlc3BvbnNlID0gdGhpcy50cmFuc3BpbGVyLnRyYW5zZm9ybUZpbGVTeW5jKGZpbGUsIEJ1aWxkVGFyZ2V0cy5lczYsIHtcblx0XHRcdHRzQ29uZmlnLFxuXHRcdFx0YWxpYXNQYXRoczogdHJ1ZSxcblx0XHRcdHVzZXJDb25maWcsXG5cdFx0XHR3b3Jrc3BhY2U6IHRoaXMud29ya3NwYWNlLFxuXHRcdFx0cHJvamVjdHM6IHRoaXMud29ya3NwYWNlPy5nZXRQcm9qZWN0cyh0aGlzLmJ1aWxkQ29uZmlnKSxcblx0XHR9KTtcblxuXHRcdGlmIChyZXNwb25zZS5vdXRjb21lICE9PSBcInN1Y2Nlc3NcIikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byB0cmFuc3BpbGUgJHtjbGVhblBhdGh9YCwgcmVzcG9uc2UpO1xuXHRcdFx0Ly8gRG8gbm90IGZhbGwgdGhyb3VnaCB0byBuZXh0KCk6IFZpdGVzdC9Ob2RlIGxvYWRlcnMgY2FuIGRlYWRsb2NrIG9uIGFcblx0XHRcdC8vIHZlcnNpb25lZCAudHMgVVJMLiBGYWlsIHRoZSBpbXBvcnQgc28gYm9vdEVudHJ5IGNhbiBjYXRjaCBhbmQgY29udGludWUuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB0cmFuc3BpbGUgJHtjbGVhblBhdGh9YCk7XG5cdFx0fVxuXG5cdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5zZXQoY2xlYW5QYXRoLCByZXNwb25zZS5jb2RlKTtcblx0XHRyZXR1cm4geyBzb3VyY2U6IHJlc3BvbnNlLmNvZGUgfTtcblx0fTtcblxuXHQvLyDilIDilIAgRmlsZSB3YXRjaGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIG9uRmlsZUNoYW5nZSA9IChldnQ6IFByb2plY3RGaWxlRXZlbnQpID0+IHtcblx0XHRjb25zdCB7IGZpbGUsIGV2ZW50TmFtZSwgcHJvamVjdCB9ID0gZXZ0O1xuXHRcdGNvbnN0IGZ1bGxQYXRoID0gZmlsZS5mdWxsUGF0aDtcblxuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBGaWxlICR7ZXZlbnROYW1lfTogJHtmdWxsUGF0aH1gKTtcblxuXHRcdGlmIChldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLnVubGluaykge1xuXHRcdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5kZWxldGUoZnVsbFBhdGgpO1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZnVsbFBhdGgsIG51bGwpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLmFkZCkge1xuXHRcdFx0aWYgKHByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSB7XG5cdFx0XHRcdHRoaXMuZmlsZUluZm9NYXAuc2V0KGZ1bGxQYXRoLCB7IHByb2plY3QgfSk7XG5cdFx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZ1bGxQYXRoLCBudWxsKTtcblx0XHRcdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBjaGFuZ2Vcblx0XHRpZiAoIXByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSByZXR1cm47XG5cdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5kZWxldGUoZnVsbFBhdGgpO1xuXHRcdHRoaXMudHJhbnNwaWxlci5pbnZhbGlkYXRlQ29udGVudENhY2hlKG5ldyBGaWxlRXgoeyBmdWxsUGF0aCB9KSk7XG5cdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIHJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChmdWxsUGF0aCk7XG5cdFx0Y29uc3QgbW9kdWxlcyA9IFsuLi5uZXcgU2V0KFsuLi5kZXBzLCBmdWxsUGF0aF0pXTtcblxuXHRcdGlmICghbW9kdWxlcy5pbmNsdWRlcyh0aGlzLmVudHJ5TW9kdWxlUGF0aCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gZG9lcyBub3QgYWZmZWN0IGVudHJ5IOKAlCBza2lwcGluZyByZWxvYWRgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShcblx0XHRcdGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gYWZmZWN0cyAke21vZHVsZXMubGVuZ3RofSBtb2R1bGUocykg4oCUIHNjaGVkdWxpbmcgcmVsb2FkYCxcblx0XHQpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZU1vZHVsZSguLi5tb2R1bGVzKTtcblx0XHR0aGlzLnNjaGVkdWxlUmVib290KCk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyDilIDilIAgRGVwZW5kZW5jeSBncmFwaCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGdldERlcGVuZGVuY3lHcmFwaChtb2R1bGVJZDogc3RyaW5nLCBwYXJlbnRNb2R1bGVzOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nW10ge1xuXHRcdGlmICh0aGlzLmlzU2VsZihtb2R1bGVJZCkpIHJldHVybiBbXTtcblxuXHRcdGNvbnN0IG1vZHVsZURlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQobW9kdWxlSWQpID8/IFtdO1xuXHRcdGlmIChwYXJlbnRNb2R1bGVzLmluY2x1ZGVzKG1vZHVsZUlkKSkge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZDogJHttb2R1bGVJZH1gKTtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRsZXQgc3ViRGVwczogc3RyaW5nW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IGRlcCBvZiBtb2R1bGVEZXBzKSB7XG5cdFx0XHRpZiAoIXRoaXMuZmlsZUluZm9NYXAuaGFzKGRlcCkpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3Qgc3VicyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGRlcCwgW21vZHVsZUlkLCAuLi5wYXJlbnRNb2R1bGVzXSk7XG5cdFx0XHRzdWJEZXBzID0gWy4uLnN1YkRlcHMsIC4uLnN1YnNdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbLi4ubmV3IFNldChbLi4ubW9kdWxlRGVwcywgLi4uc3ViRGVwc10pXTtcblx0fVxuXG5cdHByaXZhdGUgdHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoOiBzdHJpbmcsIHBhcmVudFBhdGg6IHN0cmluZykge1xuXHRcdGlmICghcGFyZW50UGF0aCkgcmV0dXJuO1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQoZmlsZVBhdGgpID8/IFtdO1xuXHRcdGNvbnN0IHVwZGF0ZWREZXBzID0gbmV3IFNldChbLi4uZGVwcywgcGFyZW50UGF0aF0pO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChmaWxlUGF0aCwgWy4uLnVwZGF0ZWREZXBzXSk7XG5cdH1cblxuXHQvLyDilIDilIAgTW9kdWxlIGNhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0Q2FjaGVkT3JOZXcobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgobW9kdWxlVXJsKTtcblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLm1vZHVsZUNhY2hlLmdldChmaWxlUGF0aCk7XG5cdFx0Y29uc3QgdmVyc2lvbmVkID0gY2FjaGVkID8/IHRoaXMudmVyc2lvbk1vZHVsZShtb2R1bGVVcmwpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCB2ZXJzaW9uZWQpO1xuXHRcdHJldHVybiB2ZXJzaW9uZWQ7XG5cdH1cblxuXHRwcml2YXRlIHZlcnNpb25Nb2R1bGUobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCB2ZXJzaW9uZWRVcmwgPSBuZXcgVVJMKG1vZHVsZVVybCk7XG5cdFx0dmVyc2lvbmVkVXJsLnNlYXJjaFBhcmFtcy5zZXQoVkVSU0lPTl9VUkxfUEFSQU0sIFN0cmluZygrK21vZHVsZVZlcnNpb25TZXEpKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkVXJsLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVNb2R1bGUoLi4ubW9kdWxlczogc3RyaW5nW10pIHtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChtb2R1bGUsIG51bGwpO1xuXHRcdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5kZWxldGUobW9kdWxlKTtcblx0XHRcdC8vIFBydW5lIHN0YWxlIG91dGdvaW5nIGVkZ2VzOiByZW1vdmUgdGhpcyBtb2R1bGUgYXMgYSBwYXJlbnQgZnJvbSBhbGwgZGVwZW5kZW5jeSBsaXN0c1xuXHRcdFx0Zm9yIChjb25zdCBba2V5LCBwYXJlbnRzXSBvZiB0aGlzLmRlcGVuZGVuY2llcykge1xuXHRcdFx0XHRjb25zdCBmaWx0ZXJlZCA9IHBhcmVudHMuZmlsdGVyKChwKSA9PiBwICE9PSBtb2R1bGUpO1xuXHRcdFx0XHRpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZGVsZXRlKGtleSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuc2V0KGtleSwgZmlsdGVyZWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMoKSB7XG5cdFx0Zm9yIChjb25zdCBmaWxlUGF0aCBvZiB0aGlzLmZpbGVJbmZvTWFwLmtleXMoKSkge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZmlsZVBhdGgsIG51bGwpO1xuXHRcdH1cblx0fVxuXG5cdC8vIOKUgOKUgCBVdGlsaXRpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBpc1NlbGYoZmlsZVBhdGg6IHN0cmluZykge1xuXHRcdHJldHVybiBjdXJyZW50RmlsZVBhdGggPT09IHBhdGgucmVzb2x2ZShmaWxlUGF0aCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJIb3RSZWxvYWRTZXJ2ZXIiLCJjdXJyZW50RmlsZVBhdGgiLCJpbyIsImZpbGVVcmxUb1BhdGgiLCJWRVJTSU9OX1VSTF9QQVJBTSIsIlJFQk9PVF9ERUJPVU5DRV9NUyIsIm1vZHVsZVZlcnNpb25TZXEiLCJFdmVudEVtaXR0ZXIiLCJsb2dnZXIiLCJzY3JpYmUiLCJuYW1lIiwiZGlzcG9zZWQiLCJob29rc1JlZ2lzdGVyZWQiLCJlbnRyeU1vZHVsZVBhdGgiLCJlbnRyeU1vZHVsZSIsIndvcmtzcGFjZSIsImJ1aWxkQ29uZmlnIiwid2F0Y2hTdWJzY3JpcHRpb24iLCJmaWxlSW5mb01hcCIsIk1hcCIsIm1vZHVsZUNhY2hlIiwiZGVwZW5kZW5jaWVzIiwidHJhbnNwaWxlQ2FjaGUiLCJ0cmFuc3BpbGVyIiwiU3djVHJhbnNwaWxlciIsImFsaWFzUGF0aHMiLCJhbGlhc0Jhc2VVcmwiLCJwYXRoIiwicmVzb2x2ZSIsInJlYm9vdFRhaWwiLCJQcm9taXNlIiwic3RhcnQiLCJvcHRpb25zIiwiY2xlYXIiLCJyZXNvbHZlV29ya3NwYWNlIiwicHJvamVjdCIsInJlc29sdmVQcm9qZWN0IiwiZ2V0U291cmNlRW50cnlQYXRoIiwiYnVpbGRGaWxlSW5mb01hcCIsImJ1aWxkQWxpYXNQYXRocyIsInJlZ2lzdGVySG9va3MiLCJpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMiLCJ3YXRjaCIsInByb2plY3RGaWxlQ2hhbmdlZCQiLCJzdWJzY3JpYmUiLCJvbkZpbGVDaGFuZ2UiLCJ0cmFjZSIsImJvb3RFbnRyeSIsImVtaXQiLCJkaXNwb3NlIiwidW5zdWJzY3JpYmUiLCJTeW1ib2wiLCJkaXNwb3NlRW50cnkiLCJhc3luY0Rpc3Bvc2UiLCJ1cmwiLCJ2ZXJzaW9uTW9kdWxlIiwicGF0aFRvRmlsZVVybCIsImRlZmF1bHQiLCJlcnJvciIsInVuZGVmaW5lZCIsInNjaGVkdWxlUmVib290IiwiZGVib3VuY2UiLCJ0aGVuIiwicnVuUmVib290IiwiZW50cnkiLCJXb3Jrc3BhY2VGYWN0b3J5IiwiY3JlYXRlIiwiV29ya3NwYWNlRGVmYXVsdHMiLCJyb290RGlyIiwicHJvY2VzcyIsImN3ZCIsInByb2plY3RzIiwiZ2V0UHJvamVjdHMiLCJmb3VuZCIsImF0IiwiZmluZCIsInAiLCJFcnJvciIsImVudHJpZXMiLCJhbGwiLCJtYXAiLCJmaWxlcyIsImdldEFsbEZpbGVzIiwiZmlsZSIsImZ1bGxQYXRoIiwiZmxhdCIsInNwZWNpZmllciIsImNvbnRleHQiLCJuZXh0IiwicGFyZW50VXJsIiwicGFyZW50VVJMIiwicmV3cml0dGVuIiwicmV3cml0ZVNlcnZlU3BlY2lmaWVyIiwiaXNXYXRjaGVkVHMiLCJmaWxlUGF0aCIsImhhcyIsInJlc29sdmVCYXJlIiwiYmFyZSIsInBhY2thZ2VBbGlhc2VzIiwicmVzb2x2ZVBhdGgiLCJ2ZXJzaW9uRmlsZVVybCIsImZpbGVVcmwiLCJnZXRDYWNoZWRPck5ldyIsInJlc3VsdCIsIm9uUG9zdFJlc29sdmUiLCJsb2FkIiwibG9hZFRzIiwiZm9ybWF0Iiwic291cmNlIiwic2hvcnRDaXJjdWl0IiwiZ2V0UGFja2FnZUFsaWFzZXMiLCJiYXNlVXJsIiwicGF0aHMiLCJwYXJlbnRVcmxDbGVhbiIsInNwbGl0IiwicGFyZW50UGF0aCIsInVybE9iaiIsIlVSTCIsInNlYXJjaCIsInRvU3RyaW5nIiwiaXNTb3VyY2UiLCJwYXJlbnRJc1NvdXJjZSIsInRyYWNrRGVwZW5kZW5jeSIsInN0YXJ0c1dpdGgiLCJjbGVhblBhdGgiLCJwYXRobmFtZSIsImZpbGVJbmZvIiwiZ2V0IiwiY2FjaGVkIiwidHNDb25maWciLCJnZXRUc0NvbmZpZ1N5bmMiLCJ1c2VyQ29uZmlnIiwiZ2V0U3djQ29uZmlnU3luYyIsIkZpbGVFeCIsInJlc3BvbnNlIiwidHJhbnNmb3JtRmlsZVN5bmMiLCJCdWlsZFRhcmdldHMiLCJlczYiLCJvdXRjb21lIiwic2V0IiwiY29kZSIsImV2dCIsImV2ZW50TmFtZSIsIldhdGNoRXZlbnRzIiwidW5saW5rIiwiZGVsZXRlIiwiYWRkIiwiaXNTb3VyY2VGaWxlIiwicmVsb2FkSWZBZmZlY3RlZCIsImludmFsaWRhdGVDb250ZW50Q2FjaGUiLCJkZXBzIiwiZ2V0RGVwZW5kZW5jeUdyYXBoIiwibW9kdWxlcyIsIlNldCIsImluY2x1ZGVzIiwibGVuZ3RoIiwiaW52YWxpZGF0ZU1vZHVsZSIsIm1vZHVsZUlkIiwicGFyZW50TW9kdWxlcyIsImlzU2VsZiIsIm1vZHVsZURlcHMiLCJzdWJEZXBzIiwiZGVwIiwic3VicyIsInVwZGF0ZWREZXBzIiwibW9kdWxlVXJsIiwidmVyc2lvbmVkIiwidmVyc2lvbmVkVXJsIiwic2VhcmNoUGFyYW1zIiwiU3RyaW5nIiwibW9kdWxlIiwia2V5IiwicGFyZW50cyIsImZpbHRlcmVkIiwiZmlsdGVyIiwia2V5cyJdLCJtYXBwaW5ncyI6Ijs7OzsrQkE4Q2FBOzs7ZUFBQUE7Ozs0QkE5Q2dCOzRCQU9DO2lFQUNiO3VCQUM4QztzQkFFZDtvQkFDdEI7d0JBQ0Y7d0JBQ1c7dUNBRUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSXRDLE1BQU1DLGtCQUFrQkMsTUFBRSxDQUFDQyxhQUFhLENBQUM7QUFDekMsTUFBTUMsb0JBQW9CO0FBQzFCLE1BQU1DLHFCQUFxQjtBQUUzQixrR0FBa0csR0FDbEcsSUFBSUMsbUJBQW1CO0FBcUJoQixNQUFNTix3QkFBd0JPLHdCQUFZO0lBQ2hELDRFQUE0RTtJQUMzREMsU0FBaUJDLGNBQU0sQ0FBQ0QsTUFBTSxDQUFD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
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "rewriteServeSpecifier", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return rewriteServeSpecifier;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _nodeurl = require("node:url");
|
|
12
|
+
const _mesh = require("@decohere/mesh");
|
|
13
|
+
function rewriteServeSpecifier(options) {
|
|
14
|
+
const { specifier, parentUrl, isWatchedTs, resolveBare, versionFileUrl } = options;
|
|
15
|
+
const relativeTs = resolveRelativeWatchedTs(specifier, parentUrl, isWatchedTs);
|
|
16
|
+
if (relativeTs != null) {
|
|
17
|
+
return versionFileUrl((0, _nodeurl.pathToFileURL)(relativeTs).toString());
|
|
18
|
+
}
|
|
19
|
+
const bareTarget = resolveBare(specifier);
|
|
20
|
+
if (bareTarget != null && isWatchedTs(bareTarget)) {
|
|
21
|
+
return versionFileUrl((0, _nodeurl.pathToFileURL)(bareTarget).toString());
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
function resolveRelativeWatchedTs(specifier, parentUrl, isWatchedTs) {
|
|
26
|
+
if (_mesh.packageAliases.isBareSpecifier(specifier)) return null;
|
|
27
|
+
if (!(specifier.startsWith(".") || specifier.startsWith("/"))) return null;
|
|
28
|
+
const parentClean = parentUrl.split("?")[0];
|
|
29
|
+
if (parentClean == null || parentClean === "") return null;
|
|
30
|
+
let resolved;
|
|
31
|
+
try {
|
|
32
|
+
resolved = new URL(specifier, parentClean);
|
|
33
|
+
} catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
if (resolved.protocol !== "file:") return null;
|
|
37
|
+
let filePath = (0, _nodeurl.fileURLToPath)(resolved);
|
|
38
|
+
if (filePath.endsWith(".js")) {
|
|
39
|
+
filePath = `${filePath.slice(0, -3)}.ts`;
|
|
40
|
+
} else if (!filePath.endsWith(".ts")) {
|
|
41
|
+
filePath = `${filePath}.ts`;
|
|
42
|
+
}
|
|
43
|
+
return isWatchedTs(filePath) ? filePath : null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3Jld3JpdGUtc2VydmUtc3BlY2lmaWVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpbGVVUkxUb1BhdGgsIHBhdGhUb0ZpbGVVUkwgfSBmcm9tIFwibm9kZTp1cmxcIjtcbmltcG9ydCB7IHBhY2thZ2VBbGlhc2VzIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5cbmV4cG9ydCB0eXBlIFJld3JpdGVTZXJ2ZVNwZWNpZmllck9wdGlvbnMgPSB7XG5cdHNwZWNpZmllcjogc3RyaW5nO1xuXHRwYXJlbnRVcmw6IHN0cmluZztcblx0aXNXYXRjaGVkVHM6IChhYnNvbHV0ZVBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcblx0cmVzb2x2ZUJhcmU6IChzcGVjaWZpZXI6IHN0cmluZykgPT4gc3RyaW5nIHwgbnVsbDtcblx0dmVyc2lvbkZpbGVVcmw6IChmaWxlVXJsOiBzdHJpbmcpID0+IHN0cmluZztcbn07XG5cbi8qKlxuICogTWFwIGEgcmVzb2x2ZS1ob29rIHNwZWNpZmllciB0byBhIHZlcnNpb25lZCB3YXRjaGVkIGAudHNgIGZpbGUgVVJMLlxuICogQ292ZXJzIHJlbGF0aXZlIGAuanNgIC8gYC50c2AgLyBleHRlbnNpb25sZXNzIGltcG9ydHMgYW5kIGJhcmUgd29ya3NwYWNlXG4gKiBwYWNrYWdlIG5hbWVzIChkeW5hbWljIGBpbXBvcnQoKWAgbmV2ZXIgZ29lcyB0aHJvdWdoIFNXQyBwYXRoIHJld3JpdGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmV3cml0ZVNlcnZlU3BlY2lmaWVyKG9wdGlvbnM6IFJld3JpdGVTZXJ2ZVNwZWNpZmllck9wdGlvbnMpOiBzdHJpbmcgfCBudWxsIHtcblx0Y29uc3QgeyBzcGVjaWZpZXIsIHBhcmVudFVybCwgaXNXYXRjaGVkVHMsIHJlc29sdmVCYXJlLCB2ZXJzaW9uRmlsZVVybCB9ID0gb3B0aW9ucztcblxuXHRjb25zdCByZWxhdGl2ZVRzID0gcmVzb2x2ZVJlbGF0aXZlV2F0Y2hlZFRzKHNwZWNpZmllciwgcGFyZW50VXJsLCBpc1dhdGNoZWRUcyk7XG5cdGlmIChyZWxhdGl2ZVRzICE9IG51bGwpIHtcblx0XHRyZXR1cm4gdmVyc2lvbkZpbGVVcmwocGF0aFRvRmlsZVVSTChyZWxhdGl2ZVRzKS50b1N0cmluZygpKTtcblx0fVxuXG5cdGNvbnN0IGJhcmVUYXJnZXQgPSByZXNvbHZlQmFyZShzcGVjaWZpZXIpO1xuXHRpZiAoYmFyZVRhcmdldCAhPSBudWxsICYmIGlzV2F0Y2hlZFRzKGJhcmVUYXJnZXQpKSB7XG5cdFx0cmV0dXJuIHZlcnNpb25GaWxlVXJsKHBhdGhUb0ZpbGVVUkwoYmFyZVRhcmdldCkudG9TdHJpbmcoKSk7XG5cdH1cblxuXHRyZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVJlbGF0aXZlV2F0Y2hlZFRzKFxuXHRzcGVjaWZpZXI6IHN0cmluZyxcblx0cGFyZW50VXJsOiBzdHJpbmcsXG5cdGlzV2F0Y2hlZFRzOiAoYWJzb2x1dGVQYXRoOiBzdHJpbmcpID0+IGJvb2xlYW4sXG4pOiBzdHJpbmcgfCBudWxsIHtcblx0aWYgKHBhY2thZ2VBbGlhc2VzLmlzQmFyZVNwZWNpZmllcihzcGVjaWZpZXIpKSByZXR1cm4gbnVsbDtcblx0aWYgKCEoc3BlY2lmaWVyLnN0YXJ0c1dpdGgoXCIuXCIpIHx8IHNwZWNpZmllci5zdGFydHNXaXRoKFwiL1wiKSkpIHJldHVybiBudWxsO1xuXG5cdGNvbnN0IHBhcmVudENsZWFuID0gcGFyZW50VXJsLnNwbGl0KFwiP1wiKVswXTtcblx0aWYgKHBhcmVudENsZWFuID09IG51bGwgfHwgcGFyZW50Q2xlYW4gPT09IFwiXCIpIHJldHVybiBudWxsO1xuXG5cdGxldCByZXNvbHZlZDogVVJMO1xuXHR0cnkge1xuXHRcdHJlc29sdmVkID0gbmV3IFVSTChzcGVjaWZpZXIsIHBhcmVudENsZWFuKTtcblx0fSBjYXRjaCB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0aWYgKHJlc29sdmVkLnByb3RvY29sICE9PSBcImZpbGU6XCIpIHJldHVybiBudWxsO1xuXG5cdGxldCBmaWxlUGF0aCA9IGZpbGVVUkxUb1BhdGgocmVzb2x2ZWQpO1xuXHRpZiAoZmlsZVBhdGguZW5kc1dpdGgoXCIuanNcIikpIHtcblx0XHRmaWxlUGF0aCA9IGAke2ZpbGVQYXRoLnNsaWNlKDAsIC0zKX0udHNgO1xuXHR9IGVsc2UgaWYgKCFmaWxlUGF0aC5lbmRzV2l0aChcIi50c1wiKSkge1xuXHRcdGZpbGVQYXRoID0gYCR7ZmlsZVBhdGh9LnRzYDtcblx0fVxuXG5cdHJldHVybiBpc1dhdGNoZWRUcyhmaWxlUGF0aCkgPyBmaWxlUGF0aCA6IG51bGw7XG59XG4iXSwibmFtZXMiOlsicmV3cml0ZVNlcnZlU3BlY2lmaWVyIiwib3B0aW9ucyIsInNwZWNpZmllciIsInBhcmVudFVybCIsImlzV2F0Y2hlZFRzIiwicmVzb2x2ZUJhcmUiLCJ2ZXJzaW9uRmlsZVVybCIsInJlbGF0aXZlVHMiLCJyZXNvbHZlUmVsYXRpdmVXYXRjaGVkVHMiLCJwYXRoVG9GaWxlVVJMIiwidG9TdHJpbmciLCJiYXJlVGFyZ2V0IiwicGFja2FnZUFsaWFzZXMiLCJpc0JhcmVTcGVjaWZpZXIiLCJzdGFydHNXaXRoIiwicGFyZW50Q2xlYW4iLCJzcGxpdCIsInJlc29sdmVkIiwiVVJMIiwicHJvdG9jb2wiLCJmaWxlUGF0aCIsImZpbGVVUkxUb1BhdGgiLCJlbmRzV2l0aCIsInNsaWNlIl0sIm1hcHBpbmdzIjoiOzs7OytCQWdCZ0JBOzs7ZUFBQUE7Ozt5QkFoQjZCO3NCQUNkO0FBZXhCLFNBQVNBLHNCQUFzQkMsT0FBcUM7SUFDMUUsTUFBTSxFQUFFQyxTQUFTLEVBQUVDLFNBQVMsRUFBRUMsV0FBVyxFQUFFQyxXQUFXLEVBQUVDLGNBQWMsRUFBRSxHQUFHTDtJQUUzRSxNQUFNTSxhQUFhQyx5QkFBeUJOLFdBQVdDLFdBQVdDO0lBQ2xFLElBQUlHLGNBQWMsTUFBTTtRQUN2QixPQUFPRCxlQUFlRyxJQUFBQSxzQkFBYSxFQUFDRixZQUFZRyxRQUFRO0lBQ3pEO0lBRUEsTUFBTUMsYUFBYU4sWUFBWUg7SUFDL0IsSUFBSVMsY0FBYyxRQUFRUCxZQUFZTyxhQUFhO1FBQ2xELE9BQU9MLGVBQWVHLElBQUFBLHNCQUFhLEVBQUNFLFlBQVlELFFBQVE7SUFDekQ7SUFFQSxPQUFPO0FBQ1I7QUFFQSxTQUFTRix5QkFDUk4sU0FBaUIsRUFDakJDLFNBQWlCLEVBQ2pCQyxXQUE4QztJQUU5QyxJQUFJUSxvQkFBYyxDQUFDQyxlQUFlLENBQUNYLFlBQVksT0FBTztJQUN0RCxJQUFJLENBQUVBLENBQUFBLFVBQVVZLFVBQVUsQ0FBQyxRQUFRWixVQUFVWSxVQUFVLENBQUMsSUFBRyxHQUFJLE9BQU87SUFFdEUsTUFBTUMsY0FBY1osVUFBVWEsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO0lBQzNDLElBQUlELGVBQWUsUUFBUUEsZ0JBQWdCLElBQUksT0FBTztJQUV0RCxJQUFJRTtJQUNKLElBQUk7UUFDSEEsV0FBVyxJQUFJQyxJQUFJaEIsV0FBV2E7SUFDL0IsRUFBRSxPQUFNO1FBQ1AsT0FBTztJQUNSO0lBQ0EsSUFBSUUsU0FBU0UsUUFBUSxLQUFLLFNBQVMsT0FBTztJQUUxQyxJQUFJQyxXQUFXQyxJQUFBQSxzQkFBYSxFQUFDSjtJQUM3QixJQUFJRyxTQUFTRSxRQUFRLENBQUMsUUFBUTtRQUM3QkYsV0FBVyxHQUFHQSxTQUFTRyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3pDLE9BQU8sSUFBSSxDQUFDSCxTQUFTRSxRQUFRLENBQUMsUUFBUTtRQUNyQ0YsV0FBVyxHQUFHQSxTQUFTLEdBQUcsQ0FBQztJQUM1QjtJQUVBLE9BQU9oQixZQUFZZ0IsWUFBWUEsV0FBVztBQUMzQyJ9
|
|
@@ -2,13 +2,15 @@ import { EventEmitter } from "node:events";
|
|
|
2
2
|
import { registerHooks } from "node:module";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { BuildTargets, SwcTranspiler, WorkspaceDefaults } from "@decohere/forge";
|
|
5
|
-
import { WorkspaceFactory } from "@decohere/mesh";
|
|
5
|
+
import { packageAliases, WorkspaceFactory } from "@decohere/mesh";
|
|
6
6
|
import { FileEx, io } from "@decohere/nexus/io";
|
|
7
7
|
import { debounce } from "@decohere/nexus/system";
|
|
8
8
|
import { scribe } from "@decohere/scribe";
|
|
9
|
+
import { rewriteServeSpecifier } from "./rewrite-serve-specifier.js";
|
|
9
10
|
const currentFilePath = io.fileUrlToPath(import.meta.url);
|
|
10
11
|
const VERSION_URL_PARAM = "version";
|
|
11
12
|
const REBOOT_DEBOUNCE_MS = 250;
|
|
13
|
+
/** Process-wide: Node's ESM cache is process-global, including across HotReloadServer instances. */ let moduleVersionSeq = 0;
|
|
12
14
|
export class HotReloadServer extends EventEmitter {
|
|
13
15
|
// ── State ────────────────────────────────────────────────────────────────
|
|
14
16
|
logger = scribe.logger(HotReloadServer.name);
|
|
@@ -24,18 +26,23 @@ export class HotReloadServer extends EventEmitter {
|
|
|
24
26
|
dependencies = new Map();
|
|
25
27
|
transpileCache = new Map();
|
|
26
28
|
transpiler = new SwcTranspiler();
|
|
29
|
+
aliasPaths = {};
|
|
30
|
+
aliasBaseUrl = path.resolve(".");
|
|
31
|
+
rebootTail = Promise.resolve();
|
|
27
32
|
// ── Public API ───────────────────────────────────────────────────────────
|
|
28
33
|
async start(options) {
|
|
29
34
|
this.disposed = false;
|
|
30
35
|
this.dependencies.clear();
|
|
31
36
|
this.moduleCache.clear();
|
|
32
37
|
this.transpileCache.clear();
|
|
38
|
+
this.rebootTail = Promise.resolve();
|
|
33
39
|
const { buildConfig } = options;
|
|
34
40
|
this.buildConfig = buildConfig;
|
|
35
41
|
this.workspace = await this.resolveWorkspace(options);
|
|
36
42
|
const project = this.resolveProject(buildConfig, options.project);
|
|
37
43
|
this.entryModulePath = path.resolve(project.getSourceEntryPath());
|
|
38
44
|
this.fileInfoMap = await this.buildFileInfoMap(buildConfig);
|
|
45
|
+
this.aliasPaths = await this.buildAliasPaths();
|
|
39
46
|
this.registerHooks();
|
|
40
47
|
this.invalidateAllSourceFiles();
|
|
41
48
|
await this.workspace.watch(buildConfig);
|
|
@@ -49,6 +56,7 @@ export class HotReloadServer extends EventEmitter {
|
|
|
49
56
|
this.disposed = true;
|
|
50
57
|
this.watchSubscription?.unsubscribe();
|
|
51
58
|
this.workspace?.[Symbol.dispose]();
|
|
59
|
+
await this.rebootTail;
|
|
52
60
|
await this.disposeEntry();
|
|
53
61
|
}
|
|
54
62
|
async [Symbol.asyncDispose]() {
|
|
@@ -60,19 +68,29 @@ export class HotReloadServer extends EventEmitter {
|
|
|
60
68
|
const url = this.versionModule(io.pathToFileUrl(this.entryModulePath));
|
|
61
69
|
this.entryModule = (await import(url))?.default;
|
|
62
70
|
} catch (error) {
|
|
71
|
+
this.entryModule = undefined;
|
|
63
72
|
this.logger.error("There was an error booting the entry point. Your application may not function as expected", error);
|
|
64
73
|
}
|
|
65
74
|
}
|
|
66
|
-
async
|
|
75
|
+
scheduleReboot = debounce(async ()=>{
|
|
76
|
+
this.rebootTail = this.rebootTail.then(()=>this.runReboot(), ()=>this.runReboot());
|
|
77
|
+
}, REBOOT_DEBOUNCE_MS);
|
|
78
|
+
async runReboot() {
|
|
79
|
+
if (this.disposed) return;
|
|
67
80
|
this.logger.trace("Rebooting entry module");
|
|
68
81
|
await this.disposeEntry();
|
|
69
|
-
this.emit("reboot");
|
|
70
82
|
await this.bootEntry();
|
|
83
|
+
this.emit("reboot");
|
|
71
84
|
}
|
|
72
85
|
async disposeEntry() {
|
|
73
|
-
|
|
86
|
+
const entry = this.entryModule;
|
|
87
|
+
this.entryModule = undefined;
|
|
88
|
+
try {
|
|
89
|
+
await entry?.[Symbol.asyncDispose]();
|
|
90
|
+
} catch (error) {
|
|
91
|
+
this.logger.error("Entry asyncDispose failed", error);
|
|
92
|
+
}
|
|
74
93
|
}
|
|
75
|
-
scheduleReboot = debounce(()=>this.reboot(), REBOOT_DEBOUNCE_MS);
|
|
76
94
|
// ── Setup ────────────────────────────────────────────────────────────────
|
|
77
95
|
async resolveWorkspace(options) {
|
|
78
96
|
return options.workspace ?? WorkspaceFactory.create({
|
|
@@ -108,7 +126,13 @@ export class HotReloadServer extends EventEmitter {
|
|
|
108
126
|
resolve: (specifier, context, next)=>{
|
|
109
127
|
if (this.disposed) return next(specifier, context);
|
|
110
128
|
const parentUrl = context.parentURL ?? "";
|
|
111
|
-
const rewritten =
|
|
129
|
+
const rewritten = rewriteServeSpecifier({
|
|
130
|
+
specifier,
|
|
131
|
+
parentUrl,
|
|
132
|
+
isWatchedTs: (filePath)=>this.fileInfoMap.has(filePath),
|
|
133
|
+
resolveBare: (bare)=>packageAliases.resolvePath(bare, this.aliasPaths, this.aliasBaseUrl),
|
|
134
|
+
versionFileUrl: (fileUrl)=>this.getCachedOrNew(fileUrl)
|
|
135
|
+
}) ?? specifier;
|
|
112
136
|
const result = next(rewritten, context);
|
|
113
137
|
this.onPostResolve(result, parentUrl);
|
|
114
138
|
return result;
|
|
@@ -126,26 +150,13 @@ export class HotReloadServer extends EventEmitter {
|
|
|
126
150
|
});
|
|
127
151
|
}
|
|
128
152
|
// ── Module hooks ─────────────────────────────────────────────────────────
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
if (!parentClean) return null;
|
|
137
|
-
let jsPath;
|
|
138
|
-
try {
|
|
139
|
-
const resolved = new URL(specifier, parentClean);
|
|
140
|
-
jsPath = io.fileUrlToPath(resolved.toString());
|
|
141
|
-
} catch {
|
|
142
|
-
return null;
|
|
143
|
-
}
|
|
144
|
-
if (!jsPath.endsWith(".js")) return null;
|
|
145
|
-
const tsPath = jsPath.replace(/\.js$/, ".ts");
|
|
146
|
-
if (!this.fileInfoMap.has(tsPath)) return null;
|
|
147
|
-
return this.getCachedOrNew(io.pathToFileUrl(tsPath));
|
|
148
|
-
};
|
|
153
|
+
async buildAliasPaths() {
|
|
154
|
+
const workspace = this.workspace;
|
|
155
|
+
if (workspace == null) return {};
|
|
156
|
+
const packageAliases = workspace.getPackageAliases(this.buildConfig);
|
|
157
|
+
this.aliasBaseUrl = packageAliases.baseUrl;
|
|
158
|
+
return packageAliases.paths;
|
|
159
|
+
}
|
|
149
160
|
/**
|
|
150
161
|
* Post-next dependency tracker: records which source files import which
|
|
151
162
|
* other source files so that reloadIfAffected can traverse the graph.
|
|
@@ -196,7 +207,9 @@ export class HotReloadServer extends EventEmitter {
|
|
|
196
207
|
});
|
|
197
208
|
if (response.outcome !== "success") {
|
|
198
209
|
this.logger.error(`Failed to transpile ${cleanPath}`, response);
|
|
199
|
-
|
|
210
|
+
// Do not fall through to next(): Vitest/Node loaders can deadlock on a
|
|
211
|
+
// versioned .ts URL. Fail the import so bootEntry can catch and continue.
|
|
212
|
+
throw new Error(`Failed to transpile ${cleanPath}`);
|
|
200
213
|
}
|
|
201
214
|
this.transpileCache.set(cleanPath, response.code);
|
|
202
215
|
return {
|
|
@@ -209,7 +222,8 @@ export class HotReloadServer extends EventEmitter {
|
|
|
209
222
|
const fullPath = file.fullPath;
|
|
210
223
|
this.logger.trace(`File ${eventName}: ${fullPath}`);
|
|
211
224
|
if (eventName === io.WatchEvents.unlink) {
|
|
212
|
-
this.
|
|
225
|
+
this.transpileCache.delete(fullPath);
|
|
226
|
+
this.moduleCache.set(fullPath, null);
|
|
213
227
|
return;
|
|
214
228
|
}
|
|
215
229
|
if (eventName === io.WatchEvents.add) {
|
|
@@ -295,7 +309,7 @@ export class HotReloadServer extends EventEmitter {
|
|
|
295
309
|
}
|
|
296
310
|
versionModule(moduleUrl) {
|
|
297
311
|
const versionedUrl = new URL(moduleUrl);
|
|
298
|
-
versionedUrl.searchParams.set(VERSION_URL_PARAM,
|
|
312
|
+
versionedUrl.searchParams.set(VERSION_URL_PARAM, String(++moduleVersionSeq));
|
|
299
313
|
return versionedUrl.toString();
|
|
300
314
|
}
|
|
301
315
|
invalidateModule(...modules) {
|
|
@@ -324,4 +338,4 @@ export class HotReloadServer extends EventEmitter {
|
|
|
324
338
|
}
|
|
325
339
|
}
|
|
326
340
|
|
|
327
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUge1xuXHRMb2FkRm5PdXRwdXQsXG5cdExvYWRIb29rQ29udGV4dCxcblx0UmVzb2x2ZUZuT3V0cHV0LFxuXHRSZXNvbHZlSG9va0NvbnRleHQsXG59IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJIb29rcyB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQnVpbGRUYXJnZXRzLCBTd2NUcmFuc3BpbGVyLCBXb3Jrc3BhY2VEZWZhdWx0cyB9IGZyb20gXCJAZGVjb2hlcmUvZm9yZ2VcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBXb3Jrc3BhY2VGYWN0b3J5IH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBGaWxlRXgsIGlvIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9pb1wiO1xuaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL3N5c3RlbVwiO1xuaW1wb3J0IHsgdHlwZSBMb2dnZXIsIHNjcmliZSB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG5pbXBvcnQgdHlwZSB7IFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5cbnR5cGUgTG9hZERlbGVnYXRlID0gKHVybDogc3RyaW5nKSA9PiB7IHNvdXJjZTogc3RyaW5nIH0gfCBudWxsO1xuXG5jb25zdCBjdXJyZW50RmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG5jb25zdCBWRVJTSU9OX1VSTF9QQVJBTSA9IFwidmVyc2lvblwiO1xuY29uc3QgUkVCT09UX0RFQk9VTkNFX01TID0gMjUwO1xuXG5leHBvcnQgaW50ZXJmYWNlIEhvdFJlbG9hZFNlcnZlckV2ZW50cyB7XG5cdHN0YXJ0OiBbXTtcblx0cmVib290OiBbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zIHtcblx0LyoqIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbmFtZS4gKi9cblx0YnVpbGRDb25maWc6IHN0cmluZztcblx0LyoqIE5hbWUgb2YgdGhlIHByb2plY3QgdG8gc2VydmUuIERlZmF1bHRzIHRvIHRoZSBmaXJzdCBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UuICovXG5cdHByb2plY3Q/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBQcmUtYnVpbHQgV29ya3NwYWNlIGluc3RhbmNlIHRvIHVzZSBpbnN0ZWFkIG9mIHJ1bm5pbmcgV29ya3NwYWNlRmFjdG9yeS5cblx0ICogVXNlZnVsIGluIHRlc3RzIHRvIGJ5cGFzcyBmaWxlc3lzdGVtLWJhc2VkIHdvcmtzcGFjZSBkaXNjb3ZlcnkuXG5cdCAqL1xuXHR3b3Jrc3BhY2U/OiBXb3Jrc3BhY2U7XG59XG5cbnR5cGUgRmlsZUluZm8gPSB7IHByb2plY3Q6IFByb2plY3QgfTtcblxuZXhwb3J0IGNsYXNzIEhvdFJlbG9hZFNlcnZlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxIb3RSZWxvYWRTZXJ2ZXJFdmVudHM+IHtcblx0Ly8g4pSA4pSAIFN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXHRwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyID0gc2NyaWJlLmxvZ2dlcihIb3RSZWxvYWRTZXJ2ZXIubmFtZSk7XG5cdHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBob29rc1JlZ2lzdGVyZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBlbnRyeU1vZHVsZVBhdGghOiBzdHJpbmc7XG5cdHByaXZhdGUgZW50cnlNb2R1bGU/OiBBc3luY0Rpc3Bvc2FibGU7XG5cdHByaXZhdGUgd29ya3NwYWNlPzogV29ya3NwYWNlO1xuXHRwcml2YXRlIGJ1aWxkQ29uZmlnID0gXCJkZWJ1Z1wiO1xuXHRwcml2YXRlIHdhdGNoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXHQvKiogTWFwIGZyb20gYWJzb2x1dGUgLnRzIHNvdXJjZSBmaWxlIHBhdGggdG8gcHJvamVjdCBpbmZvICovXG5cdHByaXZhdGUgZmlsZUluZm9NYXAgPSBuZXcgTWFwPHN0cmluZywgRmlsZUluZm8+KCk7XG5cdHByaXZhdGUgbW9kdWxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4oKTtcblx0cHJpdmF0ZSBkZXBlbmRlbmNpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cdHByaXZhdGUgdHJhbnNwaWxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXHRwcml2YXRlIHRyYW5zcGlsZXIgPSBuZXcgU3djVHJhbnNwaWxlcigpO1xuXG5cdC8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHB1YmxpYyBhc3luYyBzdGFydChvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKSB7XG5cdFx0dGhpcy5kaXNwb3NlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5jbGVhcigpO1xuXHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuY2xlYXIoKTtcblxuXHRcdGNvbnN0IHsgYnVpbGRDb25maWcgfSA9IG9wdGlvbnM7XG5cdFx0dGhpcy5idWlsZENvbmZpZyA9IGJ1aWxkQ29uZmlnO1xuXHRcdHRoaXMud29ya3NwYWNlID0gYXdhaXQgdGhpcy5yZXNvbHZlV29ya3NwYWNlKG9wdGlvbnMpO1xuXHRcdGNvbnN0IHByb2plY3QgPSB0aGlzLnJlc29sdmVQcm9qZWN0KGJ1aWxkQ29uZmlnLCBvcHRpb25zLnByb2plY3QpO1xuXG5cdFx0dGhpcy5lbnRyeU1vZHVsZVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5nZXRTb3VyY2VFbnRyeVBhdGgoKSk7XG5cdFx0dGhpcy5maWxlSW5mb01hcCA9IGF3YWl0IHRoaXMuYnVpbGRGaWxlSW5mb01hcChidWlsZENvbmZpZyk7XG5cblx0XHR0aGlzLnJlZ2lzdGVySG9va3MoKTtcblx0XHR0aGlzLmludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpO1xuXG5cdFx0YXdhaXQgdGhpcy53b3Jrc3BhY2Uud2F0Y2goYnVpbGRDb25maWcpO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24gPSB0aGlzLndvcmtzcGFjZS5wcm9qZWN0RmlsZUNoYW5nZWQkLnN1YnNjcmliZSh0aGlzLm9uRmlsZUNoYW5nZSk7XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShgU2VydmluZyAke3RoaXMuZW50cnlNb2R1bGVQYXRofWApO1xuXHRcdGF3YWl0IHRoaXMuYm9vdEVudHJ5KCk7XG5cdFx0dGhpcy5lbWl0KFwic3RhcnRcIik7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgZGlzcG9zZSgpIHtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cdFx0dGhpcy53b3Jrc3BhY2U/LltTeW1ib2wuZGlzcG9zZV0oKTtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyeSgpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpIHtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2UoKTtcblx0fVxuXG5cdC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBhc3luYyBib290RW50cnkoKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHVybCA9IHRoaXMudmVyc2lvbk1vZHVsZShpby5wYXRoVG9GaWxlVXJsKHRoaXMuZW50cnlNb2R1bGVQYXRoKSk7XG5cdFx0XHR0aGlzLmVudHJ5TW9kdWxlID0gKGF3YWl0IGltcG9ydCh1cmwpKT8uZGVmYXVsdDtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdFwiVGhlcmUgd2FzIGFuIGVycm9yIGJvb3RpbmcgdGhlIGVudHJ5IHBvaW50LiBZb3VyIGFwcGxpY2F0aW9uIG1heSBub3QgZnVuY3Rpb24gYXMgZXhwZWN0ZWRcIixcblx0XHRcdFx0ZXJyb3IsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcmVib290KCkge1xuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKFwiUmVib290aW5nIGVudHJ5IG1vZHVsZVwiKTtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyeSgpO1xuXHRcdHRoaXMuZW1pdChcInJlYm9vdFwiKTtcblx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyeSgpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwb3NlRW50cnkoKSB7XG5cdFx0YXdhaXQgdGhpcy5lbnRyeU1vZHVsZT8uW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk7XG5cdH1cblxuXHRwcml2YXRlIHNjaGVkdWxlUmVib290ID0gZGVib3VuY2UoKCkgPT4gdGhpcy5yZWJvb3QoKSwgUkVCT09UX0RFQk9VTkNFX01TKTtcblxuXHQvLyDilIDilIAgU2V0dXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBhc3luYyByZXNvbHZlV29ya3NwYWNlKG9wdGlvbnM6IEhvdFJlbG9hZFNlcnZlck9wdGlvbnMpOiBQcm9taXNlPFdvcmtzcGFjZT4ge1xuXHRcdHJldHVybiAoXG5cdFx0XHRvcHRpb25zLndvcmtzcGFjZSA/P1xuXHRcdFx0V29ya3NwYWNlRmFjdG9yeS5jcmVhdGUoeyAuLi5Xb3Jrc3BhY2VEZWZhdWx0cywgcm9vdERpcjogcHJvY2Vzcy5jd2QoKSB9KVxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIHJlc29sdmVQcm9qZWN0KGJ1aWxkQ29uZmlnOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcpOiBQcm9qZWN0IHtcblx0XHRjb25zdCBwcm9qZWN0cyA9IHRoaXMud29ya3NwYWNlPy5nZXRQcm9qZWN0cyhidWlsZENvbmZpZykgPz8gW107XG5cdFx0Y29uc3QgZm91bmQgPSBuYW1lID09IG51bGwgPyBwcm9qZWN0cy5hdCgwKSA6IHByb2plY3RzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gbmFtZSk7XG5cdFx0aWYgKGZvdW5kID09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0bmFtZSA9PSBudWxsXG5cdFx0XHRcdFx0PyBgTm8gcHJvamVjdHMgZm91bmQgZm9yIGNvbmZpZ3VyYXRpb246ICR7YnVpbGRDb25maWd9YFxuXHRcdFx0XHRcdDogYFByb2plY3QgXCIke25hbWV9XCIgbm90IGZvdW5kIGluIHdvcmtzcGFjZWAsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gZm91bmQ7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGJ1aWxkRmlsZUluZm9NYXAoYnVpbGRDb25maWc6IHN0cmluZyk6IFByb21pc2U8TWFwPHN0cmluZywgRmlsZUluZm8+PiB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSB0aGlzLndvcmtzcGFjZT8uZ2V0UHJvamVjdHMoYnVpbGRDb25maWcpID8/IFtdO1xuXHRcdGNvbnN0IGVudHJpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdHByb2plY3RzLm1hcChhc3luYyAocHJvamVjdCkgPT4ge1xuXHRcdFx0XHRjb25zdCBmaWxlcyA9IGF3YWl0IHByb2plY3QuZ2V0QWxsRmlsZXMoKTtcblx0XHRcdFx0cmV0dXJuIGZpbGVzLm1hcCgoZmlsZSk6IFtzdHJpbmcsIEZpbGVJbmZvXSA9PiBbZmlsZS5mdWxsUGF0aCwgeyBwcm9qZWN0IH1dKTtcblx0XHRcdH0pLFxuXHRcdCk7XG5cdFx0cmV0dXJuIG5ldyBNYXAoZW50cmllcy5mbGF0KCkpO1xuXHR9XG5cblx0cHJpdmF0ZSByZWdpc3Rlckhvb2tzKCkge1xuXHRcdGlmICh0aGlzLmhvb2tzUmVnaXN0ZXJlZCkgcmV0dXJuO1xuXHRcdHRoaXMuaG9va3NSZWdpc3RlcmVkID0gdHJ1ZTtcblx0XHRyZWdpc3Rlckhvb2tzKHtcblx0XHRcdHJlc29sdmU6IChcblx0XHRcdFx0c3BlY2lmaWVyOiBzdHJpbmcsXG5cdFx0XHRcdGNvbnRleHQ6IFJlc29sdmVIb29rQ29udGV4dCxcblx0XHRcdFx0bmV4dDogKHNwZWNpZmllcjogc3RyaW5nLCBjb250ZXh0PzogUGFydGlhbDxSZXNvbHZlSG9va0NvbnRleHQ+KSA9PiBSZXNvbHZlRm5PdXRwdXQsXG5cdFx0XHQpID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybiBuZXh0KHNwZWNpZmllciwgY29udGV4dCk7XG5cdFx0XHRcdGNvbnN0IHBhcmVudFVybCA9IGNvbnRleHQucGFyZW50VVJMID8/IFwiXCI7XG5cdFx0XHRcdGNvbnN0IHJld3JpdHRlbiA9IHRoaXMucmV3cml0ZUpzVG9UcyhzcGVjaWZpZXIsIHBhcmVudFVybCkgPz8gc3BlY2lmaWVyO1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBuZXh0KHJld3JpdHRlbiwgY29udGV4dCkgYXMgUmVzb2x2ZUZuT3V0cHV0O1xuXHRcdFx0XHR0aGlzLm9uUG9zdFJlc29sdmUocmVzdWx0LCBwYXJlbnRVcmwpO1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSxcblx0XHRcdGxvYWQ6IChcblx0XHRcdFx0dXJsOiBzdHJpbmcsXG5cdFx0XHRcdGNvbnRleHQ6IExvYWRIb29rQ29udGV4dCxcblx0XHRcdFx0bmV4dDogKHVybDogc3RyaW5nLCBjb250ZXh0PzogUGFydGlhbDxMb2FkSG9va0NvbnRleHQ+KSA9PiBMb2FkRm5PdXRwdXQsXG5cdFx0XHQpOiBMb2FkRm5PdXRwdXQgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuIG5leHQodXJsLCBjb250ZXh0KTtcblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gdGhpcy5sb2FkVHModXJsKTtcblx0XHRcdFx0aWYgKHJlc3VsdCAhPSBudWxsKVxuXHRcdFx0XHRcdHJldHVybiB7IGZvcm1hdDogXCJtb2R1bGVcIiwgc291cmNlOiByZXN1bHQuc291cmNlLCBzaG9ydENpcmN1aXQ6IHRydWUgfTtcblx0XHRcdFx0cmV0dXJuIG5leHQodXJsLCBjb250ZXh0KTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH1cblxuXHQvLyDilIDilIAgTW9kdWxlIGhvb2tzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdC8qKlxuXHQgKiBQcmUtbmV4dCBzcGVjaWZpZXIgcmV3cml0ZXI6IGlmIHNwZWNpZmllciBpcyBhIC5qcyBpbXBvcnQgdGhhdCBtYXBzIHRvIGFcblx0ICoga25vd24gLnRzIHNvdXJjZSBmaWxlLCByZXR1cm5zIHRoZSB2ZXJzaW9uZWQgLnRzIGZpbGUgVVJMIHNvIG5leHQoKSBuZXZlclxuXHQgKiB0cmllcyB0byBsb2FkIGEgbm9uLWV4aXN0ZW50IC5qcyBmaWxlIGZyb20gZGlzay5cblx0ICovXG5cdHByaXZhdGUgcmV3cml0ZUpzVG9UcyA9IChzcGVjaWZpZXI6IHN0cmluZywgcGFyZW50VXJsOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsID0+IHtcblx0XHRpZiAoIXNwZWNpZmllci5lbmRzV2l0aChcIi5qc1wiKSkgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCBwYXJlbnRDbGVhbiA9IHBhcmVudFVybC5zcGxpdChcIj9cIilbMF07XG5cdFx0aWYgKCFwYXJlbnRDbGVhbikgcmV0dXJuIG51bGw7XG5cblx0XHRsZXQganNQYXRoOiBzdHJpbmc7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHJlc29sdmVkID0gbmV3IFVSTChzcGVjaWZpZXIsIHBhcmVudENsZWFuKTtcblx0XHRcdGpzUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgocmVzb2x2ZWQudG9TdHJpbmcoKSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAoIWpzUGF0aC5lbmRzV2l0aChcIi5qc1wiKSkgcmV0dXJuIG51bGw7XG5cdFx0Y29uc3QgdHNQYXRoID0ganNQYXRoLnJlcGxhY2UoL1xcLmpzJC8sIFwiLnRzXCIpO1xuXHRcdGlmICghdGhpcy5maWxlSW5mb01hcC5oYXModHNQYXRoKSkgcmV0dXJuIG51bGw7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRDYWNoZWRPck5ldyhpby5wYXRoVG9GaWxlVXJsKHRzUGF0aCkpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBQb3N0LW5leHQgZGVwZW5kZW5jeSB0cmFja2VyOiByZWNvcmRzIHdoaWNoIHNvdXJjZSBmaWxlcyBpbXBvcnQgd2hpY2hcblx0ICogb3RoZXIgc291cmNlIGZpbGVzIHNvIHRoYXQgcmVsb2FkSWZBZmZlY3RlZCBjYW4gdHJhdmVyc2UgdGhlIGdyYXBoLlxuXHQgKi9cblx0cHJpdmF0ZSBvblBvc3RSZXNvbHZlID0gKHJlc3VsdDogUmVzb2x2ZUZuT3V0cHV0LCBwYXJlbnRVcmw6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHsgdXJsIH0gPSByZXN1bHQ7XG5cdFx0Y29uc3QgcGFyZW50VXJsQ2xlYW4gPSBwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0bGV0IGZpbGVQYXRoOiBzdHJpbmc7XG5cdFx0bGV0IHBhcmVudFBhdGg6IHN0cmluZztcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cdFx0XHR1cmxPYmouc2VhcmNoID0gXCJcIjtcblx0XHRcdGZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aCh1cmxPYmoudG9TdHJpbmcoKSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdHBhcmVudFBhdGggPSBpby5maWxlVXJsVG9QYXRoKHBhcmVudFVybENsZWFuKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHBhcmVudFBhdGggPSBcIlwiO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzU291cmNlID0gdGhpcy5maWxlSW5mb01hcC5oYXMoZmlsZVBhdGgpO1xuXHRcdGNvbnN0IHBhcmVudElzU291cmNlID0gdGhpcy5maWxlSW5mb01hcC5oYXMocGFyZW50UGF0aCk7XG5cblx0XHRpZiAoaXNTb3VyY2UgfHwgcGFyZW50SXNTb3VyY2UpIHtcblx0XHRcdHRoaXMudHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoLCBwYXJlbnRQYXRoKTtcblx0XHR9XG5cdH07XG5cblx0cHJpdmF0ZSBsb2FkVHM6IExvYWREZWxlZ2F0ZSA9ICh1cmw6IHN0cmluZykgPT4ge1xuXHRcdGlmICghdXJsLnN0YXJ0c1dpdGgoXCJmaWxlOlwiKSkgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCBjbGVhblBhdGggPSBuZXcgVVJMKHVybCkucGF0aG5hbWU7XG5cdFx0Y29uc3QgZmlsZUluZm8gPSB0aGlzLmZpbGVJbmZvTWFwLmdldChjbGVhblBhdGgpO1xuXHRcdGlmIChmaWxlSW5mbyA9PSBudWxsKSByZXR1cm4gbnVsbDtcblxuXHRcdGNvbnN0IGNhY2hlZCA9IHRoaXMudHJhbnNwaWxlQ2FjaGUuZ2V0KGNsZWFuUGF0aCk7XG5cdFx0aWYgKGNhY2hlZCAhPSBudWxsKSByZXR1cm4geyBzb3VyY2U6IGNhY2hlZCB9O1xuXG5cdFx0Y29uc3QgeyBwcm9qZWN0IH0gPSBmaWxlSW5mbztcblx0XHRjb25zdCB0c0NvbmZpZyA9IHByb2plY3QuZ2V0VHNDb25maWdTeW5jKCk7XG5cdFx0Y29uc3QgdXNlckNvbmZpZyA9IHByb2plY3QuZ2V0U3djQ29uZmlnU3luYygpO1xuXG5cdFx0Y29uc3QgZmlsZSA9IG5ldyBGaWxlRXgoeyBmdWxsUGF0aDogY2xlYW5QYXRoIH0pO1xuXHRcdGNvbnN0IHJlc3BvbnNlID0gdGhpcy50cmFuc3BpbGVyLnRyYW5zZm9ybUZpbGVTeW5jKGZpbGUsIEJ1aWxkVGFyZ2V0cy5lczYsIHtcblx0XHRcdHRzQ29uZmlnLFxuXHRcdFx0YWxpYXNQYXRoczogdHJ1ZSxcblx0XHRcdHVzZXJDb25maWcsXG5cdFx0XHR3b3Jrc3BhY2U6IHRoaXMud29ya3NwYWNlLFxuXHRcdFx0cHJvamVjdHM6IHRoaXMud29ya3NwYWNlPy5nZXRQcm9qZWN0cyh0aGlzLmJ1aWxkQ29uZmlnKSxcblx0XHR9KTtcblxuXHRcdGlmIChyZXNwb25zZS5vdXRjb21lICE9PSBcInN1Y2Nlc3NcIikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byB0cmFuc3BpbGUgJHtjbGVhblBhdGh9YCwgcmVzcG9uc2UpO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5zZXQoY2xlYW5QYXRoLCByZXNwb25zZS5jb2RlKTtcblx0XHRyZXR1cm4geyBzb3VyY2U6IHJlc3BvbnNlLmNvZGUgfTtcblx0fTtcblxuXHQvLyDilIDilIAgRmlsZSB3YXRjaGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIG9uRmlsZUNoYW5nZSA9IChldnQ6IFByb2plY3RGaWxlRXZlbnQpID0+IHtcblx0XHRjb25zdCB7IGZpbGUsIGV2ZW50TmFtZSwgcHJvamVjdCB9ID0gZXZ0O1xuXHRcdGNvbnN0IGZ1bGxQYXRoID0gZmlsZS5mdWxsUGF0aDtcblxuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBGaWxlICR7ZXZlbnROYW1lfTogJHtmdWxsUGF0aH1gKTtcblxuXHRcdGlmIChldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLnVubGluaykge1xuXHRcdFx0dGhpcy5maWxlSW5mb01hcC5kZWxldGUoZnVsbFBhdGgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLmFkZCkge1xuXHRcdFx0aWYgKHByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSB7XG5cdFx0XHRcdHRoaXMuZmlsZUluZm9NYXAuc2V0KGZ1bGxQYXRoLCB7IHByb2plY3QgfSk7XG5cdFx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZ1bGxQYXRoLCBudWxsKTtcblx0XHRcdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBjaGFuZ2Vcblx0XHRpZiAoIXByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSByZXR1cm47XG5cdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5kZWxldGUoZnVsbFBhdGgpO1xuXHRcdHRoaXMudHJhbnNwaWxlci5pbnZhbGlkYXRlQ29udGVudENhY2hlKG5ldyBGaWxlRXgoeyBmdWxsUGF0aCB9KSk7XG5cdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIHJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChmdWxsUGF0aCk7XG5cdFx0Y29uc3QgbW9kdWxlcyA9IFsuLi5uZXcgU2V0KFsuLi5kZXBzLCBmdWxsUGF0aF0pXTtcblxuXHRcdGlmICghbW9kdWxlcy5pbmNsdWRlcyh0aGlzLmVudHJ5TW9kdWxlUGF0aCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gZG9lcyBub3QgYWZmZWN0IGVudHJ5IOKAlCBza2lwcGluZyByZWxvYWRgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShcblx0XHRcdGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gYWZmZWN0cyAke21vZHVsZXMubGVuZ3RofSBtb2R1bGUocykg4oCUIHNjaGVkdWxpbmcgcmVsb2FkYCxcblx0XHQpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZU1vZHVsZSguLi5tb2R1bGVzKTtcblx0XHR0aGlzLnNjaGVkdWxlUmVib290KCk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyDilIDilIAgRGVwZW5kZW5jeSBncmFwaCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGdldERlcGVuZGVuY3lHcmFwaChtb2R1bGVJZDogc3RyaW5nLCBwYXJlbnRNb2R1bGVzOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nW10ge1xuXHRcdGlmICh0aGlzLmlzU2VsZihtb2R1bGVJZCkpIHJldHVybiBbXTtcblxuXHRcdGNvbnN0IG1vZHVsZURlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQobW9kdWxlSWQpID8/IFtdO1xuXHRcdGlmIChwYXJlbnRNb2R1bGVzLmluY2x1ZGVzKG1vZHVsZUlkKSkge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZDogJHttb2R1bGVJZH1gKTtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRsZXQgc3ViRGVwczogc3RyaW5nW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IGRlcCBvZiBtb2R1bGVEZXBzKSB7XG5cdFx0XHRpZiAoIXRoaXMuZmlsZUluZm9NYXAuaGFzKGRlcCkpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3Qgc3VicyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGRlcCwgW21vZHVsZUlkLCAuLi5wYXJlbnRNb2R1bGVzXSk7XG5cdFx0XHRzdWJEZXBzID0gWy4uLnN1YkRlcHMsIC4uLnN1YnNdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbLi4ubmV3IFNldChbLi4ubW9kdWxlRGVwcywgLi4uc3ViRGVwc10pXTtcblx0fVxuXG5cdHByaXZhdGUgdHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoOiBzdHJpbmcsIHBhcmVudFBhdGg6IHN0cmluZykge1xuXHRcdGlmICghcGFyZW50UGF0aCkgcmV0dXJuO1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQoZmlsZVBhdGgpID8/IFtdO1xuXHRcdGNvbnN0IHVwZGF0ZWREZXBzID0gbmV3IFNldChbLi4uZGVwcywgcGFyZW50UGF0aF0pO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChmaWxlUGF0aCwgWy4uLnVwZGF0ZWREZXBzXSk7XG5cdH1cblxuXHQvLyDilIDilIAgTW9kdWxlIGNhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0Q2FjaGVkT3JOZXcobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgobW9kdWxlVXJsKTtcblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLm1vZHVsZUNhY2hlLmdldChmaWxlUGF0aCk7XG5cdFx0Y29uc3QgdmVyc2lvbmVkID0gY2FjaGVkID8/IHRoaXMudmVyc2lvbk1vZHVsZShtb2R1bGVVcmwpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCB2ZXJzaW9uZWQpO1xuXHRcdHJldHVybiB2ZXJzaW9uZWQ7XG5cdH1cblxuXHRwcml2YXRlIHZlcnNpb25Nb2R1bGUobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCB2ZXJzaW9uZWRVcmwgPSBuZXcgVVJMKG1vZHVsZVVybCk7XG5cdFx0dmVyc2lvbmVkVXJsLnNlYXJjaFBhcmFtcy5zZXQoVkVSU0lPTl9VUkxfUEFSQU0sIERhdGUubm93KCkudG9TdHJpbmcoKSk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZFVybC50b1N0cmluZygpO1xuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlTW9kdWxlKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuZGVsZXRlKG1vZHVsZSk7XG5cdFx0XHQvLyBQcnVuZSBzdGFsZSBvdXRnb2luZyBlZGdlczogcmVtb3ZlIHRoaXMgbW9kdWxlIGFzIGEgcGFyZW50IGZyb20gYWxsIGRlcGVuZGVuY3kgbGlzdHNcblx0XHRcdGZvciAoY29uc3QgW2tleSwgcGFyZW50c10gb2YgdGhpcy5kZXBlbmRlbmNpZXMpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gcCAhPT0gbW9kdWxlKTtcblx0XHRcdFx0aWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmRlbGV0ZShrZXkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChrZXksIGZpbHRlcmVkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzKCkge1xuXHRcdGZvciAoY29uc3QgZmlsZVBhdGggb2YgdGhpcy5maWxlSW5mb01hcC5rZXlzKCkpIHtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCBudWxsKTtcblx0XHR9XG5cdH1cblxuXHQvLyDilIDilIAgVXRpbGl0aWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgaXNTZWxmKGZpbGVQYXRoOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gY3VycmVudEZpbGVQYXRoID09PSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiRXZlbnRFbWl0dGVyIiwicmVnaXN0ZXJIb29rcyIsInBhdGgiLCJCdWlsZFRhcmdldHMiLCJTd2NUcmFuc3BpbGVyIiwiV29ya3NwYWNlRGVmYXVsdHMiLCJXb3Jrc3BhY2VGYWN0b3J5IiwiRmlsZUV4IiwiaW8iLCJkZWJvdW5jZSIsInNjcmliZSIsImN1cnJlbnRGaWxlUGF0aCIsImZpbGVVcmxUb1BhdGgiLCJ1cmwiLCJWRVJTSU9OX1VSTF9QQVJBTSIsIlJFQk9PVF9ERUJPVU5DRV9NUyIsIkhvdFJlbG9hZFNlcnZlciIsImxvZ2dlciIsIm5hbWUiLCJkaXNwb3NlZCIsImhvb2tzUmVnaXN0ZXJlZCIsImVudHJ5TW9kdWxlUGF0aCIsImVudHJ5TW9kdWxlIiwid29ya3NwYWNlIiwiYnVpbGRDb25maWciLCJ3YXRjaFN1YnNjcmlwdGlvbiIsImZpbGVJbmZvTWFwIiwiTWFwIiwibW9kdWxlQ2FjaGUiLCJkZXBlbmRlbmNpZXMiLCJ0cmFuc3BpbGVDYWNoZSIsInRyYW5zcGlsZXIiLCJzdGFydCIsIm9wdGlvbnMiLCJjbGVhciIsInJlc29sdmVXb3Jrc3BhY2UiLCJwcm9qZWN0IiwicmVzb2x2ZVByb2plY3QiLCJyZXNvbHZlIiwiZ2V0U291cmNlRW50cnlQYXRoIiwiYnVpbGRGaWxlSW5mb01hcCIsImludmFsaWRhdGVBbGxTb3VyY2VGaWxlcyIsIndhdGNoIiwicHJvamVjdEZpbGVDaGFuZ2VkJCIsInN1YnNjcmliZSIsIm9uRmlsZUNoYW5nZSIsInRyYWNlIiwiYm9vdEVudHJ5IiwiZW1pdCIsImRpc3Bvc2UiLCJ1bnN1YnNjcmliZSIsIlN5bWJvbCIsImRpc3Bvc2VFbnRyeSIsImFzeW5jRGlzcG9zZSIsInZlcnNpb25Nb2R1bGUiLCJwYXRoVG9GaWxlVXJsIiwiZGVmYXVsdCIsImVycm9yIiwicmVib290Iiwic2NoZWR1bGVSZWJvb3QiLCJjcmVhdGUiLCJyb290RGlyIiwicHJvY2VzcyIsImN3ZCIsInByb2plY3RzIiwiZ2V0UHJvamVjdHMiLCJmb3VuZCIsImF0IiwiZmluZCIsInAiLCJFcnJvciIsImVudHJpZXMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwiZmlsZXMiLCJnZXRBbGxGaWxlcyIsImZpbGUiLCJmdWxsUGF0aCIsImZsYXQiLCJzcGVjaWZpZXIiLCJjb250ZXh0IiwibmV4dCIsInBhcmVudFVybCIsInBhcmVudFVSTCIsInJld3JpdHRlbiIsInJld3JpdGVKc1RvVHMiLCJyZXN1bHQiLCJvblBvc3RSZXNvbHZlIiwibG9hZCIsImxvYWRUcyIsImZvcm1hdCIsInNvdXJjZSIsInNob3J0Q2lyY3VpdCIsImVuZHNXaXRoIiwicGFyZW50Q2xlYW4iLCJzcGxpdCIsImpzUGF0aCIsInJlc29sdmVkIiwiVVJMIiwidG9TdHJpbmciLCJ0c1BhdGgiLCJyZXBsYWNlIiwiaGFzIiwiZ2V0Q2FjaGVkT3JOZXciLCJwYXJlbnRVcmxDbGVhbiIsImZpbGVQYXRoIiwicGFyZW50UGF0aCIsInVybE9iaiIsInNlYXJjaCIsImlzU291cmNlIiwicGFyZW50SXNTb3VyY2UiLCJ0cmFja0RlcGVuZGVuY3kiLCJzdGFydHNXaXRoIiwiY2xlYW5QYXRoIiwicGF0aG5hbWUiLCJmaWxlSW5mbyIsImdldCIsImNhY2hlZCIsInRzQ29uZmlnIiwiZ2V0VHNDb25maWdTeW5jIiwidXNlckNvbmZpZyIsImdldFN3Y0NvbmZpZ1N5bmMiLCJyZXNwb25zZSIsInRyYW5zZm9ybUZpbGVTeW5jIiwiZXM2IiwiYWxpYXNQYXRocyIsIm91dGNvbWUiLCJzZXQiLCJjb2RlIiwiZXZ0IiwiZXZlbnROYW1lIiwiV2F0Y2hFdmVudHMiLCJ1bmxpbmsiLCJkZWxldGUiLCJhZGQiLCJpc1NvdXJjZUZpbGUiLCJyZWxvYWRJZkFmZmVjdGVkIiwiaW52YWxpZGF0ZUNvbnRlbnRDYWNoZSIsImRlcHMiLCJnZXREZXBlbmRlbmN5R3JhcGgiLCJtb2R1bGVzIiwiU2V0IiwiaW5jbHVkZXMiLCJsZW5ndGgiLCJpbnZhbGlkYXRlTW9kdWxlIiwibW9kdWxlSWQiLCJwYXJlbnRNb2R1bGVzIiwiaXNTZWxmIiwibW9kdWxlRGVwcyIsInN1YkRlcHMiLCJkZXAiLCJzdWJzIiwidXBkYXRlZERlcHMiLCJtb2R1bGVVcmwiLCJ2ZXJzaW9uZWQiLCJ2ZXJzaW9uZWRVcmwiLCJzZWFyY2hQYXJhbXMiLCJEYXRlIiwibm93IiwibW9kdWxlIiwia2V5IiwicGFyZW50cyIsImZpbHRlcmVkIiwiZmlsdGVyIiwia2V5cyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsWUFBWSxRQUFRLGNBQWM7QUFPM0MsU0FBU0MsYUFBYSxRQUFRLGNBQWM7QUFDNUMsT0FBT0MsVUFBVSxZQUFZO0FBQzdCLFNBQVNDLFlBQVksRUFBRUMsYUFBYSxFQUFFQyxpQkFBaUIsUUFBUSxrQkFBa0I7QUFFakYsU0FBU0MsZ0JBQWdCLFFBQVEsaUJBQWlCO0FBQ2xELFNBQVNDLE1BQU0sRUFBRUMsRUFBRSxRQUFRLHFCQUFxQjtBQUNoRCxTQUFTQyxRQUFRLFFBQVEseUJBQXlCO0FBQ2xELFNBQXNCQyxNQUFNLFFBQVEsbUJBQW1CO0FBS3ZELE1BQU1DLGtCQUFrQkgsR0FBR0ksYUFBYSxDQUFDLFlBQVlDLEdBQUc7QUFDeEQsTUFBTUMsb0JBQW9CO0FBQzFCLE1BQU1DLHFCQUFxQjtBQXFCM0IsT0FBTyxNQUFNQyx3QkFBd0JoQjtJQUNwQyw0RUFBNEU7SUFDM0RpQixTQUFpQlAsT0FBT08sTUFBTSxDQUFDRCxnQkFBZ0JFLElBQUksRUFBRTtJQUM5REMsV0FBVyxNQUFN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
|
|
341
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUge1xuXHRMb2FkRm5PdXRwdXQsXG5cdExvYWRIb29rQ29udGV4dCxcblx0UmVzb2x2ZUZuT3V0cHV0LFxuXHRSZXNvbHZlSG9va0NvbnRleHQsXG59IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJIb29rcyB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQnVpbGRUYXJnZXRzLCBTd2NUcmFuc3BpbGVyLCBXb3Jrc3BhY2VEZWZhdWx0cyB9IGZyb20gXCJAZGVjb2hlcmUvZm9yZ2VcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBwYWNrYWdlQWxpYXNlcywgV29ya3NwYWNlRmFjdG9yeSB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHsgRmlsZUV4LCBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9zeXN0ZW1cIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgcmV3cml0ZVNlcnZlU3BlY2lmaWVyIH0gZnJvbSBcIi4vcmV3cml0ZS1zZXJ2ZS1zcGVjaWZpZXIuanNcIjtcblxudHlwZSBMb2FkRGVsZWdhdGUgPSAodXJsOiBzdHJpbmcpID0+IHsgc291cmNlOiBzdHJpbmcgfSB8IG51bGw7XG5cbmNvbnN0IGN1cnJlbnRGaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IFZFUlNJT05fVVJMX1BBUkFNID0gXCJ2ZXJzaW9uXCI7XG5jb25zdCBSRUJPT1RfREVCT1VOQ0VfTVMgPSAyNTA7XG5cbi8qKiBQcm9jZXNzLXdpZGU6IE5vZGUncyBFU00gY2FjaGUgaXMgcHJvY2Vzcy1nbG9iYWwsIGluY2x1ZGluZyBhY3Jvc3MgSG90UmVsb2FkU2VydmVyIGluc3RhbmNlcy4gKi9cbmxldCBtb2R1bGVWZXJzaW9uU2VxID0gMDtcblxuZXhwb3J0IGludGVyZmFjZSBIb3RSZWxvYWRTZXJ2ZXJFdmVudHMge1xuXHRzdGFydDogW107XG5cdHJlYm9vdDogW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyT3B0aW9ucyB7XG5cdC8qKiBCdWlsZCBjb25maWd1cmF0aW9uIG5hbWUuICovXG5cdGJ1aWxkQ29uZmlnOiBzdHJpbmc7XG5cdC8qKiBOYW1lIG9mIHRoZSBwcm9qZWN0IHRvIHNlcnZlLiBEZWZhdWx0cyB0byB0aGUgZmlyc3QgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlLiAqL1xuXHRwcm9qZWN0Pzogc3RyaW5nO1xuXHQvKipcblx0ICogUHJlLWJ1aWx0IFdvcmtzcGFjZSBpbnN0YW5jZSB0byB1c2UgaW5zdGVhZCBvZiBydW5uaW5nIFdvcmtzcGFjZUZhY3RvcnkuXG5cdCAqIFVzZWZ1bCBpbiB0ZXN0cyB0byBieXBhc3MgZmlsZXN5c3RlbS1iYXNlZCB3b3Jrc3BhY2UgZGlzY292ZXJ5LlxuXHQgKi9cblx0d29ya3NwYWNlPzogV29ya3NwYWNlO1xufVxuXG50eXBlIEZpbGVJbmZvID0geyBwcm9qZWN0OiBQcm9qZWN0IH07XG5cbmV4cG9ydCBjbGFzcyBIb3RSZWxvYWRTZXJ2ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXI8SG90UmVsb2FkU2VydmVyRXZlbnRzPiB7XG5cdC8vIOKUgOKUgCBTdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlciA9IHNjcmliZS5sb2dnZXIoSG90UmVsb2FkU2VydmVyLm5hbWUpO1xuXHRwcml2YXRlIGRpc3Bvc2VkID0gZmFsc2U7XG5cdHByaXZhdGUgaG9va3NSZWdpc3RlcmVkID0gZmFsc2U7XG5cdHByaXZhdGUgZW50cnlNb2R1bGVQYXRoITogc3RyaW5nO1xuXHRwcml2YXRlIGVudHJ5TW9kdWxlPzogQXN5bmNEaXNwb3NhYmxlO1xuXHRwcml2YXRlIHdvcmtzcGFjZT86IFdvcmtzcGFjZTtcblx0cHJpdmF0ZSBidWlsZENvbmZpZyA9IFwiZGVidWdcIjtcblx0cHJpdmF0ZSB3YXRjaFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblx0LyoqIE1hcCBmcm9tIGFic29sdXRlIC50cyBzb3VyY2UgZmlsZSBwYXRoIHRvIHByb2plY3QgaW5mbyAqL1xuXHRwcml2YXRlIGZpbGVJbmZvTWFwID0gbmV3IE1hcDxzdHJpbmcsIEZpbGVJbmZvPigpO1xuXHRwcml2YXRlIG1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cdHByaXZhdGUgZGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXHRwcml2YXRlIHRyYW5zcGlsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblx0cHJpdmF0ZSB0cmFuc3BpbGVyID0gbmV3IFN3Y1RyYW5zcGlsZXIoKTtcblx0cHJpdmF0ZSBhbGlhc1BhdGhzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcblx0cHJpdmF0ZSBhbGlhc0Jhc2VVcmwgPSBwYXRoLnJlc29sdmUoXCIuXCIpO1xuXHRwcml2YXRlIHJlYm9vdFRhaWw6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblxuXHQvLyDilIDilIAgUHVibGljIEFQSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwdWJsaWMgYXN5bmMgc3RhcnQob3B0aW9uczogSG90UmVsb2FkU2VydmVyT3B0aW9ucykge1xuXHRcdHRoaXMuZGlzcG9zZWQgPSBmYWxzZTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5jbGVhcigpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuY2xlYXIoKTtcblx0XHR0aGlzLnRyYW5zcGlsZUNhY2hlLmNsZWFyKCk7XG5cdFx0dGhpcy5yZWJvb3RUYWlsID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0XHRjb25zdCB7IGJ1aWxkQ29uZmlnIH0gPSBvcHRpb25zO1xuXHRcdHRoaXMuYnVpbGRDb25maWcgPSBidWlsZENvbmZpZztcblx0XHR0aGlzLndvcmtzcGFjZSA9IGF3YWl0IHRoaXMucmVzb2x2ZVdvcmtzcGFjZShvcHRpb25zKTtcblx0XHRjb25zdCBwcm9qZWN0ID0gdGhpcy5yZXNvbHZlUHJvamVjdChidWlsZENvbmZpZywgb3B0aW9ucy5wcm9qZWN0KTtcblxuXHRcdHRoaXMuZW50cnlNb2R1bGVQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZ2V0U291cmNlRW50cnlQYXRoKCkpO1xuXHRcdHRoaXMuZmlsZUluZm9NYXAgPSBhd2FpdCB0aGlzLmJ1aWxkRmlsZUluZm9NYXAoYnVpbGRDb25maWcpO1xuXHRcdHRoaXMuYWxpYXNQYXRocyA9IGF3YWl0IHRoaXMuYnVpbGRBbGlhc1BhdGhzKCk7XG5cblx0XHR0aGlzLnJlZ2lzdGVySG9va3MoKTtcblx0XHR0aGlzLmludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpO1xuXG5cdFx0YXdhaXQgdGhpcy53b3Jrc3BhY2Uud2F0Y2goYnVpbGRDb25maWcpO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24gPSB0aGlzLndvcmtzcGFjZS5wcm9qZWN0RmlsZUNoYW5nZWQkLnN1YnNjcmliZSh0aGlzLm9uRmlsZUNoYW5nZSk7XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShgU2VydmluZyAke3RoaXMuZW50cnlNb2R1bGVQYXRofWApO1xuXHRcdGF3YWl0IHRoaXMuYm9vdEVudHJ5KCk7XG5cdFx0dGhpcy5lbWl0KFwic3RhcnRcIik7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgZGlzcG9zZSgpIHtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cdFx0dGhpcy53b3Jrc3BhY2U/LltTeW1ib2wuZGlzcG9zZV0oKTtcblx0XHRhd2FpdCB0aGlzLnJlYm9vdFRhaWw7XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlRW50cnkoKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlKCk7XG5cdH1cblxuXHQvLyDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgYXN5bmMgYm9vdEVudHJ5KCkge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB1cmwgPSB0aGlzLnZlcnNpb25Nb2R1bGUoaW8ucGF0aFRvRmlsZVVybCh0aGlzLmVudHJ5TW9kdWxlUGF0aCkpO1xuXHRcdFx0dGhpcy5lbnRyeU1vZHVsZSA9IChhd2FpdCBpbXBvcnQodXJsKSk/LmRlZmF1bHQ7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRoaXMuZW50cnlNb2R1bGUgPSB1bmRlZmluZWQ7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcblx0XHRcdFx0XCJUaGVyZSB3YXMgYW4gZXJyb3IgYm9vdGluZyB0aGUgZW50cnkgcG9pbnQuIFlvdXIgYXBwbGljYXRpb24gbWF5IG5vdCBmdW5jdGlvbiBhcyBleHBlY3RlZFwiLFxuXHRcdFx0XHRlcnJvcixcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBzY2hlZHVsZVJlYm9vdCA9IGRlYm91bmNlKGFzeW5jICgpID0+IHtcblx0XHR0aGlzLnJlYm9vdFRhaWwgPSB0aGlzLnJlYm9vdFRhaWwudGhlbihcblx0XHRcdCgpID0+IHRoaXMucnVuUmVib290KCksXG5cdFx0XHQoKSA9PiB0aGlzLnJ1blJlYm9vdCgpLFxuXHRcdCk7XG5cdH0sIFJFQk9PVF9ERUJPVU5DRV9NUyk7XG5cblx0cHJpdmF0ZSBhc3luYyBydW5SZWJvb3QoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLmxvZ2dlci50cmFjZShcIlJlYm9vdGluZyBlbnRyeSBtb2R1bGVcIik7XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlRW50cnkoKTtcblx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyeSgpO1xuXHRcdHRoaXMuZW1pdChcInJlYm9vdFwiKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZGlzcG9zZUVudHJ5KCkge1xuXHRcdGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyeU1vZHVsZTtcblx0XHR0aGlzLmVudHJ5TW9kdWxlID0gdW5kZWZpbmVkO1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCBlbnRyeT8uW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFwiRW50cnkgYXN5bmNEaXNwb3NlIGZhaWxlZFwiLCBlcnJvcik7XG5cdFx0fVxuXHR9XG5cblx0Ly8g4pSA4pSAIFNldHVwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgYXN5bmMgcmVzb2x2ZVdvcmtzcGFjZShvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKTogUHJvbWlzZTxXb3Jrc3BhY2U+IHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0b3B0aW9ucy53b3Jrc3BhY2UgPz9cblx0XHRcdFdvcmtzcGFjZUZhY3RvcnkuY3JlYXRlKHsgLi4uV29ya3NwYWNlRGVmYXVsdHMsIHJvb3REaXI6IHByb2Nlc3MuY3dkKCkgfSlcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlUHJvamVjdChidWlsZENvbmZpZzogc3RyaW5nLCBuYW1lPzogc3RyaW5nKTogUHJvamVjdCB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSB0aGlzLndvcmtzcGFjZT8uZ2V0UHJvamVjdHMoYnVpbGRDb25maWcpID8/IFtdO1xuXHRcdGNvbnN0IGZvdW5kID0gbmFtZSA9PSBudWxsID8gcHJvamVjdHMuYXQoMCkgOiBwcm9qZWN0cy5maW5kKChwKSA9PiBwLm5hbWUgPT09IG5hbWUpO1xuXHRcdGlmIChmb3VuZCA9PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdG5hbWUgPT0gbnVsbFxuXHRcdFx0XHRcdD8gYE5vIHByb2plY3RzIGZvdW5kIGZvciBjb25maWd1cmF0aW9uOiAke2J1aWxkQ29uZmlnfWBcblx0XHRcdFx0XHQ6IGBQcm9qZWN0IFwiJHtuYW1lfVwiIG5vdCBmb3VuZCBpbiB3b3Jrc3BhY2VgLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIGZvdW5kO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBidWlsZEZpbGVJbmZvTWFwKGJ1aWxkQ29uZmlnOiBzdHJpbmcpOiBQcm9taXNlPE1hcDxzdHJpbmcsIEZpbGVJbmZvPj4ge1xuXHRcdGNvbnN0IHByb2plY3RzID0gdGhpcy53b3Jrc3BhY2U/LmdldFByb2plY3RzKGJ1aWxkQ29uZmlnKSA/PyBbXTtcblx0XHRjb25zdCBlbnRyaWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRwcm9qZWN0cy5tYXAoYXN5bmMgKHByb2plY3QpID0+IHtcblx0XHRcdFx0Y29uc3QgZmlsZXMgPSBhd2FpdCBwcm9qZWN0LmdldEFsbEZpbGVzKCk7XG5cdFx0XHRcdHJldHVybiBmaWxlcy5tYXAoKGZpbGUpOiBbc3RyaW5nLCBGaWxlSW5mb10gPT4gW2ZpbGUuZnVsbFBhdGgsIHsgcHJvamVjdCB9XSk7XG5cdFx0XHR9KSxcblx0XHQpO1xuXHRcdHJldHVybiBuZXcgTWFwKGVudHJpZXMuZmxhdCgpKTtcblx0fVxuXG5cdHByaXZhdGUgcmVnaXN0ZXJIb29rcygpIHtcblx0XHRpZiAodGhpcy5ob29rc1JlZ2lzdGVyZWQpIHJldHVybjtcblx0XHR0aGlzLmhvb2tzUmVnaXN0ZXJlZCA9IHRydWU7XG5cdFx0cmVnaXN0ZXJIb29rcyh7XG5cdFx0XHRyZXNvbHZlOiAoXG5cdFx0XHRcdHNwZWNpZmllcjogc3RyaW5nLFxuXHRcdFx0XHRjb250ZXh0OiBSZXNvbHZlSG9va0NvbnRleHQsXG5cdFx0XHRcdG5leHQ6IChzcGVjaWZpZXI6IHN0cmluZywgY29udGV4dD86IFBhcnRpYWw8UmVzb2x2ZUhvb2tDb250ZXh0PikgPT4gUmVzb2x2ZUZuT3V0cHV0LFxuXHRcdFx0KSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm4gbmV4dChzcGVjaWZpZXIsIGNvbnRleHQpO1xuXHRcdFx0XHRjb25zdCBwYXJlbnRVcmwgPSBjb250ZXh0LnBhcmVudFVSTCA/PyBcIlwiO1xuXHRcdFx0XHRjb25zdCByZXdyaXR0ZW4gPVxuXHRcdFx0XHRcdHJld3JpdGVTZXJ2ZVNwZWNpZmllcih7XG5cdFx0XHRcdFx0XHRzcGVjaWZpZXIsXG5cdFx0XHRcdFx0XHRwYXJlbnRVcmwsXG5cdFx0XHRcdFx0XHRpc1dhdGNoZWRUczogKGZpbGVQYXRoKSA9PiB0aGlzLmZpbGVJbmZvTWFwLmhhcyhmaWxlUGF0aCksXG5cdFx0XHRcdFx0XHRyZXNvbHZlQmFyZTogKGJhcmUpID0+XG5cdFx0XHRcdFx0XHRcdHBhY2thZ2VBbGlhc2VzLnJlc29sdmVQYXRoKGJhcmUsIHRoaXMuYWxpYXNQYXRocywgdGhpcy5hbGlhc0Jhc2VVcmwpLFxuXHRcdFx0XHRcdFx0dmVyc2lvbkZpbGVVcmw6IChmaWxlVXJsKSA9PiB0aGlzLmdldENhY2hlZE9yTmV3KGZpbGVVcmwpLFxuXHRcdFx0XHRcdH0pID8/IHNwZWNpZmllcjtcblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gbmV4dChyZXdyaXR0ZW4sIGNvbnRleHQpIGFzIFJlc29sdmVGbk91dHB1dDtcblx0XHRcdFx0dGhpcy5vblBvc3RSZXNvbHZlKHJlc3VsdCwgcGFyZW50VXJsKTtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH0sXG5cdFx0XHRsb2FkOiAoXG5cdFx0XHRcdHVybDogc3RyaW5nLFxuXHRcdFx0XHRjb250ZXh0OiBMb2FkSG9va0NvbnRleHQsXG5cdFx0XHRcdG5leHQ6ICh1cmw6IHN0cmluZywgY29udGV4dD86IFBhcnRpYWw8TG9hZEhvb2tDb250ZXh0PikgPT4gTG9hZEZuT3V0cHV0LFxuXHRcdFx0KTogTG9hZEZuT3V0cHV0ID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybiBuZXh0KHVybCwgY29udGV4dCk7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IHRoaXMubG9hZFRzKHVybCk7XG5cdFx0XHRcdGlmIChyZXN1bHQgIT0gbnVsbClcblx0XHRcdFx0XHRyZXR1cm4geyBmb3JtYXQ6IFwibW9kdWxlXCIsIHNvdXJjZTogcmVzdWx0LnNvdXJjZSwgc2hvcnRDaXJjdWl0OiB0cnVlIH07XG5cdFx0XHRcdHJldHVybiBuZXh0KHVybCwgY29udGV4dCk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9XG5cblx0Ly8g4pSA4pSAIE1vZHVsZSBob29rcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGFzeW5jIGJ1aWxkQWxpYXNQYXRocygpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPj4ge1xuXHRcdGNvbnN0IHdvcmtzcGFjZSA9IHRoaXMud29ya3NwYWNlO1xuXHRcdGlmICh3b3Jrc3BhY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuXG5cdFx0Y29uc3QgcGFja2FnZUFsaWFzZXMgPSB3b3Jrc3BhY2UuZ2V0UGFja2FnZUFsaWFzZXModGhpcy5idWlsZENvbmZpZyk7XG5cdFx0dGhpcy5hbGlhc0Jhc2VVcmwgPSBwYWNrYWdlQWxpYXNlcy5iYXNlVXJsO1xuXHRcdHJldHVybiBwYWNrYWdlQWxpYXNlcy5wYXRocztcblx0fVxuXG5cdC8qKlxuXHQgKiBQb3N0LW5leHQgZGVwZW5kZW5jeSB0cmFja2VyOiByZWNvcmRzIHdoaWNoIHNvdXJjZSBmaWxlcyBpbXBvcnQgd2hpY2hcblx0ICogb3RoZXIgc291cmNlIGZpbGVzIHNvIHRoYXQgcmVsb2FkSWZBZmZlY3RlZCBjYW4gdHJhdmVyc2UgdGhlIGdyYXBoLlxuXHQgKi9cblx0cHJpdmF0ZSBvblBvc3RSZXNvbHZlID0gKHJlc3VsdDogUmVzb2x2ZUZuT3V0cHV0LCBwYXJlbnRVcmw6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHsgdXJsIH0gPSByZXN1bHQ7XG5cdFx0Y29uc3QgcGFyZW50VXJsQ2xlYW4gPSBwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0bGV0IGZpbGVQYXRoOiBzdHJpbmc7XG5cdFx0bGV0IHBhcmVudFBhdGg6IHN0cmluZztcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cdFx0XHR1cmxPYmouc2VhcmNoID0gXCJcIjtcblx0XHRcdGZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aCh1cmxPYmoudG9TdHJpbmcoKSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdHBhcmVudFBhdGggPSBpby5maWxlVXJsVG9QYXRoKHBhcmVudFVybENsZWFuKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHBhcmVudFBhdGggPSBcIlwiO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzU291cmNlID0gdGhpcy5maWxlSW5mb01hcC5oYXMoZmlsZVBhdGgpO1xuXHRcdGNvbnN0IHBhcmVudElzU291cmNlID0gdGhpcy5maWxlSW5mb01hcC5oYXMocGFyZW50UGF0aCk7XG5cblx0XHRpZiAoaXNTb3VyY2UgfHwgcGFyZW50SXNTb3VyY2UpIHtcblx0XHRcdHRoaXMudHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoLCBwYXJlbnRQYXRoKTtcblx0XHR9XG5cdH07XG5cblx0cHJpdmF0ZSBsb2FkVHM6IExvYWREZWxlZ2F0ZSA9ICh1cmw6IHN0cmluZykgPT4ge1xuXHRcdGlmICghdXJsLnN0YXJ0c1dpdGgoXCJmaWxlOlwiKSkgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCBjbGVhblBhdGggPSBuZXcgVVJMKHVybCkucGF0aG5hbWU7XG5cdFx0Y29uc3QgZmlsZUluZm8gPSB0aGlzLmZpbGVJbmZvTWFwLmdldChjbGVhblBhdGgpO1xuXHRcdGlmIChmaWxlSW5mbyA9PSBudWxsKSByZXR1cm4gbnVsbDtcblxuXHRcdGNvbnN0IGNhY2hlZCA9IHRoaXMudHJhbnNwaWxlQ2FjaGUuZ2V0KGNsZWFuUGF0aCk7XG5cdFx0aWYgKGNhY2hlZCAhPSBudWxsKSByZXR1cm4geyBzb3VyY2U6IGNhY2hlZCB9O1xuXG5cdFx0Y29uc3QgeyBwcm9qZWN0IH0gPSBmaWxlSW5mbztcblx0XHRjb25zdCB0c0NvbmZpZyA9IHByb2plY3QuZ2V0VHNDb25maWdTeW5jKCk7XG5cdFx0Y29uc3QgdXNlckNvbmZpZyA9IHByb2plY3QuZ2V0U3djQ29uZmlnU3luYygpO1xuXG5cdFx0Y29uc3QgZmlsZSA9IG5ldyBGaWxlRXgoeyBmdWxsUGF0aDogY2xlYW5QYXRoIH0pO1xuXHRcdGNvbnN0IHJlc3BvbnNlID0gdGhpcy50cmFuc3BpbGVyLnRyYW5zZm9ybUZpbGVTeW5jKGZpbGUsIEJ1aWxkVGFyZ2V0cy5lczYsIHtcblx0XHRcdHRzQ29uZmlnLFxuXHRcdFx0YWxpYXNQYXRoczogdHJ1ZSxcblx0XHRcdHVzZXJDb25maWcsXG5cdFx0XHR3b3Jrc3BhY2U6IHRoaXMud29ya3NwYWNlLFxuXHRcdFx0cHJvamVjdHM6IHRoaXMud29ya3NwYWNlPy5nZXRQcm9qZWN0cyh0aGlzLmJ1aWxkQ29uZmlnKSxcblx0XHR9KTtcblxuXHRcdGlmIChyZXNwb25zZS5vdXRjb21lICE9PSBcInN1Y2Nlc3NcIikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byB0cmFuc3BpbGUgJHtjbGVhblBhdGh9YCwgcmVzcG9uc2UpO1xuXHRcdFx0Ly8gRG8gbm90IGZhbGwgdGhyb3VnaCB0byBuZXh0KCk6IFZpdGVzdC9Ob2RlIGxvYWRlcnMgY2FuIGRlYWRsb2NrIG9uIGFcblx0XHRcdC8vIHZlcnNpb25lZCAudHMgVVJMLiBGYWlsIHRoZSBpbXBvcnQgc28gYm9vdEVudHJ5IGNhbiBjYXRjaCBhbmQgY29udGludWUuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB0cmFuc3BpbGUgJHtjbGVhblBhdGh9YCk7XG5cdFx0fVxuXG5cdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5zZXQoY2xlYW5QYXRoLCByZXNwb25zZS5jb2RlKTtcblx0XHRyZXR1cm4geyBzb3VyY2U6IHJlc3BvbnNlLmNvZGUgfTtcblx0fTtcblxuXHQvLyDilIDilIAgRmlsZSB3YXRjaGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIG9uRmlsZUNoYW5nZSA9IChldnQ6IFByb2plY3RGaWxlRXZlbnQpID0+IHtcblx0XHRjb25zdCB7IGZpbGUsIGV2ZW50TmFtZSwgcHJvamVjdCB9ID0gZXZ0O1xuXHRcdGNvbnN0IGZ1bGxQYXRoID0gZmlsZS5mdWxsUGF0aDtcblxuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBGaWxlICR7ZXZlbnROYW1lfTogJHtmdWxsUGF0aH1gKTtcblxuXHRcdGlmIChldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLnVubGluaykge1xuXHRcdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5kZWxldGUoZnVsbFBhdGgpO1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZnVsbFBhdGgsIG51bGwpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLmFkZCkge1xuXHRcdFx0aWYgKHByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSB7XG5cdFx0XHRcdHRoaXMuZmlsZUluZm9NYXAuc2V0KGZ1bGxQYXRoLCB7IHByb2plY3QgfSk7XG5cdFx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZ1bGxQYXRoLCBudWxsKTtcblx0XHRcdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBjaGFuZ2Vcblx0XHRpZiAoIXByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSByZXR1cm47XG5cdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5kZWxldGUoZnVsbFBhdGgpO1xuXHRcdHRoaXMudHJhbnNwaWxlci5pbnZhbGlkYXRlQ29udGVudENhY2hlKG5ldyBGaWxlRXgoeyBmdWxsUGF0aCB9KSk7XG5cdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIHJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChmdWxsUGF0aCk7XG5cdFx0Y29uc3QgbW9kdWxlcyA9IFsuLi5uZXcgU2V0KFsuLi5kZXBzLCBmdWxsUGF0aF0pXTtcblxuXHRcdGlmICghbW9kdWxlcy5pbmNsdWRlcyh0aGlzLmVudHJ5TW9kdWxlUGF0aCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gZG9lcyBub3QgYWZmZWN0IGVudHJ5IOKAlCBza2lwcGluZyByZWxvYWRgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShcblx0XHRcdGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gYWZmZWN0cyAke21vZHVsZXMubGVuZ3RofSBtb2R1bGUocykg4oCUIHNjaGVkdWxpbmcgcmVsb2FkYCxcblx0XHQpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZU1vZHVsZSguLi5tb2R1bGVzKTtcblx0XHR0aGlzLnNjaGVkdWxlUmVib290KCk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyDilIDilIAgRGVwZW5kZW5jeSBncmFwaCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGdldERlcGVuZGVuY3lHcmFwaChtb2R1bGVJZDogc3RyaW5nLCBwYXJlbnRNb2R1bGVzOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nW10ge1xuXHRcdGlmICh0aGlzLmlzU2VsZihtb2R1bGVJZCkpIHJldHVybiBbXTtcblxuXHRcdGNvbnN0IG1vZHVsZURlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQobW9kdWxlSWQpID8/IFtdO1xuXHRcdGlmIChwYXJlbnRNb2R1bGVzLmluY2x1ZGVzKG1vZHVsZUlkKSkge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZDogJHttb2R1bGVJZH1gKTtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRsZXQgc3ViRGVwczogc3RyaW5nW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IGRlcCBvZiBtb2R1bGVEZXBzKSB7XG5cdFx0XHRpZiAoIXRoaXMuZmlsZUluZm9NYXAuaGFzKGRlcCkpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3Qgc3VicyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGRlcCwgW21vZHVsZUlkLCAuLi5wYXJlbnRNb2R1bGVzXSk7XG5cdFx0XHRzdWJEZXBzID0gWy4uLnN1YkRlcHMsIC4uLnN1YnNdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbLi4ubmV3IFNldChbLi4ubW9kdWxlRGVwcywgLi4uc3ViRGVwc10pXTtcblx0fVxuXG5cdHByaXZhdGUgdHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoOiBzdHJpbmcsIHBhcmVudFBhdGg6IHN0cmluZykge1xuXHRcdGlmICghcGFyZW50UGF0aCkgcmV0dXJuO1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQoZmlsZVBhdGgpID8/IFtdO1xuXHRcdGNvbnN0IHVwZGF0ZWREZXBzID0gbmV3IFNldChbLi4uZGVwcywgcGFyZW50UGF0aF0pO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChmaWxlUGF0aCwgWy4uLnVwZGF0ZWREZXBzXSk7XG5cdH1cblxuXHQvLyDilIDilIAgTW9kdWxlIGNhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0Q2FjaGVkT3JOZXcobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgobW9kdWxlVXJsKTtcblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLm1vZHVsZUNhY2hlLmdldChmaWxlUGF0aCk7XG5cdFx0Y29uc3QgdmVyc2lvbmVkID0gY2FjaGVkID8/IHRoaXMudmVyc2lvbk1vZHVsZShtb2R1bGVVcmwpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCB2ZXJzaW9uZWQpO1xuXHRcdHJldHVybiB2ZXJzaW9uZWQ7XG5cdH1cblxuXHRwcml2YXRlIHZlcnNpb25Nb2R1bGUobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCB2ZXJzaW9uZWRVcmwgPSBuZXcgVVJMKG1vZHVsZVVybCk7XG5cdFx0dmVyc2lvbmVkVXJsLnNlYXJjaFBhcmFtcy5zZXQoVkVSU0lPTl9VUkxfUEFSQU0sIFN0cmluZygrK21vZHVsZVZlcnNpb25TZXEpKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkVXJsLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVNb2R1bGUoLi4ubW9kdWxlczogc3RyaW5nW10pIHtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChtb2R1bGUsIG51bGwpO1xuXHRcdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5kZWxldGUobW9kdWxlKTtcblx0XHRcdC8vIFBydW5lIHN0YWxlIG91dGdvaW5nIGVkZ2VzOiByZW1vdmUgdGhpcyBtb2R1bGUgYXMgYSBwYXJlbnQgZnJvbSBhbGwgZGVwZW5kZW5jeSBsaXN0c1xuXHRcdFx0Zm9yIChjb25zdCBba2V5LCBwYXJlbnRzXSBvZiB0aGlzLmRlcGVuZGVuY2llcykge1xuXHRcdFx0XHRjb25zdCBmaWx0ZXJlZCA9IHBhcmVudHMuZmlsdGVyKChwKSA9PiBwICE9PSBtb2R1bGUpO1xuXHRcdFx0XHRpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZGVsZXRlKGtleSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuc2V0KGtleSwgZmlsdGVyZWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMoKSB7XG5cdFx0Zm9yIChjb25zdCBmaWxlUGF0aCBvZiB0aGlzLmZpbGVJbmZvTWFwLmtleXMoKSkge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZmlsZVBhdGgsIG51bGwpO1xuXHRcdH1cblx0fVxuXG5cdC8vIOKUgOKUgCBVdGlsaXRpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBpc1NlbGYoZmlsZVBhdGg6IHN0cmluZykge1xuXHRcdHJldHVybiBjdXJyZW50RmlsZVBhdGggPT09IHBhdGgucmVzb2x2ZShmaWxlUGF0aCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJFdmVudEVtaXR0ZXIiLCJyZWdpc3Rlckhvb2tzIiwicGF0aCIsIkJ1aWxkVGFyZ2V0cyIsIlN3Y1RyYW5zcGlsZXIiLCJXb3Jrc3BhY2VEZWZhdWx0cyIsInBhY2thZ2VBbGlhc2VzIiwiV29ya3NwYWNlRmFjdG9yeSIsIkZpbGVFeCIsImlvIiwiZGVib3VuY2UiLCJzY3JpYmUiLCJyZXdyaXRlU2VydmVTcGVjaWZpZXIiLCJjdXJyZW50RmlsZVBhdGgiLCJmaWxlVXJsVG9QYXRoIiwidXJsIiwiVkVSU0lPTl9VUkxfUEFSQU0iLCJSRUJPT1RfREVCT1VOQ0VfTVMiLCJtb2R1bGVWZXJzaW9uU2VxIiwiSG90UmVsb2FkU2VydmVyIiwibG9nZ2VyIiwibmFtZSIsImRpc3Bvc2VkIiwiaG9va3NSZWdpc3RlcmVkIiwiZW50cnlNb2R1bGVQYXRoIiwiZW50cnlNb2R1bGUiLCJ3b3Jrc3BhY2UiLCJidWlsZENvbmZpZyIsIndhdGNoU3Vic2NyaXB0aW9uIiwiZmlsZUluZm9NYXAiLCJNYXAiLCJtb2R1bGVDYWNoZSIsImRlcGVuZGVuY2llcyIsInRyYW5zcGlsZUNhY2hlIiwidHJhbnNwaWxlciIsImFsaWFzUGF0aHMiLCJhbGlhc0Jhc2VVcmwiLCJyZXNvbHZlIiwicmVib290VGFpbCIsIlByb21pc2UiLCJzdGFydCIsIm9wdGlvbnMiLCJjbGVhciIsInJlc29sdmVXb3Jrc3BhY2UiLCJwcm9qZWN0IiwicmVzb2x2ZVByb2plY3QiLCJnZXRTb3VyY2VFbnRyeVBhdGgiLCJidWlsZEZpbGVJbmZvTWFwIiwiYnVpbGRBbGlhc1BhdGhzIiwiaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzIiwid2F0Y2giLCJwcm9qZWN0RmlsZUNoYW5nZWQkIiwic3Vic2NyaWJlIiwib25GaWxlQ2hhbmdlIiwidHJhY2UiLCJib290RW50cnkiLCJlbWl0IiwiZGlzcG9zZSIsInVuc3Vic2NyaWJlIiwiU3ltYm9sIiwiZGlzcG9zZUVudHJ5IiwiYXN5bmNEaXNwb3NlIiwidmVyc2lvbk1vZHVsZSIsInBhdGhUb0ZpbGVVcmwiLCJkZWZhdWx0IiwiZXJyb3IiLCJ1bmRlZmluZWQiLCJzY2hlZHVsZVJlYm9vdCIsInRoZW4iLCJydW5SZWJvb3QiLCJlbnRyeSIsImNyZWF0ZSIsInJvb3REaXIiLCJwcm9jZXNzIiwiY3dkIiwicHJvamVjdHMiLCJnZXRQcm9qZWN0cyIsImZvdW5kIiwiYXQiLCJmaW5kIiwicCIsIkVycm9yIiwiZW50cmllcyIsImFsbCIsIm1hcCIsImZpbGVzIiwiZ2V0QWxsRmlsZXMiLCJmaWxlIiwiZnVsbFBhdGgiLCJmbGF0Iiwic3BlY2lmaWVyIiwiY29udGV4dCIsIm5leHQiLCJwYXJlbnRVcmwiLCJwYXJlbnRVUkwiLCJyZXdyaXR0ZW4iLCJpc1dhdGNoZWRUcyIsImZpbGVQYXRoIiwiaGFzIiwicmVzb2x2ZUJhcmUiLCJiYXJlIiwicmVzb2x2ZVBhdGgiLCJ2ZXJzaW9uRmlsZVVybCIsImZpbGVVcmwiLCJnZXRDYWNoZWRPck5ldyIsInJlc3VsdCIsIm9uUG9zdFJlc29sdmUiLCJsb2FkIiwibG9hZFRzIiwiZm9ybWF0Iiwic291cmNlIiwic2hvcnRDaXJjdWl0IiwiZ2V0UGFja2FnZUFsaWFzZXMiLCJiYXNlVXJsIiwicGF0aHMiLCJwYXJlbnRVcmxDbGVhbiIsInNwbGl0IiwicGFyZW50UGF0aCIsInVybE9iaiIsIlVSTCIsInNlYXJjaCIsInRvU3RyaW5nIiwiaXNTb3VyY2UiLCJwYXJlbnRJc1NvdXJjZSIsInRyYWNrRGVwZW5kZW5jeSIsInN0YXJ0c1dpdGgiLCJjbGVhblBhdGgiLCJwYXRobmFtZSIsImZpbGVJbmZvIiwiZ2V0IiwiY2FjaGVkIiwidHNDb25maWciLCJnZXRUc0NvbmZpZ1N5bmMiLCJ1c2VyQ29uZmlnIiwiZ2V0U3djQ29uZmlnU3luYyIsInJlc3BvbnNlIiwidHJhbnNmb3JtRmlsZVN5bmMiLCJlczYiLCJvdXRjb21lIiwic2V0IiwiY29kZSIsImV2dCIsImV2ZW50TmFtZSIsIldhdGNoRXZlbnRzIiwidW5saW5rIiwiZGVsZXRlIiwiYWRkIiwiaXNTb3VyY2VGaWxlIiwicmVsb2FkSWZBZmZlY3RlZCIsImludmFsaWRhdGVDb250ZW50Q2FjaGUiLCJkZXBzIiwiZ2V0RGVwZW5kZW5jeUdyYXBoIiwibW9kdWxlcyIsIlNldCIsImluY2x1ZGVzIiwibGVuZ3RoIiwiaW52YWxpZGF0ZU1vZHVsZSIsIm1vZHVsZUlkIiwicGFyZW50TW9kdWxlcyIsImlzU2VsZiIsIm1vZHVsZURlcHMiLCJzdWJEZXBzIiwiZGVwIiwic3VicyIsInVwZGF0ZWREZXBzIiwibW9kdWxlVXJsIiwidmVyc2lvbmVkIiwidmVyc2lvbmVkVXJsIiwic2VhcmNoUGFyYW1zIiwiU3RyaW5nIiwibW9kdWxlIiwia2V5IiwicGFyZW50cyIsImZpbHRlcmVkIiwiZmlsdGVyIiwia2V5cyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsWUFBWSxRQUFRLGNBQWM7QUFPM0MsU0FBU0MsYUFBYSxRQUFRLGNBQWM7QUFDNUMsT0FBT0MsVUFBVSxZQUFZO0FBQzdCLFNBQVNDLFlBQVksRUFBRUMsYUFBYSxFQUFFQyxpQkFBaUIsUUFBUSxrQkFBa0I7QUFFakYsU0FBU0MsY0FBYyxFQUFFQyxnQkFBZ0IsUUFBUSxpQkFBaUI7QUFDbEUsU0FBU0MsTUFBTSxFQUFFQyxFQUFFLFFBQVEscUJBQXFCO0FBQ2hELFNBQVNDLFFBQVEsUUFBUSx5QkFBeUI7QUFDbEQsU0FBc0JDLE1BQU0sUUFBUSxtQkFBbUI7QUFFdkQsU0FBU0MscUJBQXFCLFFBQVEsK0JBQStCO0FBSXJFLE1BQU1D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
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
2
|
+
import { packageAliases } from "@decohere/mesh";
|
|
3
|
+
/**
|
|
4
|
+
* Map a resolve-hook specifier to a versioned watched `.ts` file URL.
|
|
5
|
+
* Covers relative `.js` / `.ts` / extensionless imports and bare workspace
|
|
6
|
+
* package names (dynamic `import()` never goes through SWC path rewrite).
|
|
7
|
+
*/ export function rewriteServeSpecifier(options) {
|
|
8
|
+
const { specifier, parentUrl, isWatchedTs, resolveBare, versionFileUrl } = options;
|
|
9
|
+
const relativeTs = resolveRelativeWatchedTs(specifier, parentUrl, isWatchedTs);
|
|
10
|
+
if (relativeTs != null) {
|
|
11
|
+
return versionFileUrl(pathToFileURL(relativeTs).toString());
|
|
12
|
+
}
|
|
13
|
+
const bareTarget = resolveBare(specifier);
|
|
14
|
+
if (bareTarget != null && isWatchedTs(bareTarget)) {
|
|
15
|
+
return versionFileUrl(pathToFileURL(bareTarget).toString());
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
function resolveRelativeWatchedTs(specifier, parentUrl, isWatchedTs) {
|
|
20
|
+
if (packageAliases.isBareSpecifier(specifier)) return null;
|
|
21
|
+
if (!(specifier.startsWith(".") || specifier.startsWith("/"))) return null;
|
|
22
|
+
const parentClean = parentUrl.split("?")[0];
|
|
23
|
+
if (parentClean == null || parentClean === "") return null;
|
|
24
|
+
let resolved;
|
|
25
|
+
try {
|
|
26
|
+
resolved = new URL(specifier, parentClean);
|
|
27
|
+
} catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
if (resolved.protocol !== "file:") return null;
|
|
31
|
+
let filePath = fileURLToPath(resolved);
|
|
32
|
+
if (filePath.endsWith(".js")) {
|
|
33
|
+
filePath = `${filePath.slice(0, -3)}.ts`;
|
|
34
|
+
} else if (!filePath.endsWith(".ts")) {
|
|
35
|
+
filePath = `${filePath}.ts`;
|
|
36
|
+
}
|
|
37
|
+
return isWatchedTs(filePath) ? filePath : null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3Jld3JpdGUtc2VydmUtc3BlY2lmaWVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpbGVVUkxUb1BhdGgsIHBhdGhUb0ZpbGVVUkwgfSBmcm9tIFwibm9kZTp1cmxcIjtcbmltcG9ydCB7IHBhY2thZ2VBbGlhc2VzIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5cbmV4cG9ydCB0eXBlIFJld3JpdGVTZXJ2ZVNwZWNpZmllck9wdGlvbnMgPSB7XG5cdHNwZWNpZmllcjogc3RyaW5nO1xuXHRwYXJlbnRVcmw6IHN0cmluZztcblx0aXNXYXRjaGVkVHM6IChhYnNvbHV0ZVBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcblx0cmVzb2x2ZUJhcmU6IChzcGVjaWZpZXI6IHN0cmluZykgPT4gc3RyaW5nIHwgbnVsbDtcblx0dmVyc2lvbkZpbGVVcmw6IChmaWxlVXJsOiBzdHJpbmcpID0+IHN0cmluZztcbn07XG5cbi8qKlxuICogTWFwIGEgcmVzb2x2ZS1ob29rIHNwZWNpZmllciB0byBhIHZlcnNpb25lZCB3YXRjaGVkIGAudHNgIGZpbGUgVVJMLlxuICogQ292ZXJzIHJlbGF0aXZlIGAuanNgIC8gYC50c2AgLyBleHRlbnNpb25sZXNzIGltcG9ydHMgYW5kIGJhcmUgd29ya3NwYWNlXG4gKiBwYWNrYWdlIG5hbWVzIChkeW5hbWljIGBpbXBvcnQoKWAgbmV2ZXIgZ29lcyB0aHJvdWdoIFNXQyBwYXRoIHJld3JpdGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmV3cml0ZVNlcnZlU3BlY2lmaWVyKG9wdGlvbnM6IFJld3JpdGVTZXJ2ZVNwZWNpZmllck9wdGlvbnMpOiBzdHJpbmcgfCBudWxsIHtcblx0Y29uc3QgeyBzcGVjaWZpZXIsIHBhcmVudFVybCwgaXNXYXRjaGVkVHMsIHJlc29sdmVCYXJlLCB2ZXJzaW9uRmlsZVVybCB9ID0gb3B0aW9ucztcblxuXHRjb25zdCByZWxhdGl2ZVRzID0gcmVzb2x2ZVJlbGF0aXZlV2F0Y2hlZFRzKHNwZWNpZmllciwgcGFyZW50VXJsLCBpc1dhdGNoZWRUcyk7XG5cdGlmIChyZWxhdGl2ZVRzICE9IG51bGwpIHtcblx0XHRyZXR1cm4gdmVyc2lvbkZpbGVVcmwocGF0aFRvRmlsZVVSTChyZWxhdGl2ZVRzKS50b1N0cmluZygpKTtcblx0fVxuXG5cdGNvbnN0IGJhcmVUYXJnZXQgPSByZXNvbHZlQmFyZShzcGVjaWZpZXIpO1xuXHRpZiAoYmFyZVRhcmdldCAhPSBudWxsICYmIGlzV2F0Y2hlZFRzKGJhcmVUYXJnZXQpKSB7XG5cdFx0cmV0dXJuIHZlcnNpb25GaWxlVXJsKHBhdGhUb0ZpbGVVUkwoYmFyZVRhcmdldCkudG9TdHJpbmcoKSk7XG5cdH1cblxuXHRyZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVJlbGF0aXZlV2F0Y2hlZFRzKFxuXHRzcGVjaWZpZXI6IHN0cmluZyxcblx0cGFyZW50VXJsOiBzdHJpbmcsXG5cdGlzV2F0Y2hlZFRzOiAoYWJzb2x1dGVQYXRoOiBzdHJpbmcpID0+IGJvb2xlYW4sXG4pOiBzdHJpbmcgfCBudWxsIHtcblx0aWYgKHBhY2thZ2VBbGlhc2VzLmlzQmFyZVNwZWNpZmllcihzcGVjaWZpZXIpKSByZXR1cm4gbnVsbDtcblx0aWYgKCEoc3BlY2lmaWVyLnN0YXJ0c1dpdGgoXCIuXCIpIHx8IHNwZWNpZmllci5zdGFydHNXaXRoKFwiL1wiKSkpIHJldHVybiBudWxsO1xuXG5cdGNvbnN0IHBhcmVudENsZWFuID0gcGFyZW50VXJsLnNwbGl0KFwiP1wiKVswXTtcblx0aWYgKHBhcmVudENsZWFuID09IG51bGwgfHwgcGFyZW50Q2xlYW4gPT09IFwiXCIpIHJldHVybiBudWxsO1xuXG5cdGxldCByZXNvbHZlZDogVVJMO1xuXHR0cnkge1xuXHRcdHJlc29sdmVkID0gbmV3IFVSTChzcGVjaWZpZXIsIHBhcmVudENsZWFuKTtcblx0fSBjYXRjaCB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0aWYgKHJlc29sdmVkLnByb3RvY29sICE9PSBcImZpbGU6XCIpIHJldHVybiBudWxsO1xuXG5cdGxldCBmaWxlUGF0aCA9IGZpbGVVUkxUb1BhdGgocmVzb2x2ZWQpO1xuXHRpZiAoZmlsZVBhdGguZW5kc1dpdGgoXCIuanNcIikpIHtcblx0XHRmaWxlUGF0aCA9IGAke2ZpbGVQYXRoLnNsaWNlKDAsIC0zKX0udHNgO1xuXHR9IGVsc2UgaWYgKCFmaWxlUGF0aC5lbmRzV2l0aChcIi50c1wiKSkge1xuXHRcdGZpbGVQYXRoID0gYCR7ZmlsZVBhdGh9LnRzYDtcblx0fVxuXG5cdHJldHVybiBpc1dhdGNoZWRUcyhmaWxlUGF0aCkgPyBmaWxlUGF0aCA6IG51bGw7XG59XG4iXSwibmFtZXMiOlsiZmlsZVVSTFRvUGF0aCIsInBhdGhUb0ZpbGVVUkwiLCJwYWNrYWdlQWxpYXNlcyIsInJld3JpdGVTZXJ2ZVNwZWNpZmllciIsIm9wdGlvbnMiLCJzcGVjaWZpZXIiLCJwYXJlbnRVcmwiLCJpc1dhdGNoZWRUcyIsInJlc29sdmVCYXJlIiwidmVyc2lvbkZpbGVVcmwiLCJyZWxhdGl2ZVRzIiwicmVzb2x2ZVJlbGF0aXZlV2F0Y2hlZFRzIiwidG9TdHJpbmciLCJiYXJlVGFyZ2V0IiwiaXNCYXJlU3BlY2lmaWVyIiwic3RhcnRzV2l0aCIsInBhcmVudENsZWFuIiwic3BsaXQiLCJyZXNvbHZlZCIsIlVSTCIsInByb3RvY29sIiwiZmlsZVBhdGgiLCJlbmRzV2l0aCIsInNsaWNlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxhQUFhLEVBQUVDLGFBQWEsUUFBUSxXQUFXO0FBQ3hELFNBQVNDLGNBQWMsUUFBUSxpQkFBaUI7QUFVaEQ7Ozs7Q0FJQyxHQUNELE9BQU8sU0FBU0Msc0JBQXNCQyxPQUFxQztJQUMxRSxNQUFNLEVBQUVDLFNBQVMsRUFBRUMsU0FBUyxFQUFFQyxXQUFXLEVBQUVDLFdBQVcsRUFBRUMsY0FBYyxFQUFFLEdBQUdMO0lBRTNFLE1BQU1NLGFBQWFDLHlCQUF5Qk4sV0FBV0MsV0FBV0M7SUFDbEUsSUFBSUcsY0FBYyxNQUFNO1FBQ3ZCLE9BQU9ELGVBQWVSLGNBQWNTLFlBQVlFLFFBQVE7SUFDekQ7SUFFQSxNQUFNQyxhQUFhTCxZQUFZSDtJQUMvQixJQUFJUSxjQUFjLFFBQVFOLFlBQVlNLGFBQWE7UUFDbEQsT0FBT0osZUFBZVIsY0FBY1ksWUFBWUQsUUFBUTtJQUN6RDtJQUVBLE9BQU87QUFDUjtBQUVBLFNBQVNELHlCQUNSTixTQUFpQixFQUNqQkMsU0FBaUIsRUFDakJDLFdBQThDO0lBRTlDLElBQUlMLGVBQWVZLGVBQWUsQ0FBQ1QsWUFBWSxPQUFPO0lBQ3RELElBQUksQ0FBRUEsQ0FBQUEsVUFBVVUsVUFBVSxDQUFDLFFBQVFWLFVBQVVVLFVBQVUsQ0FBQyxJQUFHLEdBQUksT0FBTztJQUV0RSxNQUFNQyxjQUFjVixVQUFVVyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7SUFDM0MsSUFBSUQsZUFBZSxRQUFRQSxnQkFBZ0IsSUFBSSxPQUFPO0lBRXRELElBQUlFO0lBQ0osSUFBSTtRQUNIQSxXQUFXLElBQUlDLElBQUlkLFdBQVdXO0lBQy9CLEVBQUUsT0FBTTtRQUNQLE9BQU87SUFDUjtJQUNBLElBQUlFLFNBQVNFLFFBQVEsS0FBSyxTQUFTLE9BQU87SUFFMUMsSUFBSUMsV0FBV3JCLGNBQWNrQjtJQUM3QixJQUFJRyxTQUFTQyxRQUFRLENBQUMsUUFBUTtRQUM3QkQsV0FBVyxHQUFHQSxTQUFTRSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3pDLE9BQU8sSUFBSSxDQUFDRixTQUFTQyxRQUFRLENBQUMsUUFBUTtRQUNyQ0QsV0FBVyxHQUFHQSxTQUFTLEdBQUcsQ0FBQztJQUM1QjtJQUVBLE9BQU9kLFlBQVljLFlBQVlBLFdBQVc7QUFDM0MifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@decohere/flux",
|
|
3
|
-
"version": "0.0.1-dev.
|
|
3
|
+
"version": "0.0.1-dev.65",
|
|
4
4
|
"description": "Hot module reload server for Node.js ESM applications",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@decohere/crucible": "0.0.1-dev.
|
|
29
|
-
"@decohere/forge": "0.0.1-dev.
|
|
30
|
-
"@decohere/mesh": "0.0.1-dev.
|
|
31
|
-
"@decohere/nexus": "0.0.1-dev.
|
|
32
|
-
"@decohere/scribe": "0.0.1-dev.
|
|
28
|
+
"@decohere/crucible": "0.0.1-dev.65",
|
|
29
|
+
"@decohere/forge": "0.0.1-dev.65",
|
|
30
|
+
"@decohere/mesh": "0.0.1-dev.65",
|
|
31
|
+
"@decohere/nexus": "0.0.1-dev.65",
|
|
32
|
+
"@decohere/scribe": "0.0.1-dev.65",
|
|
33
33
|
"rxjs": "^7.8.2"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {}
|
|
@@ -30,23 +30,21 @@ export declare class HotReloadServer extends EventEmitter<HotReloadServerEvents>
|
|
|
30
30
|
private dependencies;
|
|
31
31
|
private transpileCache;
|
|
32
32
|
private transpiler;
|
|
33
|
+
private aliasPaths;
|
|
34
|
+
private aliasBaseUrl;
|
|
35
|
+
private rebootTail;
|
|
33
36
|
start(options: HotReloadServerOptions): Promise<void>;
|
|
34
37
|
dispose(): Promise<void>;
|
|
35
38
|
[Symbol.asyncDispose](): Promise<void>;
|
|
36
39
|
private bootEntry;
|
|
37
|
-
private reboot;
|
|
38
|
-
private disposeEntry;
|
|
39
40
|
private scheduleReboot;
|
|
41
|
+
private runReboot;
|
|
42
|
+
private disposeEntry;
|
|
40
43
|
private resolveWorkspace;
|
|
41
44
|
private resolveProject;
|
|
42
45
|
private buildFileInfoMap;
|
|
43
46
|
private registerHooks;
|
|
44
|
-
|
|
45
|
-
* Pre-next specifier rewriter: if specifier is a .js import that maps to a
|
|
46
|
-
* known .ts source file, returns the versioned .ts file URL so next() never
|
|
47
|
-
* tries to load a non-existent .js file from disk.
|
|
48
|
-
*/
|
|
49
|
-
private rewriteJsToTs;
|
|
47
|
+
private buildAliasPaths;
|
|
50
48
|
/**
|
|
51
49
|
* Post-next dependency tracker: records which source files import which
|
|
52
50
|
* other source files so that reloadIfAffected can traverse the graph.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type RewriteServeSpecifierOptions = {
|
|
2
|
+
specifier: string;
|
|
3
|
+
parentUrl: string;
|
|
4
|
+
isWatchedTs: (absolutePath: string) => boolean;
|
|
5
|
+
resolveBare: (specifier: string) => string | null;
|
|
6
|
+
versionFileUrl: (fileUrl: string) => string;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Map a resolve-hook specifier to a versioned watched `.ts` file URL.
|
|
10
|
+
* Covers relative `.js` / `.ts` / extensionless imports and bare workspace
|
|
11
|
+
* package names (dynamic `import()` never goes through SWC path rewrite).
|
|
12
|
+
*/
|
|
13
|
+
export declare function rewriteServeSpecifier(options: RewriteServeSpecifierOptions): string | null;
|