@decohere/flux 0.0.1-dev.9 → 0.0.1-dev.91
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/deferred-script-runner.js +58 -0
- package/commonjs/src/flux.command.js +3 -1
- package/commonjs/src/flux.js +58 -0
- package/commonjs/src/flux.module.js +6 -2
- package/commonjs/src/hot-reload-server.js +268 -194
- package/commonjs/src/index.js +35 -1
- package/commonjs/src/rewrite-serve-specifier.js +46 -0
- package/commonjs/src/run.action.js +49 -0
- package/commonjs/src/run.command.js +67 -0
- package/commonjs/src/serve.action.js +77 -4
- package/commonjs/src/serve.command.js +32 -2
- package/commonjs/src/slice-serve.js +132 -0
- package/commonjs/src/source-module-loader.js +216 -0
- package/es6/src/deferred-script-runner.js +48 -0
- package/es6/src/flux.command.js +3 -1
- package/es6/src/flux.js +43 -0
- package/es6/src/flux.module.js +6 -2
- package/es6/src/hot-reload-server.js +249 -151
- package/es6/src/index.js +6 -2
- package/es6/src/rewrite-serve-specifier.js +40 -0
- package/es6/src/run.action.js +40 -0
- package/es6/src/run.command.js +57 -0
- package/es6/src/serve.action.js +73 -4
- package/es6/src/serve.command.js +32 -2
- package/es6/src/slice-serve.js +107 -0
- package/es6/src/source-module-loader.js +160 -0
- package/package.json +7 -6
- package/types/src/deferred-script-runner.d.ts +18 -0
- package/types/src/flux.d.ts +43 -0
- package/types/src/flux.module.d.ts +2 -0
- package/types/src/hot-reload-server.d.ts +45 -22
- package/types/src/index.d.ts +8 -1
- package/types/src/rewrite-serve-specifier.d.ts +13 -0
- package/types/src/run.action.d.ts +15 -0
- package/types/src/run.command.d.ts +11 -0
- package/types/src/serve.action.d.ts +11 -1
- package/types/src/serve.command.d.ts +5 -0
- package/types/src/slice-serve.d.ts +52 -0
- package/types/src/source-module-loader.d.ts +49 -0
|
@@ -2,204 +2,272 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get DEFAULT_REBOOT_DEBOUNCE_MS () {
|
|
13
|
+
return DEFAULT_REBOOT_DEBOUNCE_MS;
|
|
14
|
+
},
|
|
15
|
+
get HotReloadServer () {
|
|
8
16
|
return HotReloadServer;
|
|
17
|
+
},
|
|
18
|
+
get formatFluxRebootReady () {
|
|
19
|
+
return formatFluxRebootReady;
|
|
20
|
+
},
|
|
21
|
+
get formatFluxRebootStart () {
|
|
22
|
+
return formatFluxRebootStart;
|
|
23
|
+
},
|
|
24
|
+
get resolveRebootDebounceMs () {
|
|
25
|
+
return resolveRebootDebounceMs;
|
|
9
26
|
}
|
|
10
27
|
});
|
|
11
28
|
const _nodeevents = require("node:events");
|
|
12
|
-
const _nodemodule = require("node:module");
|
|
13
29
|
const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
|
|
14
|
-
const _forge = require("@decohere/forge");
|
|
15
|
-
const _mesh = require("@decohere/mesh");
|
|
16
30
|
const _io = require("@decohere/nexus/io");
|
|
17
31
|
const _system = require("@decohere/nexus/system");
|
|
18
32
|
const _scribe = require("@decohere/scribe");
|
|
33
|
+
const _sourcemoduleloader = require("./source-module-loader.js");
|
|
19
34
|
function _interop_require_default(obj) {
|
|
20
35
|
return obj && obj.__esModule ? obj : {
|
|
21
36
|
default: obj
|
|
22
37
|
};
|
|
23
38
|
}
|
|
24
|
-
function _getRequireWildcardCache(nodeInterop) {
|
|
25
|
-
if (typeof WeakMap !== "function") return null;
|
|
26
|
-
var cacheBabelInterop = new WeakMap();
|
|
27
|
-
var cacheNodeInterop = new WeakMap();
|
|
28
|
-
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
29
|
-
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
30
|
-
})(nodeInterop);
|
|
31
|
-
}
|
|
32
|
-
function _interop_require_wildcard(obj, nodeInterop) {
|
|
33
|
-
if (!nodeInterop && obj && obj.__esModule) {
|
|
34
|
-
return obj;
|
|
35
|
-
}
|
|
36
|
-
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
37
|
-
return {
|
|
38
|
-
default: obj
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
var cache = _getRequireWildcardCache(nodeInterop);
|
|
42
|
-
if (cache && cache.has(obj)) {
|
|
43
|
-
return cache.get(obj);
|
|
44
|
-
}
|
|
45
|
-
var newObj = {
|
|
46
|
-
__proto__: null
|
|
47
|
-
};
|
|
48
|
-
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
49
|
-
for(var key in obj){
|
|
50
|
-
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
51
|
-
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
52
|
-
if (desc && (desc.get || desc.set)) {
|
|
53
|
-
Object.defineProperty(newObj, key, desc);
|
|
54
|
-
} else {
|
|
55
|
-
newObj[key] = obj[key];
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
newObj.default = obj;
|
|
60
|
-
if (cache) {
|
|
61
|
-
cache.set(obj, newObj);
|
|
62
|
-
}
|
|
63
|
-
return newObj;
|
|
64
|
-
}
|
|
65
39
|
const currentFilePath = _io.io.fileUrlToPath(require("url").pathToFileURL(__filename).toString());
|
|
66
40
|
const VERSION_URL_PARAM = "version";
|
|
67
|
-
const
|
|
41
|
+
const DEFAULT_REBOOT_DEBOUNCE_MS = 250;
|
|
42
|
+
/** How many triggering paths to print on the info banner before `+N`. */ const MAX_REBOOT_TRIGGER_PATHS = 4;
|
|
43
|
+
function resolveRebootDebounceMs(value) {
|
|
44
|
+
const delay = value ?? DEFAULT_REBOOT_DEBOUNCE_MS;
|
|
45
|
+
if (!Number.isFinite(delay) || delay < 0) {
|
|
46
|
+
throw new Error(`rebootDebounceMs must be a non-negative number, got ${String(value)}`);
|
|
47
|
+
}
|
|
48
|
+
return delay;
|
|
49
|
+
}
|
|
50
|
+
function formatTriggerList(triggers) {
|
|
51
|
+
if (triggers.length === 0) return undefined;
|
|
52
|
+
if (triggers.length <= MAX_REBOOT_TRIGGER_PATHS) return triggers.join(", ");
|
|
53
|
+
return `${triggers.slice(0, MAX_REBOOT_TRIGGER_PATHS).join(", ")}, +${triggers.length - MAX_REBOOT_TRIGGER_PATHS}`;
|
|
54
|
+
}
|
|
55
|
+
const BANNER_RULE = "═".repeat(56);
|
|
56
|
+
function wrapFluxBanner(title, details) {
|
|
57
|
+
const body = details.map((line)=>` ${line}`).join("\n");
|
|
58
|
+
return `\n${BANNER_RULE}\n ${title}\n${body}\n${BANNER_RULE}\n`;
|
|
59
|
+
}
|
|
60
|
+
function formatFluxRebootStart(labels, triggers = []) {
|
|
61
|
+
const who = labels.join(", ") || "entry";
|
|
62
|
+
const files = formatTriggerList(triggers);
|
|
63
|
+
const details = files == null ? [
|
|
64
|
+
who
|
|
65
|
+
] : [
|
|
66
|
+
who,
|
|
67
|
+
files
|
|
68
|
+
];
|
|
69
|
+
return wrapFluxBanner("FLUX REBOOT", details);
|
|
70
|
+
}
|
|
71
|
+
function formatFluxRebootReady(labels, elapsedMs) {
|
|
72
|
+
const who = labels.join(", ") || "entry";
|
|
73
|
+
return wrapFluxBanner("FLUX READY", [
|
|
74
|
+
who,
|
|
75
|
+
`${Math.max(0, Math.round(elapsedMs))}ms`
|
|
76
|
+
]);
|
|
77
|
+
}
|
|
78
|
+
/** Process-wide: Node's ESM cache is process-global, including across HotReloadServer instances. */ let moduleVersionSeq = 0;
|
|
68
79
|
class HotReloadServer extends _nodeevents.EventEmitter {
|
|
69
80
|
// ── State ────────────────────────────────────────────────────────────────
|
|
70
81
|
logger = _scribe.scribe.logger(HotReloadServer.name);
|
|
82
|
+
loader = new _sourcemoduleloader.SourceModuleLoader();
|
|
71
83
|
disposed = false;
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
workspace;
|
|
84
|
+
/** Absolute entry paths currently served (one or more Flux apps). */ entries = new Map();
|
|
85
|
+
pendingEntryReboots = new Set();
|
|
86
|
+
/** Source paths that scheduled the next reboot (cleared when that reboot starts). */ pendingTriggers = new Set();
|
|
76
87
|
watchSubscription;
|
|
77
|
-
/** Map from absolute .ts source file path to project info */ fileInfoMap = new Map();
|
|
78
88
|
moduleCache = new Map();
|
|
79
89
|
dependencies = new Map();
|
|
80
|
-
|
|
81
|
-
|
|
90
|
+
rebootTail = Promise.resolve();
|
|
91
|
+
rebootDebounceGen = 0;
|
|
92
|
+
rebootInFlight = false;
|
|
93
|
+
rebootFollowUp = false;
|
|
94
|
+
rebootQueued = false;
|
|
95
|
+
/** Modules whose reverse-graph edges are pruned at reboot, not on schedule. */ pendingGraphPrune = new Set();
|
|
96
|
+
scheduleReboot = ()=>{};
|
|
82
97
|
// ── Public API ───────────────────────────────────────────────────────────
|
|
83
98
|
async start(options) {
|
|
84
99
|
this.disposed = false;
|
|
85
100
|
this.dependencies.clear();
|
|
86
101
|
this.moduleCache.clear();
|
|
87
|
-
this.
|
|
102
|
+
this.entries.clear();
|
|
103
|
+
this.pendingEntryReboots.clear();
|
|
104
|
+
this.pendingTriggers.clear();
|
|
105
|
+
this.pendingGraphPrune.clear();
|
|
106
|
+
this.rebootTail = Promise.resolve();
|
|
107
|
+
this.rebootInFlight = false;
|
|
108
|
+
this.rebootFollowUp = false;
|
|
109
|
+
this.rebootQueued = false;
|
|
110
|
+
this.bindScheduleReboot(resolveRebootDebounceMs(options.rebootDebounceMs));
|
|
88
111
|
const { buildConfig } = options;
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
112
|
+
await this.loader.configure({
|
|
113
|
+
buildConfig,
|
|
114
|
+
workspace: options.workspace,
|
|
115
|
+
versionFileUrl: (fileUrl)=>this.getCachedOrNew(fileUrl),
|
|
116
|
+
onResolved: this.onPostResolve
|
|
117
|
+
});
|
|
118
|
+
const workspace = this.requireWorkspace();
|
|
119
|
+
const selected = this.resolveProjects(buildConfig, options);
|
|
120
|
+
for (const project of selected){
|
|
121
|
+
const entryPath = _nodepath.default.resolve(project.getSourceEntryPath());
|
|
122
|
+
this.entries.set(entryPath, {
|
|
123
|
+
path: entryPath,
|
|
124
|
+
label: project.name
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
this.loader.registerHooks();
|
|
94
128
|
this.invalidateAllSourceFiles();
|
|
95
|
-
await
|
|
96
|
-
this.watchSubscription =
|
|
97
|
-
this.
|
|
98
|
-
|
|
129
|
+
await workspace.watch(buildConfig);
|
|
130
|
+
this.watchSubscription = workspace.projectFileChanged$.subscribe(this.onFileChange);
|
|
131
|
+
for (const entry of this.entries.values()){
|
|
132
|
+
this.logger.trace(`Serving ${entry.path}`);
|
|
133
|
+
}
|
|
134
|
+
await this.bootEntries([
|
|
135
|
+
...this.entries.keys()
|
|
136
|
+
]);
|
|
99
137
|
this.emit("start");
|
|
100
138
|
}
|
|
101
139
|
async dispose() {
|
|
102
140
|
if (this.disposed) return;
|
|
103
141
|
this.disposed = true;
|
|
142
|
+
this.rebootDebounceGen += 1;
|
|
104
143
|
this.watchSubscription?.unsubscribe();
|
|
105
|
-
this.
|
|
106
|
-
await this.
|
|
144
|
+
await this.rebootTail;
|
|
145
|
+
await this.disposeEntries([
|
|
146
|
+
...this.entries.keys()
|
|
147
|
+
]);
|
|
148
|
+
this.loader.dispose();
|
|
107
149
|
}
|
|
108
150
|
async [Symbol.asyncDispose]() {
|
|
109
151
|
await this.dispose();
|
|
110
152
|
}
|
|
111
153
|
// ── Lifecycle ────────────────────────────────────────────────────────────
|
|
112
|
-
async
|
|
154
|
+
async bootEntries(entryPaths) {
|
|
155
|
+
await Promise.all(entryPaths.map((entryPath)=>this.bootEntry(entryPath)));
|
|
156
|
+
}
|
|
157
|
+
async bootEntry(entryPath) {
|
|
158
|
+
const state = this.entries.get(entryPath);
|
|
159
|
+
if (state == null) return;
|
|
113
160
|
try {
|
|
114
|
-
const
|
|
115
|
-
|
|
161
|
+
const mod = await this.loader.importEntry(entryPath);
|
|
162
|
+
state.module = mod?.default;
|
|
116
163
|
} catch (error) {
|
|
164
|
+
state.module = undefined;
|
|
117
165
|
this.logger.error("There was an error booting the entry point. Your application may not function as expected", error);
|
|
118
166
|
}
|
|
119
167
|
}
|
|
120
|
-
|
|
121
|
-
this.
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
async disposeEntry() {
|
|
127
|
-
await this.entryModule?.[Symbol.asyncDispose]();
|
|
168
|
+
bindScheduleReboot(delayMs) {
|
|
169
|
+
const gen = ++this.rebootDebounceGen;
|
|
170
|
+
this.scheduleReboot = (0, _system.debounce)(async ()=>{
|
|
171
|
+
if (this.disposed || gen !== this.rebootDebounceGen) return;
|
|
172
|
+
this.requestReboot();
|
|
173
|
+
}, delayMs);
|
|
128
174
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
175
|
+
requestReboot() {
|
|
176
|
+
if (this.disposed) return;
|
|
177
|
+
if (this.rebootInFlight) {
|
|
178
|
+
this.rebootFollowUp = true;
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (this.rebootQueued) return;
|
|
182
|
+
this.rebootQueued = true;
|
|
183
|
+
this.rebootTail = this.rebootTail.then(()=>this.runReboot(), ()=>this.runReboot());
|
|
136
184
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
185
|
+
async runReboot() {
|
|
186
|
+
this.rebootQueued = false;
|
|
187
|
+
if (this.disposed) return;
|
|
188
|
+
this.rebootInFlight = true;
|
|
189
|
+
try {
|
|
190
|
+
do {
|
|
191
|
+
this.rebootFollowUp = false;
|
|
192
|
+
if (this.disposed) return;
|
|
193
|
+
const toReboot = this.pendingEntryReboots.size > 0 ? [
|
|
194
|
+
...this.pendingEntryReboots
|
|
195
|
+
] : [
|
|
196
|
+
...this.entries.keys()
|
|
197
|
+
];
|
|
198
|
+
this.pendingEntryReboots.clear();
|
|
199
|
+
// Drop reverse edges only when rebooting so later saves in the debounce
|
|
200
|
+
// window can still walk the graph and reset the quiet timer.
|
|
201
|
+
this.prunePendingDependencyEdges();
|
|
202
|
+
const startedAt = Date.now();
|
|
203
|
+
const labels = this.labelsFor(toReboot);
|
|
204
|
+
const triggers = this.takeTriggers();
|
|
205
|
+
this.logger.info(formatFluxRebootStart(labels, triggers));
|
|
206
|
+
await this.disposeEntries(toReboot);
|
|
207
|
+
await this.bootEntries(toReboot);
|
|
208
|
+
this.logger.info(formatFluxRebootReady(labels, Date.now() - startedAt));
|
|
209
|
+
this.emit("reboot");
|
|
210
|
+
}while (this.rebootFollowUp && !this.disposed)
|
|
211
|
+
} finally{
|
|
212
|
+
const needsFollowUp = this.rebootFollowUp && !this.disposed;
|
|
213
|
+
this.rebootFollowUp = false;
|
|
214
|
+
this.rebootInFlight = false;
|
|
215
|
+
if (needsFollowUp) this.requestReboot();
|
|
142
216
|
}
|
|
143
|
-
return found;
|
|
144
217
|
}
|
|
145
|
-
async
|
|
146
|
-
|
|
147
|
-
const entries = await Promise.all(projects.map(async (project)=>{
|
|
148
|
-
const files = await project.getAllFiles();
|
|
149
|
-
return files.map((file)=>[
|
|
150
|
-
file.fullPath,
|
|
151
|
-
{
|
|
152
|
-
project
|
|
153
|
-
}
|
|
154
|
-
]);
|
|
155
|
-
}));
|
|
156
|
-
return new Map(entries.flat());
|
|
218
|
+
async disposeEntries(entryPaths) {
|
|
219
|
+
await Promise.all(entryPaths.map((entryPath)=>this.disposeEntry(entryPath)));
|
|
157
220
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
if (result != null) return {
|
|
174
|
-
format: "module",
|
|
175
|
-
source: result.source,
|
|
176
|
-
shortCircuit: true
|
|
177
|
-
};
|
|
178
|
-
return next(url, context);
|
|
221
|
+
async disposeEntry(entryPath) {
|
|
222
|
+
const paths = entryPath != null ? [
|
|
223
|
+
entryPath
|
|
224
|
+
] : [
|
|
225
|
+
...this.entries.keys()
|
|
226
|
+
];
|
|
227
|
+
for (const p of paths){
|
|
228
|
+
const state = this.entries.get(p);
|
|
229
|
+
if (state == null) continue;
|
|
230
|
+
const entry = state.module;
|
|
231
|
+
state.module = undefined;
|
|
232
|
+
try {
|
|
233
|
+
await entry?.[Symbol.asyncDispose]();
|
|
234
|
+
} catch (error) {
|
|
235
|
+
this.logger.error("Entry asyncDispose failed", error);
|
|
179
236
|
}
|
|
180
|
-
}
|
|
237
|
+
}
|
|
181
238
|
}
|
|
182
|
-
// ──
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
*/ rewriteJsToTs = (specifier, parentUrl)=>{
|
|
188
|
-
if (!specifier.endsWith(".js")) return null;
|
|
189
|
-
const parentClean = parentUrl.split("?")[0];
|
|
190
|
-
if (!parentClean) return null;
|
|
191
|
-
let jsPath;
|
|
192
|
-
try {
|
|
193
|
-
const resolved = new URL(specifier, parentClean);
|
|
194
|
-
jsPath = _io.io.fileUrlToPath(resolved.toString());
|
|
195
|
-
} catch {
|
|
196
|
-
return null;
|
|
239
|
+
// ── Setup ────────────────────────────────────────────────────────────────
|
|
240
|
+
requireWorkspace() {
|
|
241
|
+
const workspace = this.loader.getWorkspace();
|
|
242
|
+
if (workspace == null) {
|
|
243
|
+
throw new Error("SourceModuleLoader has no workspace after configure");
|
|
197
244
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
245
|
+
return workspace;
|
|
246
|
+
}
|
|
247
|
+
resolveProjects(buildConfig, options) {
|
|
248
|
+
const projects = this.loader.getWorkspace()?.getProjects(buildConfig) ?? [];
|
|
249
|
+
const names = options.projects != null && options.projects.length > 0 ? options.projects : options.project != null ? [
|
|
250
|
+
options.project
|
|
251
|
+
] : undefined;
|
|
252
|
+
if (names == null) {
|
|
253
|
+
const first = projects.at(0);
|
|
254
|
+
if (first == null) {
|
|
255
|
+
throw new Error(`No projects found for configuration: ${buildConfig}`);
|
|
256
|
+
}
|
|
257
|
+
return [
|
|
258
|
+
first
|
|
259
|
+
];
|
|
260
|
+
}
|
|
261
|
+
const selected = [];
|
|
262
|
+
for (const name of names){
|
|
263
|
+
const found = projects.find((p)=>p.name === name);
|
|
264
|
+
if (found == null) {
|
|
265
|
+
throw new Error(`Project "${name}" not found in workspace`);
|
|
266
|
+
}
|
|
267
|
+
selected.push(found);
|
|
268
|
+
}
|
|
269
|
+
return selected;
|
|
270
|
+
}
|
|
203
271
|
/**
|
|
204
272
|
* Post-next dependency tracker: records which source files import which
|
|
205
273
|
* other source files so that reloadIfAffected can traverse the graph.
|
|
@@ -220,55 +288,25 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
220
288
|
} catch {
|
|
221
289
|
parentPath = "";
|
|
222
290
|
}
|
|
223
|
-
const isSource = this.
|
|
224
|
-
const parentIsSource = this.
|
|
291
|
+
const isSource = this.loader.hasSourceFile(filePath);
|
|
292
|
+
const parentIsSource = this.loader.hasSourceFile(parentPath);
|
|
225
293
|
if (isSource || parentIsSource) {
|
|
226
294
|
this.trackDependency(filePath, parentPath);
|
|
227
295
|
}
|
|
228
296
|
};
|
|
229
|
-
loadTs = (url)=>{
|
|
230
|
-
if (!url.startsWith("file:")) return null;
|
|
231
|
-
const cleanPath = new URL(url).pathname;
|
|
232
|
-
const fileInfo = this.fileInfoMap.get(cleanPath);
|
|
233
|
-
if (fileInfo == null) return null;
|
|
234
|
-
const cached = this.transpileCache.get(cleanPath);
|
|
235
|
-
if (cached != null) return {
|
|
236
|
-
source: cached
|
|
237
|
-
};
|
|
238
|
-
const { project } = fileInfo;
|
|
239
|
-
const tsConfig = project.getTsConfigSync();
|
|
240
|
-
const userConfig = project.getSwcConfigSync();
|
|
241
|
-
const file = new _io.FileEx({
|
|
242
|
-
fullPath: cleanPath
|
|
243
|
-
});
|
|
244
|
-
const response = this.transpiler.transformFileSync(file, _forge.BuildTargets.es6, {
|
|
245
|
-
tsConfig,
|
|
246
|
-
aliasPaths: true,
|
|
247
|
-
userConfig
|
|
248
|
-
});
|
|
249
|
-
if (response.outcome !== "success") {
|
|
250
|
-
this.logger.error(`Failed to transpile ${cleanPath}`, response);
|
|
251
|
-
return null;
|
|
252
|
-
}
|
|
253
|
-
this.transpileCache.set(cleanPath, response.code);
|
|
254
|
-
return {
|
|
255
|
-
source: response.code
|
|
256
|
-
};
|
|
257
|
-
};
|
|
258
297
|
// ── File watching ────────────────────────────────────────────────────────
|
|
259
298
|
onFileChange = (evt)=>{
|
|
260
299
|
const { file, eventName, project } = evt;
|
|
261
300
|
const fullPath = file.fullPath;
|
|
262
301
|
this.logger.trace(`File ${eventName}: ${fullPath}`);
|
|
263
302
|
if (eventName === _io.io.WatchEvents.unlink) {
|
|
264
|
-
this.
|
|
303
|
+
this.loader.invalidateTranspile(fullPath);
|
|
304
|
+
this.moduleCache.set(fullPath, null);
|
|
265
305
|
return;
|
|
266
306
|
}
|
|
267
307
|
if (eventName === _io.io.WatchEvents.add) {
|
|
268
308
|
if (project.isSourceFile(file)) {
|
|
269
|
-
this.
|
|
270
|
-
project
|
|
271
|
-
});
|
|
309
|
+
this.loader.setSourceFile(fullPath, project);
|
|
272
310
|
this.moduleCache.set(fullPath, null);
|
|
273
311
|
this.reloadIfAffected(fullPath);
|
|
274
312
|
}
|
|
@@ -276,10 +314,7 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
276
314
|
}
|
|
277
315
|
// change
|
|
278
316
|
if (!project.isSourceFile(file)) return;
|
|
279
|
-
this.
|
|
280
|
-
this.transpiler.invalidateContentCache(new _io.FileEx({
|
|
281
|
-
fullPath
|
|
282
|
-
}));
|
|
317
|
+
this.loader.invalidateTranspile(fullPath);
|
|
283
318
|
this.reloadIfAffected(fullPath);
|
|
284
319
|
};
|
|
285
320
|
reloadIfAffected(fullPath) {
|
|
@@ -290,12 +325,22 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
290
325
|
fullPath
|
|
291
326
|
])
|
|
292
327
|
];
|
|
293
|
-
|
|
328
|
+
const affectedEntries = [
|
|
329
|
+
...this.entries.keys()
|
|
330
|
+
].filter((entryPath)=>modules.includes(entryPath));
|
|
331
|
+
if (affectedEntries.length === 0) {
|
|
294
332
|
this.logger.trace(`Change in ${fullPath} does not affect entry — skipping reload`);
|
|
295
333
|
return false;
|
|
296
334
|
}
|
|
297
335
|
this.logger.trace(`Change in ${fullPath} affects ${modules.length} module(s) — scheduling reload`);
|
|
298
|
-
this.
|
|
336
|
+
this.invalidateModuleCaches(...modules);
|
|
337
|
+
for (const module of modules){
|
|
338
|
+
this.pendingGraphPrune.add(module);
|
|
339
|
+
}
|
|
340
|
+
for (const entryPath of affectedEntries){
|
|
341
|
+
this.pendingEntryReboots.add(entryPath);
|
|
342
|
+
}
|
|
343
|
+
this.pendingTriggers.add(fullPath);
|
|
299
344
|
this.scheduleReboot();
|
|
300
345
|
return true;
|
|
301
346
|
}
|
|
@@ -309,7 +354,7 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
309
354
|
}
|
|
310
355
|
let subDeps = [];
|
|
311
356
|
for (const dep of moduleDeps){
|
|
312
|
-
if (!this.
|
|
357
|
+
if (!this.loader.hasSourceFile(dep)) continue;
|
|
313
358
|
const subs = this.getDependencyGraph(dep, [
|
|
314
359
|
moduleId,
|
|
315
360
|
...parentModules
|
|
@@ -347,14 +392,24 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
347
392
|
}
|
|
348
393
|
versionModule(moduleUrl) {
|
|
349
394
|
const versionedUrl = new URL(moduleUrl);
|
|
350
|
-
versionedUrl.searchParams.set(VERSION_URL_PARAM,
|
|
395
|
+
versionedUrl.searchParams.set(VERSION_URL_PARAM, String(++moduleVersionSeq));
|
|
351
396
|
return versionedUrl.toString();
|
|
352
397
|
}
|
|
353
|
-
|
|
398
|
+
invalidateModuleCaches(...modules) {
|
|
354
399
|
for (const module of modules){
|
|
355
400
|
this.moduleCache.set(module, null);
|
|
356
|
-
this.
|
|
357
|
-
|
|
401
|
+
this.loader.invalidateTranspile(module);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
prunePendingDependencyEdges() {
|
|
405
|
+
const modules = [
|
|
406
|
+
...this.pendingGraphPrune
|
|
407
|
+
];
|
|
408
|
+
this.pendingGraphPrune.clear();
|
|
409
|
+
this.pruneDependencyParents(...modules);
|
|
410
|
+
}
|
|
411
|
+
/** Remove these modules as parents so boot can rebuild edges without stale importers. */ pruneDependencyParents(...modules) {
|
|
412
|
+
for (const module of modules){
|
|
358
413
|
for (const [key, parents] of this.dependencies){
|
|
359
414
|
const filtered = parents.filter((p)=>p !== module);
|
|
360
415
|
if (filtered.length === 0) {
|
|
@@ -366,14 +421,33 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
366
421
|
}
|
|
367
422
|
}
|
|
368
423
|
invalidateAllSourceFiles() {
|
|
369
|
-
for (const filePath of this.
|
|
424
|
+
for (const filePath of this.loader.sourceFilePaths()){
|
|
370
425
|
this.moduleCache.set(filePath, null);
|
|
371
426
|
}
|
|
372
427
|
}
|
|
373
|
-
// ── Utilities ────────────────────────────────────────────────────────────
|
|
374
428
|
isSelf(filePath) {
|
|
375
429
|
return currentFilePath === _nodepath.default.resolve(filePath);
|
|
376
430
|
}
|
|
431
|
+
labelsFor(entryPaths) {
|
|
432
|
+
return entryPaths.map((entryPath)=>this.entries.get(entryPath)?.label ?? _nodepath.default.basename(entryPath));
|
|
433
|
+
}
|
|
434
|
+
takeTriggers() {
|
|
435
|
+
const triggers = [
|
|
436
|
+
...this.pendingTriggers
|
|
437
|
+
].map((fullPath)=>this.formatTrigger(fullPath));
|
|
438
|
+
this.pendingTriggers.clear();
|
|
439
|
+
return triggers;
|
|
440
|
+
}
|
|
441
|
+
formatTrigger(fullPath) {
|
|
442
|
+
const root = this.loader.getWorkspace()?.rootDir;
|
|
443
|
+
if (root != null) {
|
|
444
|
+
const rel = _nodepath.default.relative(_nodepath.default.resolve(root), fullPath);
|
|
445
|
+
if (rel !== "" && !rel.startsWith("..") && !_nodepath.default.isAbsolute(rel)) {
|
|
446
|
+
return rel.replaceAll("\\", "/");
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
return _nodepath.default.basename(fullPath);
|
|
450
|
+
}
|
|
377
451
|
}
|
|
378
452
|
|
|
379
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUge1xuXHRMb2FkRm5PdXRwdXQsXG5cdExvYWRIb29rQ29udGV4dCxcblx0UmVzb2x2ZUZuT3V0cHV0LFxuXHRSZXNvbHZlSG9va0NvbnRleHQsXG59IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJIb29rcyB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQnVpbGRUYXJnZXRzLCBTd2NUcmFuc3BpbGVyLCBXb3Jrc3BhY2VEZWZhdWx0cyB9IGZyb20gXCJAZGVjb2hlcmUvZm9yZ2VcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBXb3Jrc3BhY2VGYWN0b3J5IH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBGaWxlRXgsIGlvIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9pb1wiO1xuaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL3N5c3RlbVwiO1xuaW1wb3J0IHsgdHlwZSBMb2dnZXIsIHNjcmliZSB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG5pbXBvcnQgdHlwZSB7IFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5cbnR5cGUgTG9hZERlbGVnYXRlID0gKHVybDogc3RyaW5nKSA9PiB7IHNvdXJjZTogc3RyaW5nIH0gfCBudWxsO1xuXG5jb25zdCBjdXJyZW50RmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG5jb25zdCBWRVJTSU9OX1VSTF9QQVJBTSA9IFwidmVyc2lvblwiO1xuY29uc3QgUkVCT09UX0RFQk9VTkNFX01TID0gMjUwO1xuXG5leHBvcnQgaW50ZXJmYWNlIEhvdFJlbG9hZFNlcnZlckV2ZW50cyB7XG5cdHN0YXJ0OiBbXTtcblx0cmVib290OiBbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zIHtcblx0LyoqIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbmFtZS4gKi9cblx0YnVpbGRDb25maWc6IHN0cmluZztcblx0LyoqIE5hbWUgb2YgdGhlIHByb2plY3QgdG8gc2VydmUuIERlZmF1bHRzIHRvIHRoZSBmaXJzdCBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UuICovXG5cdHByb2plY3Q/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBQcmUtYnVpbHQgV29ya3NwYWNlIGluc3RhbmNlIHRvIHVzZSBpbnN0ZWFkIG9mIHJ1bm5pbmcgV29ya3NwYWNlRmFjdG9yeS5cblx0ICogVXNlZnVsIGluIHRlc3RzIHRvIGJ5cGFzcyBmaWxlc3lzdGVtLWJhc2VkIHdvcmtzcGFjZSBkaXNjb3ZlcnkuXG5cdCAqL1xuXHR3b3Jrc3BhY2U/OiBXb3Jrc3BhY2U7XG59XG5cbnR5cGUgRmlsZUluZm8gPSB7IHByb2plY3Q6IFByb2plY3QgfTtcblxuZXhwb3J0IGNsYXNzIEhvdFJlbG9hZFNlcnZlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxIb3RSZWxvYWRTZXJ2ZXJFdmVudHM+IHtcblx0Ly8g4pSA4pSAIFN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXHRwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyID0gc2NyaWJlLmxvZ2dlcihIb3RSZWxvYWRTZXJ2ZXIubmFtZSk7XG5cdHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBob29rc1JlZ2lzdGVyZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBlbnRyeU1vZHVsZVBhdGghOiBzdHJpbmc7XG5cdHByaXZhdGUgZW50cnlNb2R1bGU/OiBBc3luY0Rpc3Bvc2FibGU7XG5cdHByaXZhdGUgd29ya3NwYWNlPzogV29ya3NwYWNlO1xuXHRwcml2YXRlIHdhdGNoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXHQvKiogTWFwIGZyb20gYWJzb2x1dGUgLnRzIHNvdXJjZSBmaWxlIHBhdGggdG8gcHJvamVjdCBpbmZvICovXG5cdHByaXZhdGUgZmlsZUluZm9NYXAgPSBuZXcgTWFwPHN0cmluZywgRmlsZUluZm8+KCk7XG5cdHByaXZhdGUgbW9kdWxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4oKTtcblx0cHJpdmF0ZSBkZXBlbmRlbmNpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cdHByaXZhdGUgdHJhbnNwaWxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXHRwcml2YXRlIHRyYW5zcGlsZXIgPSBuZXcgU3djVHJhbnNwaWxlcigpO1xuXG5cdC8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHB1YmxpYyBhc3luYyBzdGFydChvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKSB7XG5cdFx0dGhpcy5kaXNwb3NlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5jbGVhcigpO1xuXHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuY2xlYXIoKTtcblxuXHRcdGNvbnN0IHsgYnVpbGRDb25maWcgfSA9IG9wdGlvbnM7XG5cdFx0dGhpcy53b3Jrc3BhY2UgPSBhd2FpdCB0aGlzLnJlc29sdmVXb3Jrc3BhY2Uob3B0aW9ucyk7XG5cdFx0Y29uc3QgcHJvamVjdCA9IHRoaXMucmVzb2x2ZVByb2plY3QoYnVpbGRDb25maWcsIG9wdGlvbnMucHJvamVjdCk7XG5cblx0XHR0aGlzLmVudHJ5TW9kdWxlUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmdldFNvdXJjZUVudHJ5UGF0aCgpKTtcblx0XHR0aGlzLmZpbGVJbmZvTWFwID0gYXdhaXQgdGhpcy5idWlsZEZpbGVJbmZvTWFwKGJ1aWxkQ29uZmlnKTtcblxuXHRcdHRoaXMucmVnaXN0ZXJIb29rcygpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzKCk7XG5cblx0XHRhd2FpdCB0aGlzLndvcmtzcGFjZS53YXRjaChidWlsZENvbmZpZyk7XG5cdFx0dGhpcy53YXRjaFN1YnNjcmlwdGlvbiA9IHRoaXMud29ya3NwYWNlLnByb2plY3RGaWxlQ2hhbmdlZCQuc3Vic2NyaWJlKHRoaXMub25GaWxlQ2hhbmdlKTtcblxuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBTZXJ2aW5nICR7dGhpcy5lbnRyeU1vZHVsZVBhdGh9YCk7XG5cdFx0YXdhaXQgdGhpcy5ib290RW50cnkoKTtcblx0XHR0aGlzLmVtaXQoXCJzdGFydFwiKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBkaXNwb3NlKCkge1xuXHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0dGhpcy5kaXNwb3NlZCA9IHRydWU7XG5cdFx0dGhpcy53YXRjaFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcblx0XHR0aGlzLndvcmtzcGFjZT8uW1N5bWJvbC5kaXNwb3NlXSgpO1xuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJ5KCk7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkge1xuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZSgpO1xuXHR9XG5cblx0Ly8g4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyeSgpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdXJsID0gdGhpcy52ZXJzaW9uTW9kdWxlKGlvLnBhdGhUb0ZpbGVVcmwodGhpcy5lbnRyeU1vZHVsZVBhdGgpKTtcblx0XHRcdHRoaXMuZW50cnlNb2R1bGUgPSAoYXdhaXQgaW1wb3J0KHVybCkpPy5kZWZhdWx0O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcblx0XHRcdFx0XCJUaGVyZSB3YXMgYW4gZXJyb3IgYm9vdGluZyB0aGUgZW50cnkgcG9pbnQuIFlvdXIgYXBwbGljYXRpb24gbWF5IG5vdCBmdW5jdGlvbiBhcyBleHBlY3RlZFwiLFxuXHRcdFx0XHRlcnJvcixcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyByZWJvb3QoKSB7XG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoXCJSZWJvb3RpbmcgZW50cnkgbW9kdWxlXCIpO1xuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJ5KCk7XG5cdFx0dGhpcy5lbWl0KFwicmVib290XCIpO1xuXHRcdGF3YWl0IHRoaXMuYm9vdEVudHJ5KCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGRpc3Bvc2VFbnRyeSgpIHtcblx0XHRhd2FpdCB0aGlzLmVudHJ5TW9kdWxlPy5bU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcblx0fVxuXG5cdHByaXZhdGUgc2NoZWR1bGVSZWJvb3QgPSBkZWJvdW5jZSgoKSA9PiB0aGlzLnJlYm9vdCgpLCBSRUJPT1RfREVCT1VOQ0VfTVMpO1xuXG5cdC8vIOKUgOKUgCBTZXR1cCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGFzeW5jIHJlc29sdmVXb3Jrc3BhY2Uob3B0aW9uczogSG90UmVsb2FkU2VydmVyT3B0aW9ucyk6IFByb21pc2U8V29ya3NwYWNlPiB7XG5cdFx0cmV0dXJuIChcblx0XHRcdG9wdGlvbnMud29ya3NwYWNlID8/XG5cdFx0XHRXb3Jrc3BhY2VGYWN0b3J5LmNyZWF0ZSh7IC4uLldvcmtzcGFjZURlZmF1bHRzLCByb290RGlyOiBwcm9jZXNzLmN3ZCgpIH0pXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZVByb2plY3QoYnVpbGRDb25maWc6IHN0cmluZywgbmFtZT86IHN0cmluZyk6IFByb2plY3Qge1xuXHRcdGNvbnN0IHByb2plY3RzID0gdGhpcy53b3Jrc3BhY2U/LmdldFByb2plY3RzKGJ1aWxkQ29uZmlnKSA/PyBbXTtcblx0XHRjb25zdCBmb3VuZCA9IG5hbWUgPT0gbnVsbCA/IHByb2plY3RzLmF0KDApIDogcHJvamVjdHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBuYW1lKTtcblx0XHRpZiAoZm91bmQgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRuYW1lID09IG51bGxcblx0XHRcdFx0XHQ/IGBObyBwcm9qZWN0cyBmb3VuZCBmb3IgY29uZmlndXJhdGlvbjogJHtidWlsZENvbmZpZ31gXG5cdFx0XHRcdFx0OiBgUHJvamVjdCBcIiR7bmFtZX1cIiBub3QgZm91bmQgaW4gd29ya3NwYWNlYCxcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiBmb3VuZDtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgYnVpbGRGaWxlSW5mb01hcChidWlsZENvbmZpZzogc3RyaW5nKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBGaWxlSW5mbz4+IHtcblx0XHRjb25zdCBwcm9qZWN0cyA9IHRoaXMud29ya3NwYWNlPy5nZXRQcm9qZWN0cyhidWlsZENvbmZpZykgPz8gW107XG5cdFx0Y29uc3QgZW50cmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0cHJvamVjdHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGZpbGVzID0gYXdhaXQgcHJvamVjdC5nZXRBbGxGaWxlcygpO1xuXHRcdFx0XHRyZXR1cm4gZmlsZXMubWFwKChmaWxlKTogW3N0cmluZywgRmlsZUluZm9dID0+IFtmaWxlLmZ1bGxQYXRoLCB7IHByb2plY3QgfV0pO1xuXHRcdFx0fSksXG5cdFx0KTtcblx0XHRyZXR1cm4gbmV3IE1hcChlbnRyaWVzLmZsYXQoKSk7XG5cdH1cblxuXHRwcml2YXRlIHJlZ2lzdGVySG9va3MoKSB7XG5cdFx0aWYgKHRoaXMuaG9va3NSZWdpc3RlcmVkKSByZXR1cm47XG5cdFx0dGhpcy5ob29rc1JlZ2lzdGVyZWQgPSB0cnVlO1xuXHRcdHJlZ2lzdGVySG9va3Moe1xuXHRcdFx0cmVzb2x2ZTogKFxuXHRcdFx0XHRzcGVjaWZpZXI6IHN0cmluZyxcblx0XHRcdFx0Y29udGV4dDogUmVzb2x2ZUhvb2tDb250ZXh0LFxuXHRcdFx0XHRuZXh0OiAoc3BlY2lmaWVyOiBzdHJpbmcsIGNvbnRleHQ/OiBQYXJ0aWFsPFJlc29sdmVIb29rQ29udGV4dD4pID0+IFJlc29sdmVGbk91dHB1dCxcblx0XHRcdCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuIG5leHQoc3BlY2lmaWVyLCBjb250ZXh0KTtcblx0XHRcdFx0Y29uc3QgcGFyZW50VXJsID0gY29udGV4dC5wYXJlbnRVUkwgPz8gXCJcIjtcblx0XHRcdFx0Y29uc3QgcmV3cml0dGVuID0gdGhpcy5yZXdyaXRlSnNUb1RzKHNwZWNpZmllciwgcGFyZW50VXJsKSA/PyBzcGVjaWZpZXI7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IG5leHQocmV3cml0dGVuLCBjb250ZXh0KSBhcyBSZXNvbHZlRm5PdXRwdXQ7XG5cdFx0XHRcdHRoaXMub25Qb3N0UmVzb2x2ZShyZXN1bHQsIHBhcmVudFVybCk7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9LFxuXHRcdFx0bG9hZDogKFxuXHRcdFx0XHR1cmw6IHN0cmluZyxcblx0XHRcdFx0Y29udGV4dDogTG9hZEhvb2tDb250ZXh0LFxuXHRcdFx0XHRuZXh0OiAodXJsOiBzdHJpbmcsIGNvbnRleHQ/OiBQYXJ0aWFsPExvYWRIb29rQ29udGV4dD4pID0+IExvYWRGbk91dHB1dCxcblx0XHRcdCk6IExvYWRGbk91dHB1dCA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm4gbmV4dCh1cmwsIGNvbnRleHQpO1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSB0aGlzLmxvYWRUcyh1cmwpO1xuXHRcdFx0XHRpZiAocmVzdWx0ICE9IG51bGwpXG5cdFx0XHRcdFx0cmV0dXJuIHsgZm9ybWF0OiBcIm1vZHVsZVwiLCBzb3VyY2U6IHJlc3VsdC5zb3VyY2UsIHNob3J0Q2lyY3VpdDogdHJ1ZSB9O1xuXHRcdFx0XHRyZXR1cm4gbmV4dCh1cmwsIGNvbnRleHQpO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG5cdC8vIOKUgOKUgCBNb2R1bGUgaG9va3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0LyoqXG5cdCAqIFByZS1uZXh0IHNwZWNpZmllciByZXdyaXRlcjogaWYgc3BlY2lmaWVyIGlzIGEgLmpzIGltcG9ydCB0aGF0IG1hcHMgdG8gYVxuXHQgKiBrbm93biAudHMgc291cmNlIGZpbGUsIHJldHVybnMgdGhlIHZlcnNpb25lZCAudHMgZmlsZSBVUkwgc28gbmV4dCgpIG5ldmVyXG5cdCAqIHRyaWVzIHRvIGxvYWQgYSBub24tZXhpc3RlbnQgLmpzIGZpbGUgZnJvbSBkaXNrLlxuXHQgKi9cblx0cHJpdmF0ZSByZXdyaXRlSnNUb1RzID0gKHNwZWNpZmllcjogc3RyaW5nLCBwYXJlbnRVcmw6IHN0cmluZyk6IHN0cmluZyB8IG51bGwgPT4ge1xuXHRcdGlmICghc3BlY2lmaWVyLmVuZHNXaXRoKFwiLmpzXCIpKSByZXR1cm4gbnVsbDtcblxuXHRcdGNvbnN0IHBhcmVudENsZWFuID0gcGFyZW50VXJsLnNwbGl0KFwiP1wiKVswXTtcblx0XHRpZiAoIXBhcmVudENsZWFuKSByZXR1cm4gbnVsbDtcblxuXHRcdGxldCBqc1BhdGg6IHN0cmluZztcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgcmVzb2x2ZWQgPSBuZXcgVVJMKHNwZWNpZmllciwgcGFyZW50Q2xlYW4pO1xuXHRcdFx0anNQYXRoID0gaW8uZmlsZVVybFRvUGF0aChyZXNvbHZlZC50b1N0cmluZygpKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGlmICghanNQYXRoLmVuZHNXaXRoKFwiLmpzXCIpKSByZXR1cm4gbnVsbDtcblx0XHRjb25zdCB0c1BhdGggPSBqc1BhdGgucmVwbGFjZSgvXFwuanMkLywgXCIudHNcIik7XG5cdFx0aWYgKCF0aGlzLmZpbGVJbmZvTWFwLmhhcyh0c1BhdGgpKSByZXR1cm4gbnVsbDtcblxuXHRcdHJldHVybiB0aGlzLmdldENhY2hlZE9yTmV3KGlvLnBhdGhUb0ZpbGVVcmwodHNQYXRoKSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFBvc3QtbmV4dCBkZXBlbmRlbmN5IHRyYWNrZXI6IHJlY29yZHMgd2hpY2ggc291cmNlIGZpbGVzIGltcG9ydCB3aGljaFxuXHQgKiBvdGhlciBzb3VyY2UgZmlsZXMgc28gdGhhdCByZWxvYWRJZkFmZmVjdGVkIGNhbiB0cmF2ZXJzZSB0aGUgZ3JhcGguXG5cdCAqL1xuXHRwcml2YXRlIG9uUG9zdFJlc29sdmUgPSAocmVzdWx0OiBSZXNvbHZlRm5PdXRwdXQsIHBhcmVudFVybDogc3RyaW5nKSA9PiB7XG5cdFx0Y29uc3QgeyB1cmwgfSA9IHJlc3VsdDtcblx0XHRjb25zdCBwYXJlbnRVcmxDbGVhbiA9IHBhcmVudFVybC5zcGxpdChcIj9cIilbMF07XG5cblx0XHRsZXQgZmlsZVBhdGg6IHN0cmluZztcblx0XHRsZXQgcGFyZW50UGF0aDogc3RyaW5nO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKTtcblx0XHRcdHVybE9iai5zZWFyY2ggPSBcIlwiO1xuXHRcdFx0ZmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKHVybE9iai50b1N0cmluZygpKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0cGFyZW50UGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgocGFyZW50VXJsQ2xlYW4pO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cGFyZW50UGF0aCA9IFwiXCI7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXNTb3VyY2UgPSB0aGlzLmZpbGVJbmZvTWFwLmhhcyhmaWxlUGF0aCk7XG5cdFx0Y29uc3QgcGFyZW50SXNTb3VyY2UgPSB0aGlzLmZpbGVJbmZvTWFwLmhhcyhwYXJlbnRQYXRoKTtcblxuXHRcdGlmIChpc1NvdXJjZSB8fCBwYXJlbnRJc1NvdXJjZSkge1xuXHRcdFx0dGhpcy50cmFja0RlcGVuZGVuY3koZmlsZVBhdGgsIHBhcmVudFBhdGgpO1xuXHRcdH1cblx0fTtcblxuXHRwcml2YXRlIGxvYWRUczogTG9hZERlbGVnYXRlID0gKHVybDogc3RyaW5nKSA9PiB7XG5cdFx0aWYgKCF1cmwuc3RhcnRzV2l0aChcImZpbGU6XCIpKSByZXR1cm4gbnVsbDtcblxuXHRcdGNvbnN0IGNsZWFuUGF0aCA9IG5ldyBVUkwodXJsKS5wYXRobmFtZTtcblx0XHRjb25zdCBmaWxlSW5mbyA9IHRoaXMuZmlsZUluZm9NYXAuZ2V0KGNsZWFuUGF0aCk7XG5cdFx0aWYgKGZpbGVJbmZvID09IG51bGwpIHJldHVybiBudWxsO1xuXG5cdFx0Y29uc3QgY2FjaGVkID0gdGhpcy50cmFuc3BpbGVDYWNoZS5nZXQoY2xlYW5QYXRoKTtcblx0XHRpZiAoY2FjaGVkICE9IG51bGwpIHJldHVybiB7IHNvdXJjZTogY2FjaGVkIH07XG5cblx0XHRjb25zdCB7IHByb2plY3QgfSA9IGZpbGVJbmZvO1xuXHRcdGNvbnN0IHRzQ29uZmlnID0gcHJvamVjdC5nZXRUc0NvbmZpZ1N5bmMoKTtcblx0XHRjb25zdCB1c2VyQ29uZmlnID0gcHJvamVjdC5nZXRTd2NDb25maWdTeW5jKCk7XG5cblx0XHRjb25zdCBmaWxlID0gbmV3IEZpbGVFeCh7IGZ1bGxQYXRoOiBjbGVhblBhdGggfSk7XG5cdFx0Y29uc3QgcmVzcG9uc2UgPSB0aGlzLnRyYW5zcGlsZXIudHJhbnNmb3JtRmlsZVN5bmMoZmlsZSwgQnVpbGRUYXJnZXRzLmVzNiwge1xuXHRcdFx0dHNDb25maWcsXG5cdFx0XHRhbGlhc1BhdGhzOiB0cnVlLFxuXHRcdFx0dXNlckNvbmZpZyxcblx0XHR9KTtcblxuXHRcdGlmIChyZXNwb25zZS5vdXRjb21lICE9PSBcInN1Y2Nlc3NcIikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byB0cmFuc3BpbGUgJHtjbGVhblBhdGh9YCwgcmVzcG9uc2UpO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5zZXQoY2xlYW5QYXRoLCByZXNwb25zZS5jb2RlKTtcblx0XHRyZXR1cm4geyBzb3VyY2U6IHJlc3BvbnNlLmNvZGUgfTtcblx0fTtcblxuXHQvLyDilIDilIAgRmlsZSB3YXRjaGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIG9uRmlsZUNoYW5nZSA9IChldnQ6IFByb2plY3RGaWxlRXZlbnQpID0+IHtcblx0XHRjb25zdCB7IGZpbGUsIGV2ZW50TmFtZSwgcHJvamVjdCB9ID0gZXZ0O1xuXHRcdGNvbnN0IGZ1bGxQYXRoID0gZmlsZS5mdWxsUGF0aDtcblxuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBGaWxlICR7ZXZlbnROYW1lfTogJHtmdWxsUGF0aH1gKTtcblxuXHRcdGlmIChldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLnVubGluaykge1xuXHRcdFx0dGhpcy5maWxlSW5mb01hcC5kZWxldGUoZnVsbFBhdGgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLmFkZCkge1xuXHRcdFx0aWYgKHByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSB7XG5cdFx0XHRcdHRoaXMuZmlsZUluZm9NYXAuc2V0KGZ1bGxQYXRoLCB7IHByb2plY3QgfSk7XG5cdFx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZ1bGxQYXRoLCBudWxsKTtcblx0XHRcdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBjaGFuZ2Vcblx0XHRpZiAoIXByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSByZXR1cm47XG5cdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5kZWxldGUoZnVsbFBhdGgpO1xuXHRcdHRoaXMudHJhbnNwaWxlci5pbnZhbGlkYXRlQ29udGVudENhY2hlKG5ldyBGaWxlRXgoeyBmdWxsUGF0aCB9KSk7XG5cdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIHJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChmdWxsUGF0aCk7XG5cdFx0Y29uc3QgbW9kdWxlcyA9IFsuLi5uZXcgU2V0KFsuLi5kZXBzLCBmdWxsUGF0aF0pXTtcblxuXHRcdGlmICghbW9kdWxlcy5pbmNsdWRlcyh0aGlzLmVudHJ5TW9kdWxlUGF0aCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gZG9lcyBub3QgYWZmZWN0IGVudHJ5IOKAlCBza2lwcGluZyByZWxvYWRgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShcblx0XHRcdGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gYWZmZWN0cyAke21vZHVsZXMubGVuZ3RofSBtb2R1bGUocykg4oCUIHNjaGVkdWxpbmcgcmVsb2FkYCxcblx0XHQpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZU1vZHVsZSguLi5tb2R1bGVzKTtcblx0XHR0aGlzLnNjaGVkdWxlUmVib290KCk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyDilIDilIAgRGVwZW5kZW5jeSBncmFwaCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGdldERlcGVuZGVuY3lHcmFwaChtb2R1bGVJZDogc3RyaW5nLCBwYXJlbnRNb2R1bGVzOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nW10ge1xuXHRcdGlmICh0aGlzLmlzU2VsZihtb2R1bGVJZCkpIHJldHVybiBbXTtcblxuXHRcdGNvbnN0IG1vZHVsZURlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQobW9kdWxlSWQpID8/IFtdO1xuXHRcdGlmIChwYXJlbnRNb2R1bGVzLmluY2x1ZGVzKG1vZHVsZUlkKSkge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZDogJHttb2R1bGVJZH1gKTtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRsZXQgc3ViRGVwczogc3RyaW5nW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IGRlcCBvZiBtb2R1bGVEZXBzKSB7XG5cdFx0XHRpZiAoIXRoaXMuZmlsZUluZm9NYXAuaGFzKGRlcCkpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3Qgc3VicyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGRlcCwgW21vZHVsZUlkLCAuLi5wYXJlbnRNb2R1bGVzXSk7XG5cdFx0XHRzdWJEZXBzID0gWy4uLnN1YkRlcHMsIC4uLnN1YnNdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbLi4ubmV3IFNldChbLi4ubW9kdWxlRGVwcywgLi4uc3ViRGVwc10pXTtcblx0fVxuXG5cdHByaXZhdGUgdHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoOiBzdHJpbmcsIHBhcmVudFBhdGg6IHN0cmluZykge1xuXHRcdGlmICghcGFyZW50UGF0aCkgcmV0dXJuO1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQoZmlsZVBhdGgpID8/IFtdO1xuXHRcdGNvbnN0IHVwZGF0ZWREZXBzID0gbmV3IFNldChbLi4uZGVwcywgcGFyZW50UGF0aF0pO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChmaWxlUGF0aCwgWy4uLnVwZGF0ZWREZXBzXSk7XG5cdH1cblxuXHQvLyDilIDilIAgTW9kdWxlIGNhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0Q2FjaGVkT3JOZXcobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgobW9kdWxlVXJsKTtcblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLm1vZHVsZUNhY2hlLmdldChmaWxlUGF0aCk7XG5cdFx0Y29uc3QgdmVyc2lvbmVkID0gY2FjaGVkID8/IHRoaXMudmVyc2lvbk1vZHVsZShtb2R1bGVVcmwpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCB2ZXJzaW9uZWQpO1xuXHRcdHJldHVybiB2ZXJzaW9uZWQ7XG5cdH1cblxuXHRwcml2YXRlIHZlcnNpb25Nb2R1bGUobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCB2ZXJzaW9uZWRVcmwgPSBuZXcgVVJMKG1vZHVsZVVybCk7XG5cdFx0dmVyc2lvbmVkVXJsLnNlYXJjaFBhcmFtcy5zZXQoVkVSU0lPTl9VUkxfUEFSQU0sIERhdGUubm93KCkudG9TdHJpbmcoKSk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZFVybC50b1N0cmluZygpO1xuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlTW9kdWxlKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuZGVsZXRlKG1vZHVsZSk7XG5cdFx0XHQvLyBQcnVuZSBzdGFsZSBvdXRnb2luZyBlZGdlczogcmVtb3ZlIHRoaXMgbW9kdWxlIGFzIGEgcGFyZW50IGZyb20gYWxsIGRlcGVuZGVuY3kgbGlzdHNcblx0XHRcdGZvciAoY29uc3QgW2tleSwgcGFyZW50c10gb2YgdGhpcy5kZXBlbmRlbmNpZXMpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gcCAhPT0gbW9kdWxlKTtcblx0XHRcdFx0aWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmRlbGV0ZShrZXkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChrZXksIGZpbHRlcmVkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzKCkge1xuXHRcdGZvciAoY29uc3QgZmlsZVBhdGggb2YgdGhpcy5maWxlSW5mb01hcC5rZXlzKCkpIHtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCBudWxsKTtcblx0XHR9XG5cdH1cblxuXHQvLyDilIDilIAgVXRpbGl0aWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgaXNTZWxmKGZpbGVQYXRoOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gY3VycmVudEZpbGVQYXRoID09PSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiSG90UmVsb2FkU2VydmVyIiwiY3VycmVudEZpbGVQYXRoIiwiaW8iLCJmaWxlVXJsVG9QYXRoIiwiVkVSU0lPTl9VUkxfUEFSQU0iLCJSRUJPT1RfREVCT1VOQ0VfTVMiLCJFdmVudEVtaXR0ZXIiLCJsb2dnZXIiLCJzY3JpYmUiLCJuYW1lIiwiZGlzcG9zZWQiLCJob29rc1JlZ2lzdGVyZWQiLCJlbnRyeU1vZHVsZVBhdGgiLCJlbnRyeU1vZHVsZSIsIndvcmtzcGFjZSIsIndhdGNoU3Vic2NyaXB0aW9uIiwiZmlsZUluZm9NYXAiLCJNYXAiLCJtb2R1bGVDYWNoZSIsImRlcGVuZGVuY2llcyIsInRyYW5zcGlsZUNhY2hlIiwidHJhbnNwaWxlciIsIlN3Y1RyYW5zcGlsZXIiLCJzdGFydCIsIm9wdGlvbnMiLCJjbGVhciIsImJ1aWxkQ29uZmlnIiwicmVzb2x2ZVdvcmtzcGFjZSIsInByb2plY3QiLCJyZXNvbHZlUHJvamVjdCIsInBhdGgiLCJyZXNvbHZlIiwiZ2V0U291cmNlRW50cnlQYXRoIiwiYnVpbGRGaWxlSW5mb01hcCIsInJlZ2lzdGVySG9va3MiLCJpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMiLCJ3YXRjaCIsInByb2plY3RGaWxlQ2hhbmdlZCQiLCJzdWJzY3JpYmUiLCJvbkZpbGVDaGFuZ2UiLCJ0cmFjZSIsImJvb3RFbnRyeSIsImVtaXQiLCJkaXNwb3NlIiwidW5zdWJzY3JpYmUiLCJTeW1ib2wiLCJkaXNwb3NlRW50cnkiLCJhc3luY0Rpc3Bvc2UiLCJ1cmwiLCJ2ZXJzaW9uTW9kdWxlIiwicGF0aFRvRmlsZVVybCIsImRlZmF1bHQiLCJlcnJvciIsInJlYm9vdCIsInNjaGVkdWxlUmVib290IiwiZGVib3VuY2UiLCJXb3Jrc3BhY2VGYWN0b3J5IiwiY3JlYXRlIiwiV29ya3NwYWNlRGVmYXVsdHMiLCJyb290RGlyIiwicHJvY2VzcyIsImN3ZCIsInByb2plY3RzIiwiZ2V0UHJvamVjdHMiLCJmb3VuZCIsImF0IiwiZmluZCIsInAiLCJFcnJvciIsImVudHJpZXMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwiZmlsZXMiLCJnZXRBbGxGaWxlcyIsImZpbGUiLCJmdWxsUGF0aCIsImZsYXQiLCJzcGVjaWZpZXIiLCJjb250ZXh0IiwibmV4dCIsInBhcmVudFVybCIsInBhcmVudFVSTCIsInJld3JpdHRlbiIsInJld3JpdGVKc1RvVHMiLCJyZXN1bHQiLCJvblBvc3RSZXNvbHZlIiwibG9hZCIsImxvYWRUcyIsImZvcm1hdCIsInNvdXJjZSIsInNob3J0Q2lyY3VpdCIsImVuZHNXaXRoIiwicGFyZW50Q2xlYW4iLCJzcGxpdCIsImpzUGF0aCIsInJlc29sdmVkIiwiVVJMIiwidG9TdHJpbmciLCJ0c1BhdGgiLCJyZXBsYWNlIiwiaGFzIiwiZ2V0Q2FjaGVkT3JOZXciLCJwYXJlbnRVcmxDbGVhbiIsImZpbGVQYXRoIiwicGFyZW50UGF0aCIsInVybE9iaiIsInNlYXJjaCIsImlzU291cmNlIiwicGFyZW50SXNTb3VyY2UiLCJ0cmFja0RlcGVuZGVuY3kiLCJzdGFydHNXaXRoIiwiY2xlYW5QYXRoIiwicGF0aG5hbWUiLCJmaWxlSW5mbyIsImdldCIsImNhY2hlZCIsInRzQ29uZmlnIiwiZ2V0VHNDb25maWdTeW5jIiwidXNlckNvbmZpZyIsImdldFN3Y0NvbmZpZ1N5bmMiLCJGaWxlRXgiLCJyZXNwb25zZSIsInRyYW5zZm9ybUZpbGVTeW5jIiwiQnVpbGRUYXJnZXRzIiwiZXM2IiwiYWxpYXNQYXRocyIsIm91dGNvbWUiLCJzZXQiLCJjb2RlIiwiZXZ0IiwiZXZlbnROYW1lIiwiV2F0Y2hFdmVudHMiLCJ1bmxpbmsiLCJkZWxldGUiLCJhZGQiLCJpc1NvdXJjZUZpbGUiLCJyZWxvYWRJZkFmZmVjdGVkIiwiaW52YWxpZGF0ZUNvbnRlbnRDYWNoZSIsImRlcHMiLCJnZXREZXBlbmRlbmN5R3JhcGgiLCJtb2R1bGVzIiwiU2V0IiwiaW5jbHVkZXMiLCJsZW5ndGgiLCJpbnZhbGlkYXRlTW9kdWxlIiwibW9kdWxlSWQiLCJwYXJlbnRNb2R1bGVzIiwiaXNTZWxmIiwibW9kdWxlRGVwcyIsInN1YkRlcHMiLCJkZXAiLCJzdWJzIiwidXBkYXRlZERlcHMiLCJtb2R1bGVVcmwiLCJ2ZXJzaW9uZWQiLCJ2ZXJzaW9uZWRVcmwiLCJzZWFyY2hQYXJhbXMiLCJEYXRlIiwibm93IiwibW9kdWxlIiwia2V5IiwicGFyZW50cyIsImZpbHRlcmVkIiwiZmlsdGVyIiwia2V5cyJdLCJtYXBwaW5ncyI6Ijs7OzsrQkEwQ2FBOzs7ZUFBQUE7Ozs0QkExQ2dCOzRCQU9DO2lFQUNiO3VCQUM4QztzQkFFOUI7b0JBQ047d0JBQ0Y7d0JBQ1c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBS3BDLE1BQU1DLGtCQUFrQkMsTUFBRSxDQUFDQyxhQUFhLENBQUM7QUFDekMsTUFBTUMsb0JBQW9CO0FBQzFCLE1BQU1DLHFCQUFxQjtBQXFCcEIsTUFBTUwsd0JBQXdCTSx3QkFBWTtJQUNoRCw0RUFBNEU7SUFDM0RDLFNBQWlCQyxjQUFNLENBQUNELE1BQU0sQ0FBQ1AsZ0JBQWdCUyxJQUFJLEVBQUU7SUFDOURDLFdBQVcsTUFBTTtJQUNqQkMsa0JBQWtCLE1BQU07SUFDeEJDLGdCQUF5QjtJQUN6QkMsWUFBOEI7SUFDOUJDLFVBQXNCO0lBQ3RCQyxrQkFBaUM7SUFDekMsMkRBQTJELEdBQzNELEFBQVFDLGNBQWMsSUFBSUMsTUFBd0I7SUFDMUNDLGNBQWMsSUFBSUQsTUFBNkI7SUFDL0NFLGVBQWUsSUFBSUYsTUFBd0I7SUFDM0NHLGlCQUFpQixJQUFJSCxNQUFzQjtJQUMzQ0ksYUFBYSxJQUFJQyxvQkFBYSxHQUFHO0lBRXpDLDRFQUE0RTtJQUU1RSxNQUFhQyxNQUFNQyxPQUErQixFQUFFO1FBQ25ELElBQUksQ0FBQ2QsUUFBUSxHQUFHO1FBQ2hCLElBQUksQ0FBQ1MsWUFBWSxD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
|
|
453
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRm5PdXRwdXQgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9zeXN0ZW1cIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgU291cmNlTW9kdWxlTG9hZGVyIH0gZnJvbSBcIi4vc291cmNlLW1vZHVsZS1sb2FkZXIuanNcIjtcblxuY29uc3QgY3VycmVudEZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgVkVSU0lPTl9VUkxfUEFSQU0gPSBcInZlcnNpb25cIjtcbi8qKiBEZWZhdWx0IHF1aWV0IHdpbmRvdyBiZWZvcmUgYSBmaWxlLWNoYW5nZSByZWJvb3QuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMgPSAyNTA7XG4vKiogSG93IG1hbnkgdHJpZ2dlcmluZyBwYXRocyB0byBwcmludCBvbiB0aGUgaW5mbyBiYW5uZXIgYmVmb3JlIGArTmAuICovXG5jb25zdCBNQVhfUkVCT09UX1RSSUdHRVJfUEFUSFMgPSA0O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlYm9vdERlYm91bmNlTXModmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG5cdGNvbnN0IGRlbGF5ID0gdmFsdWUgPz8gREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVM7XG5cdGlmICghTnVtYmVyLmlzRmluaXRlKGRlbGF5KSB8fCBkZWxheSA8IDApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYHJlYm9vdERlYm91bmNlTXMgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIsIGdvdCAke1N0cmluZyh2YWx1ZSl9YCk7XG5cdH1cblx0cmV0dXJuIGRlbGF5O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUcmlnZ2VyTGlzdCh0cmlnZ2VyczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAodHJpZ2dlcnMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRpZiAodHJpZ2dlcnMubGVuZ3RoIDw9IE1BWF9SRUJPT1RfVFJJR0dFUl9QQVRIUykgcmV0dXJuIHRyaWdnZXJzLmpvaW4oXCIsIFwiKTtcblx0cmV0dXJuIGAke3RyaWdnZXJzLnNsaWNlKDAsIE1BWF9SRUJPT1RfVFJJR0dFUl9QQVRIUykuam9pbihcIiwgXCIpfSwgKyR7dHJpZ2dlcnMubGVuZ3RoIC0gTUFYX1JFQk9PVF9UUklHR0VSX1BBVEhTfWA7XG59XG5cbmNvbnN0IEJBTk5FUl9SVUxFID0gXCLilZBcIi5yZXBlYXQoNTYpO1xuXG5mdW5jdGlvbiB3cmFwRmx1eEJhbm5lcih0aXRsZTogc3RyaW5nLCBkZXRhaWxzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdGNvbnN0IGJvZHkgPSBkZXRhaWxzLm1hcCgobGluZSkgPT4gYCAgJHtsaW5lfWApLmpvaW4oXCJcXG5cIik7XG5cdHJldHVybiBgXFxuJHtCQU5ORVJfUlVMRX1cXG4gICR7dGl0bGV9XFxuJHtib2R5fVxcbiR7QkFOTkVSX1JVTEV9XFxuYDtcbn1cblxuLyoqIEluZm8tbGV2ZWwgSE1SIHN0YXJ0IGJsb2NrIOKAlCBrZWVwIGBmbHV4IHJlYm9vdGAgaW4gdGhlIHRleHQgc28gb3BlcmF0b3JzIGNhbiBzZWFyY2ggdGhlIGJ1ZmZlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRGbHV4UmVib290U3RhcnQoXG5cdGxhYmVsczogcmVhZG9ubHkgc3RyaW5nW10sXG5cdHRyaWdnZXJzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuKTogc3RyaW5nIHtcblx0Y29uc3Qgd2hvID0gbGFiZWxzLmpvaW4oXCIsIFwiKSB8fCBcImVudHJ5XCI7XG5cdGNvbnN0IGZpbGVzID0gZm9ybWF0VHJpZ2dlckxpc3QodHJpZ2dlcnMpO1xuXHRjb25zdCBkZXRhaWxzID0gZmlsZXMgPT0gbnVsbCA/IFt3aG9dIDogW3dobywgZmlsZXNdO1xuXHRyZXR1cm4gd3JhcEZsdXhCYW5uZXIoXCJGTFVYIFJFQk9PVFwiLCBkZXRhaWxzKTtcbn1cblxuLyoqIEluZm8tbGV2ZWwgSE1SIGZpbmlzaCBibG9jay4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRGbHV4UmVib290UmVhZHkobGFiZWxzOiByZWFkb25seSBzdHJpbmdbXSwgZWxhcHNlZE1zOiBudW1iZXIpOiBzdHJpbmcge1xuXHRjb25zdCB3aG8gPSBsYWJlbHMuam9pbihcIiwgXCIpIHx8IFwiZW50cnlcIjtcblx0cmV0dXJuIHdyYXBGbHV4QmFubmVyKFwiRkxVWCBSRUFEWVwiLCBbd2hvLCBgJHtNYXRoLm1heCgwLCBNYXRoLnJvdW5kKGVsYXBzZWRNcykpfW1zYF0pO1xufVxuXG4vKiogUHJvY2Vzcy13aWRlOiBOb2RlJ3MgRVNNIGNhY2hlIGlzIHByb2Nlc3MtZ2xvYmFsLCBpbmNsdWRpbmcgYWNyb3NzIEhvdFJlbG9hZFNlcnZlciBpbnN0YW5jZXMuICovXG5sZXQgbW9kdWxlVmVyc2lvblNlcSA9IDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyRXZlbnRzIHtcblx0c3RhcnQ6IFtdO1xuXHRyZWJvb3Q6IFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhvdFJlbG9hZFNlcnZlck9wdGlvbnMge1xuXHQvKiogQnVpbGQgY29uZmlndXJhdGlvbiBuYW1lLiAqL1xuXHRidWlsZENvbmZpZzogc3RyaW5nO1xuXHQvKiogTmFtZSBvZiB0aGUgcHJvamVjdCB0byBzZXJ2ZS4gRGVmYXVsdHMgdG8gdGhlIGZpcnN0IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZS4gKi9cblx0cHJvamVjdD86IHN0cmluZztcblx0LyoqXG5cdCAqIE11bHRpcGxlIEZsdXggYXBwIHBhY2thZ2UgbmFtZXMgdG8gYm9vdCBpbiBvbmUgcHJvY2VzcyAoZGlyZWN0b3J5IHNsaWNlKS5cblx0ICogV2hlbiBzZXQsIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB7QGxpbmsgcHJvamVjdH0uXG5cdCAqL1xuXHRwcm9qZWN0cz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHQvKipcblx0ICogUHJlLWJ1aWx0IFdvcmtzcGFjZSBpbnN0YW5jZSB0byB1c2UgaW5zdGVhZCBvZiBydW5uaW5nIFdvcmtzcGFjZUZhY3RvcnkuXG5cdCAqIFVzZWZ1bCBpbiB0ZXN0cyB0byBieXBhc3MgZmlsZXN5c3RlbS1iYXNlZCB3b3Jrc3BhY2UgZGlzY292ZXJ5LlxuXHQgKi9cblx0d29ya3NwYWNlPzogV29ya3NwYWNlO1xuXHQvKipcblx0ICogUXVpZXQgd2luZG93IGluIG1pbGxpc2Vjb25kcyBhZnRlciB0aGUgbGFzdCBhZmZlY3Rpbmcgc2F2ZSBiZWZvcmUgYSByZWJvb3QuXG5cdCAqIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NU30uIFJhaXNlIHRoaXMgZm9yIGFnZW50IHNhdmUgdHJhaW5zLlxuXHQgKi9cblx0cmVib290RGVib3VuY2VNcz86IG51bWJlcjtcbn1cblxudHlwZSBFbnRyeVN0YXRlID0geyBwYXRoOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IG1vZHVsZT86IEFzeW5jRGlzcG9zYWJsZSB9O1xuXG5leHBvcnQgY2xhc3MgSG90UmVsb2FkU2VydmVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyPEhvdFJlbG9hZFNlcnZlckV2ZW50cz4ge1xuXHQvLyDilIDilIAgU3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cdHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXIgPSBzY3JpYmUubG9nZ2VyKEhvdFJlbG9hZFNlcnZlci5uYW1lKTtcblx0cHJpdmF0ZSByZWFkb25seSBsb2FkZXIgPSBuZXcgU291cmNlTW9kdWxlTG9hZGVyKCk7XG5cdHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcblx0LyoqIEFic29sdXRlIGVudHJ5IHBhdGhzIGN1cnJlbnRseSBzZXJ2ZWQgKG9uZSBvciBtb3JlIEZsdXggYXBwcykuICovXG5cdHByaXZhdGUgZW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCBFbnRyeVN0YXRlPigpO1xuXHRwcml2YXRlIHBlbmRpbmdFbnRyeVJlYm9vdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0LyoqIFNvdXJjZSBwYXRocyB0aGF0IHNjaGVkdWxlZCB0aGUgbmV4dCByZWJvb3QgKGNsZWFyZWQgd2hlbiB0aGF0IHJlYm9vdCBzdGFydHMpLiAqL1xuXHRwcml2YXRlIHBlbmRpbmdUcmlnZ2VycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRwcml2YXRlIHdhdGNoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXHRwcml2YXRlIG1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cdHByaXZhdGUgZGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXHRwcml2YXRlIHJlYm9vdFRhaWw6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0cHJpdmF0ZSByZWJvb3REZWJvdW5jZUdlbiA9IDA7XG5cdHByaXZhdGUgcmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0cHJpdmF0ZSByZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRwcml2YXRlIHJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHQvKiogTW9kdWxlcyB3aG9zZSByZXZlcnNlLWdyYXBoIGVkZ2VzIGFyZSBwcnVuZWQgYXQgcmVib290LCBub3Qgb24gc2NoZWR1bGUuICovXG5cdHByaXZhdGUgcGVuZGluZ0dyYXBoUHJ1bmUgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0cHJpdmF0ZSBzY2hlZHVsZVJlYm9vdDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG5cdC8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHB1YmxpYyBhc3luYyBzdGFydChvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKSB7XG5cdFx0dGhpcy5kaXNwb3NlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5jbGVhcigpO1xuXHRcdHRoaXMuZW50cmllcy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ1RyaWdnZXJzLmNsZWFyKCk7XG5cdFx0dGhpcy5wZW5kaW5nR3JhcGhQcnVuZS5jbGVhcigpO1xuXHRcdHRoaXMucmVib290VGFpbCA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdHRoaXMucmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSBmYWxzZTtcblx0XHR0aGlzLmJpbmRTY2hlZHVsZVJlYm9vdChyZXNvbHZlUmVib290RGVib3VuY2VNcyhvcHRpb25zLnJlYm9vdERlYm91bmNlTXMpKTtcblxuXHRcdGNvbnN0IHsgYnVpbGRDb25maWcgfSA9IG9wdGlvbnM7XG5cblx0XHRhd2FpdCB0aGlzLmxvYWRlci5jb25maWd1cmUoe1xuXHRcdFx0YnVpbGRDb25maWcsXG5cdFx0XHR3b3Jrc3BhY2U6IG9wdGlvbnMud29ya3NwYWNlLFxuXHRcdFx0dmVyc2lvbkZpbGVVcmw6IChmaWxlVXJsKSA9PiB0aGlzLmdldENhY2hlZE9yTmV3KGZpbGVVcmwpLFxuXHRcdFx0b25SZXNvbHZlZDogdGhpcy5vblBvc3RSZXNvbHZlLFxuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgd29ya3NwYWNlID0gdGhpcy5yZXF1aXJlV29ya3NwYWNlKCk7XG5cdFx0Y29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnJlc29sdmVQcm9qZWN0cyhidWlsZENvbmZpZywgb3B0aW9ucyk7XG5cdFx0Zm9yIChjb25zdCBwcm9qZWN0IG9mIHNlbGVjdGVkKSB7XG5cdFx0XHRjb25zdCBlbnRyeVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5nZXRTb3VyY2VFbnRyeVBhdGgoKSk7XG5cdFx0XHR0aGlzLmVudHJpZXMuc2V0KGVudHJ5UGF0aCwgeyBwYXRoOiBlbnRyeVBhdGgsIGxhYmVsOiBwcm9qZWN0Lm5hbWUgfSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5sb2FkZXIucmVnaXN0ZXJIb29rcygpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzKCk7XG5cblx0XHRhd2FpdCB3b3Jrc3BhY2Uud2F0Y2goYnVpbGRDb25maWcpO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24gPSB3b3Jrc3BhY2UucHJvamVjdEZpbGVDaGFuZ2VkJC5zdWJzY3JpYmUodGhpcy5vbkZpbGVDaGFuZ2UpO1xuXG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMudmFsdWVzKCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBTZXJ2aW5nICR7ZW50cnkucGF0aH1gKTtcblx0XHR9XG5cdFx0YXdhaXQgdGhpcy5ib290RW50cmllcyhbLi4udGhpcy5lbnRyaWVzLmtleXMoKV0pO1xuXHRcdHRoaXMuZW1pdChcInN0YXJ0XCIpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGRpc3Bvc2UoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcblx0XHR0aGlzLnJlYm9vdERlYm91bmNlR2VuICs9IDE7XG5cdFx0dGhpcy53YXRjaFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcblx0XHRhd2FpdCB0aGlzLnJlYm9vdFRhaWw7XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlRW50cmllcyhbLi4udGhpcy5lbnRyaWVzLmtleXMoKV0pO1xuXHRcdHRoaXMubG9hZGVyLmRpc3Bvc2UoKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlKCk7XG5cdH1cblxuXHQvLyDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgYXN5bmMgYm9vdEVudHJpZXMoZW50cnlQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pIHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChlbnRyeVBhdGhzLm1hcCgoZW50cnlQYXRoKSA9PiB0aGlzLmJvb3RFbnRyeShlbnRyeVBhdGgpKSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyeShlbnRyeVBhdGg6IHN0cmluZykge1xuXHRcdGNvbnN0IHN0YXRlID0gdGhpcy5lbnRyaWVzLmdldChlbnRyeVBhdGgpO1xuXHRcdGlmIChzdGF0ZSA9PSBudWxsKSByZXR1cm47XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG1vZCA9IChhd2FpdCB0aGlzLmxvYWRlci5pbXBvcnRFbnRyeShlbnRyeVBhdGgpKSBhcyB7XG5cdFx0XHRcdGRlZmF1bHQ/OiBBc3luY0Rpc3Bvc2FibGU7XG5cdFx0XHR9O1xuXHRcdFx0c3RhdGUubW9kdWxlID0gbW9kPy5kZWZhdWx0O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRzdGF0ZS5tb2R1bGUgPSB1bmRlZmluZWQ7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcblx0XHRcdFx0XCJUaGVyZSB3YXMgYW4gZXJyb3IgYm9vdGluZyB0aGUgZW50cnkgcG9pbnQuIFlvdXIgYXBwbGljYXRpb24gbWF5IG5vdCBmdW5jdGlvbiBhcyBleHBlY3RlZFwiLFxuXHRcdFx0XHRlcnJvcixcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBiaW5kU2NoZWR1bGVSZWJvb3QoZGVsYXlNczogbnVtYmVyKSB7XG5cdFx0Y29uc3QgZ2VuID0gKyt0aGlzLnJlYm9vdERlYm91bmNlR2VuO1xuXHRcdHRoaXMuc2NoZWR1bGVSZWJvb3QgPSBkZWJvdW5jZShhc3luYyAoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5kaXNwb3NlZCB8fCBnZW4gIT09IHRoaXMucmVib290RGVib3VuY2VHZW4pIHJldHVybjtcblx0XHRcdHRoaXMucmVxdWVzdFJlYm9vdCgpO1xuXHRcdH0sIGRlbGF5TXMpO1xuXHR9XG5cblx0cHJpdmF0ZSByZXF1ZXN0UmVib290KCkge1xuXHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0aWYgKHRoaXMucmVib290SW5GbGlnaHQpIHtcblx0XHRcdHRoaXMucmVib290Rm9sbG93VXAgPSB0cnVlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAodGhpcy5yZWJvb3RRdWV1ZWQpIHJldHVybjtcblx0XHR0aGlzLnJlYm9vdFF1ZXVlZCA9IHRydWU7XG5cdFx0dGhpcy5yZWJvb3RUYWlsID0gdGhpcy5yZWJvb3RUYWlsLnRoZW4oXG5cdFx0XHQoKSA9PiB0aGlzLnJ1blJlYm9vdCgpLFxuXHRcdFx0KCkgPT4gdGhpcy5ydW5SZWJvb3QoKSxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBydW5SZWJvb3QoKSB7XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSBmYWxzZTtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdHRoaXMucmVib290SW5GbGlnaHQgPSB0cnVlO1xuXHRcdHRyeSB7XG5cdFx0XHRkbyB7XG5cdFx0XHRcdHRoaXMucmVib290Rm9sbG93VXAgPSBmYWxzZTtcblx0XHRcdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHRcdFx0Y29uc3QgdG9SZWJvb3QgPVxuXHRcdFx0XHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5zaXplID4gMFxuXHRcdFx0XHRcdFx0PyBbLi4udGhpcy5wZW5kaW5nRW50cnlSZWJvb3RzXVxuXHRcdFx0XHRcdFx0OiBbLi4udGhpcy5lbnRyaWVzLmtleXMoKV07XG5cdFx0XHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5jbGVhcigpO1xuXHRcdFx0XHQvLyBEcm9wIHJldmVyc2UgZWRnZXMgb25seSB3aGVuIHJlYm9vdGluZyBzbyBsYXRlciBzYXZlcyBpbiB0aGUgZGVib3VuY2Vcblx0XHRcdFx0Ly8gd2luZG93IGNhbiBzdGlsbCB3YWxrIHRoZSBncmFwaCBhbmQgcmVzZXQgdGhlIHF1aWV0IHRpbWVyLlxuXHRcdFx0XHR0aGlzLnBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcygpO1xuXHRcdFx0XHRjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuXHRcdFx0XHRjb25zdCBsYWJlbHMgPSB0aGlzLmxhYmVsc0Zvcih0b1JlYm9vdCk7XG5cdFx0XHRcdGNvbnN0IHRyaWdnZXJzID0gdGhpcy50YWtlVHJpZ2dlcnMoKTtcblx0XHRcdFx0dGhpcy5sb2dnZXIuaW5mbyhmb3JtYXRGbHV4UmVib290U3RhcnQobGFiZWxzLCB0cmlnZ2VycykpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyaWVzKHRvUmVib290KTtcblx0XHRcdFx0YXdhaXQgdGhpcy5ib290RW50cmllcyh0b1JlYm9vdCk7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmluZm8oZm9ybWF0Rmx1eFJlYm9vdFJlYWR5KGxhYmVscywgRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCkpO1xuXHRcdFx0XHR0aGlzLmVtaXQoXCJyZWJvb3RcIik7XG5cdFx0XHR9IHdoaWxlICh0aGlzLnJlYm9vdEZvbGxvd1VwICYmICF0aGlzLmRpc3Bvc2VkKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0Y29uc3QgbmVlZHNGb2xsb3dVcCA9IHRoaXMucmVib290Rm9sbG93VXAgJiYgIXRoaXMuZGlzcG9zZWQ7XG5cdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0XHR0aGlzLnJlYm9vdEluRmxpZ2h0ID0gZmFsc2U7XG5cdFx0XHRpZiAobmVlZHNGb2xsb3dVcCkgdGhpcy5yZXF1ZXN0UmVib290KCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwb3NlRW50cmllcyhlbnRyeVBhdGhzOiByZWFkb25seSBzdHJpbmdbXSkge1xuXHRcdGF3YWl0IFByb21pc2UuYWxsKGVudHJ5UGF0aHMubWFwKChlbnRyeVBhdGgpID0+IHRoaXMuZGlzcG9zZUVudHJ5KGVudHJ5UGF0aCkpKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZGlzcG9zZUVudHJ5KGVudHJ5UGF0aD86IHN0cmluZykge1xuXHRcdGNvbnN0IHBhdGhzID0gZW50cnlQYXRoICE9IG51bGwgPyBbZW50cnlQYXRoXSA6IFsuLi50aGlzLmVudHJpZXMua2V5cygpXTtcblx0XHRmb3IgKGNvbnN0IHAgb2YgcGF0aHMpIHtcblx0XHRcdGNvbnN0IHN0YXRlID0gdGhpcy5lbnRyaWVzLmdldChwKTtcblx0XHRcdGlmIChzdGF0ZSA9PSBudWxsKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IGVudHJ5ID0gc3RhdGUubW9kdWxlO1xuXHRcdFx0c3RhdGUubW9kdWxlID0gdW5kZWZpbmVkO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgZW50cnk/LltTeW1ib2wuYXN5bmNEaXNwb3NlXSgpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXCJFbnRyeSBhc3luY0Rpc3Bvc2UgZmFpbGVkXCIsIGVycm9yKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyDilIDilIAgU2V0dXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSByZXF1aXJlV29ya3NwYWNlKCk6IFdvcmtzcGFjZSB7XG5cdFx0Y29uc3Qgd29ya3NwYWNlID0gdGhpcy5sb2FkZXIuZ2V0V29ya3NwYWNlKCk7XG5cdFx0aWYgKHdvcmtzcGFjZSA9PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJTb3VyY2VNb2R1bGVMb2FkZXIgaGFzIG5vIHdvcmtzcGFjZSBhZnRlciBjb25maWd1cmVcIik7XG5cdFx0fVxuXHRcdHJldHVybiB3b3Jrc3BhY2U7XG5cdH1cblxuXHRwcml2YXRlIHJlc29sdmVQcm9qZWN0cyhidWlsZENvbmZpZzogc3RyaW5nLCBvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKTogUHJvamVjdFtdIHtcblx0XHRjb25zdCBwcm9qZWN0cyA9IHRoaXMubG9hZGVyLmdldFdvcmtzcGFjZSgpPy5nZXRQcm9qZWN0cyhidWlsZENvbmZpZykgPz8gW107XG5cdFx0Y29uc3QgbmFtZXMgPVxuXHRcdFx0b3B0aW9ucy5wcm9qZWN0cyAhPSBudWxsICYmIG9wdGlvbnMucHJvamVjdHMubGVuZ3RoID4gMFxuXHRcdFx0XHQ/IG9wdGlvbnMucHJvamVjdHNcblx0XHRcdFx0OiBvcHRpb25zLnByb2plY3QgIT0gbnVsbFxuXHRcdFx0XHRcdD8gW29wdGlvbnMucHJvamVjdF1cblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblxuXHRcdGlmIChuYW1lcyA9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBmaXJzdCA9IHByb2plY3RzLmF0KDApO1xuXHRcdFx0aWYgKGZpcnN0ID09IG51bGwpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBObyBwcm9qZWN0cyBmb3VuZCBmb3IgY29uZmlndXJhdGlvbjogJHtidWlsZENvbmZpZ31gKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBbZmlyc3RdO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNlbGVjdGVkOiBQcm9qZWN0W10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcblx0XHRcdGNvbnN0IGZvdW5kID0gcHJvamVjdHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBuYW1lKTtcblx0XHRcdGlmIChmb3VuZCA9PSBudWxsKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgUHJvamVjdCBcIiR7bmFtZX1cIiBub3QgZm91bmQgaW4gd29ya3NwYWNlYCk7XG5cdFx0XHR9XG5cdFx0XHRzZWxlY3RlZC5wdXNoKGZvdW5kKTtcblx0XHR9XG5cdFx0cmV0dXJuIHNlbGVjdGVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBvc3QtbmV4dCBkZXBlbmRlbmN5IHRyYWNrZXI6IHJlY29yZHMgd2hpY2ggc291cmNlIGZpbGVzIGltcG9ydCB3aGljaFxuXHQgKiBvdGhlciBzb3VyY2UgZmlsZXMgc28gdGhhdCByZWxvYWRJZkFmZmVjdGVkIGNhbiB0cmF2ZXJzZSB0aGUgZ3JhcGguXG5cdCAqL1xuXHRwcml2YXRlIG9uUG9zdFJlc29sdmUgPSAocmVzdWx0OiBSZXNvbHZlRm5PdXRwdXQsIHBhcmVudFVybDogc3RyaW5nKSA9PiB7XG5cdFx0Y29uc3QgeyB1cmwgfSA9IHJlc3VsdDtcblx0XHRjb25zdCBwYXJlbnRVcmxDbGVhbiA9IHBhcmVudFVybC5zcGxpdChcIj9cIilbMF07XG5cblx0XHRsZXQgZmlsZVBhdGg6IHN0cmluZztcblx0XHRsZXQgcGFyZW50UGF0aDogc3RyaW5nO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKTtcblx0XHRcdHVybE9iai5zZWFyY2ggPSBcIlwiO1xuXHRcdFx0ZmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKHVybE9iai50b1N0cmluZygpKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0cGFyZW50UGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgocGFyZW50VXJsQ2xlYW4pO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cGFyZW50UGF0aCA9IFwiXCI7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXNTb3VyY2UgPSB0aGlzLmxvYWRlci5oYXNTb3VyY2VGaWxlKGZpbGVQYXRoKTtcblx0XHRjb25zdCBwYXJlbnRJc1NvdXJjZSA9IHRoaXMubG9hZGVyLmhhc1NvdXJjZUZpbGUocGFyZW50UGF0aCk7XG5cblx0XHRpZiAoaXNTb3VyY2UgfHwgcGFyZW50SXNTb3VyY2UpIHtcblx0XHRcdHRoaXMudHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoLCBwYXJlbnRQYXRoKTtcblx0XHR9XG5cdH07XG5cblx0Ly8g4pSA4pSAIEZpbGUgd2F0Y2hpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBvbkZpbGVDaGFuZ2UgPSAoZXZ0OiBQcm9qZWN0RmlsZUV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgeyBmaWxlLCBldmVudE5hbWUsIHByb2plY3QgfSA9IGV2dDtcblx0XHRjb25zdCBmdWxsUGF0aCA9IGZpbGUuZnVsbFBhdGg7XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShgRmlsZSAke2V2ZW50TmFtZX06ICR7ZnVsbFBhdGh9YCk7XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy51bmxpbmspIHtcblx0XHRcdHRoaXMubG9hZGVyLmludmFsaWRhdGVUcmFuc3BpbGUoZnVsbFBhdGgpO1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZnVsbFBhdGgsIG51bGwpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLmFkZCkge1xuXHRcdFx0aWYgKHByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSB7XG5cdFx0XHRcdHRoaXMubG9hZGVyLnNldFNvdXJjZUZpbGUoZnVsbFBhdGgsIHByb2plY3QpO1xuXHRcdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmdWxsUGF0aCwgbnVsbCk7XG5cdFx0XHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gY2hhbmdlXG5cdFx0aWYgKCFwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkgcmV0dXJuO1xuXHRcdHRoaXMubG9hZGVyLmludmFsaWRhdGVUcmFuc3BpbGUoZnVsbFBhdGgpO1xuXHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdH07XG5cblx0cHJpdmF0ZSByZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5nZXREZXBlbmRlbmN5R3JhcGgoZnVsbFBhdGgpO1xuXHRcdGNvbnN0IG1vZHVsZXMgPSBbLi4ubmV3IFNldChbLi4uZGVwcywgZnVsbFBhdGhdKV07XG5cdFx0Y29uc3QgYWZmZWN0ZWRFbnRyaWVzID0gWy4uLnRoaXMuZW50cmllcy5rZXlzKCldLmZpbHRlcigoZW50cnlQYXRoKSA9PlxuXHRcdFx0bW9kdWxlcy5pbmNsdWRlcyhlbnRyeVBhdGgpLFxuXHRcdCk7XG5cblx0XHRpZiAoYWZmZWN0ZWRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYENoYW5nZSBpbiAke2Z1bGxQYXRofSBkb2VzIG5vdCBhZmZlY3QgZW50cnkg4oCUIHNraXBwaW5nIHJlbG9hZGApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKFxuXHRcdFx0YENoYW5nZSBpbiAke2Z1bGxQYXRofSBhZmZlY3RzICR7bW9kdWxlcy5sZW5ndGh9IG1vZHVsZShzKSDigJQgc2NoZWR1bGluZyByZWxvYWRgLFxuXHRcdCk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlTW9kdWxlQ2FjaGVzKC4uLm1vZHVsZXMpO1xuXHRcdGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcblx0XHRcdHRoaXMucGVuZGluZ0dyYXBoUHJ1bmUuYWRkKG1vZHVsZSk7XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgZW50cnlQYXRoIG9mIGFmZmVjdGVkRW50cmllcykge1xuXHRcdFx0dGhpcy5wZW5kaW5nRW50cnlSZWJvb3RzLmFkZChlbnRyeVBhdGgpO1xuXHRcdH1cblx0XHR0aGlzLnBlbmRpbmdUcmlnZ2Vycy5hZGQoZnVsbFBhdGgpO1xuXHRcdHRoaXMuc2NoZWR1bGVSZWJvb3QoKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIOKUgOKUgCBEZXBlbmRlbmN5IGdyYXBoIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0RGVwZW5kZW5jeUdyYXBoKG1vZHVsZUlkOiBzdHJpbmcsIHBhcmVudE1vZHVsZXM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmdbXSB7XG5cdFx0aWYgKHRoaXMuaXNTZWxmKG1vZHVsZUlkKSkgcmV0dXJuIFtdO1xuXG5cdFx0Y29uc3QgbW9kdWxlRGVwcyA9IHRoaXMuZGVwZW5kZW5jaWVzLmdldChtb2R1bGVJZCkgPz8gW107XG5cdFx0aWYgKHBhcmVudE1vZHVsZXMuaW5jbHVkZXMobW9kdWxlSWQpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkOiAke21vZHVsZUlkfWApO1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdGxldCBzdWJEZXBzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGZvciAoY29uc3QgZGVwIG9mIG1vZHVsZURlcHMpIHtcblx0XHRcdGlmICghdGhpcy5sb2FkZXIuaGFzU291cmNlRmlsZShkZXApKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IHN1YnMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChkZXAsIFttb2R1bGVJZCwgLi4ucGFyZW50TW9kdWxlc10pO1xuXHRcdFx0c3ViRGVwcyA9IFsuLi5zdWJEZXBzLCAuLi5zdWJzXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gWy4uLm5ldyBTZXQoWy4uLm1vZHVsZURlcHMsIC4uLnN1YkRlcHNdKV07XG5cdH1cblxuXHRwcml2YXRlIHRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aDogc3RyaW5nLCBwYXJlbnRQYXRoOiBzdHJpbmcpIHtcblx0XHRpZiAoIXBhcmVudFBhdGgpIHJldHVybjtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KGZpbGVQYXRoKSA/PyBbXTtcblx0XHRjb25zdCB1cGRhdGVkRGVwcyA9IG5ldyBTZXQoWy4uLmRlcHMsIHBhcmVudFBhdGhdKTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoZmlsZVBhdGgsIFsuLi51cGRhdGVkRGVwc10pO1xuXHR9XG5cblx0Ly8g4pSA4pSAIE1vZHVsZSBjYWNoZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGdldENhY2hlZE9yTmV3KG1vZHVsZVVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgZmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKG1vZHVsZVVybCk7XG5cdFx0Y29uc3QgY2FjaGVkID0gdGhpcy5tb2R1bGVDYWNoZS5nZXQoZmlsZVBhdGgpO1xuXHRcdGNvbnN0IHZlcnNpb25lZCA9IGNhY2hlZCA/PyB0aGlzLnZlcnNpb25Nb2R1bGUobW9kdWxlVXJsKTtcblx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmaWxlUGF0aCwgdmVyc2lvbmVkKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkO1xuXHR9XG5cblx0cHJpdmF0ZSB2ZXJzaW9uTW9kdWxlKG1vZHVsZVVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgdmVyc2lvbmVkVXJsID0gbmV3IFVSTChtb2R1bGVVcmwpO1xuXHRcdHZlcnNpb25lZFVybC5zZWFyY2hQYXJhbXMuc2V0KFZFUlNJT05fVVJMX1BBUkFNLCBTdHJpbmcoKyttb2R1bGVWZXJzaW9uU2VxKSk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZFVybC50b1N0cmluZygpO1xuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlTW9kdWxlQ2FjaGVzKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHRcdHRoaXMubG9hZGVyLmludmFsaWRhdGVUcmFuc3BpbGUobW9kdWxlKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcygpIHtcblx0XHRjb25zdCBtb2R1bGVzID0gWy4uLnRoaXMucGVuZGluZ0dyYXBoUHJ1bmVdO1xuXHRcdHRoaXMucGVuZGluZ0dyYXBoUHJ1bmUuY2xlYXIoKTtcblx0XHR0aGlzLnBydW5lRGVwZW5kZW5jeVBhcmVudHMoLi4ubW9kdWxlcyk7XG5cdH1cblxuXHQvKiogUmVtb3ZlIHRoZXNlIG1vZHVsZXMgYXMgcGFyZW50cyBzbyBib290IGNhbiByZWJ1aWxkIGVkZ2VzIHdpdGhvdXQgc3RhbGUgaW1wb3J0ZXJzLiAqL1xuXHRwcml2YXRlIHBydW5lRGVwZW5kZW5jeVBhcmVudHMoLi4ubW9kdWxlczogc3RyaW5nW10pIHtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IFtrZXksIHBhcmVudHNdIG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG5cdFx0XHRcdGNvbnN0IGZpbHRlcmVkID0gcGFyZW50cy5maWx0ZXIoKHApID0+IHAgIT09IG1vZHVsZSk7XG5cdFx0XHRcdGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5kZWxldGUoa2V5KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoa2V5LCBmaWx0ZXJlZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpIHtcblx0XHRmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHRoaXMubG9hZGVyLnNvdXJjZUZpbGVQYXRocygpKSB7XG5cdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmaWxlUGF0aCwgbnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBpc1NlbGYoZmlsZVBhdGg6IHN0cmluZykge1xuXHRcdHJldHVybiBjdXJyZW50RmlsZVBhdGggPT09IHBhdGgucmVzb2x2ZShmaWxlUGF0aCk7XG5cdH1cblxuXHRwcml2YXRlIGxhYmVsc0ZvcihlbnRyeVBhdGhzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gZW50cnlQYXRocy5tYXAoXG5cdFx0XHQoZW50cnlQYXRoKSA9PiB0aGlzLmVudHJpZXMuZ2V0KGVudHJ5UGF0aCk/LmxhYmVsID8/IHBhdGguYmFzZW5hbWUoZW50cnlQYXRoKSxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSB0YWtlVHJpZ2dlcnMoKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IHRyaWdnZXJzID0gWy4uLnRoaXMucGVuZGluZ1RyaWdnZXJzXS5tYXAoKGZ1bGxQYXRoKSA9PiB0aGlzLmZvcm1hdFRyaWdnZXIoZnVsbFBhdGgpKTtcblx0XHR0aGlzLnBlbmRpbmdUcmlnZ2Vycy5jbGVhcigpO1xuXHRcdHJldHVybiB0cmlnZ2Vycztcblx0fVxuXG5cdHByaXZhdGUgZm9ybWF0VHJpZ2dlcihmdWxsUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCByb290ID0gdGhpcy5sb2FkZXIuZ2V0V29ya3NwYWNlKCk/LnJvb3REaXI7XG5cdFx0aWYgKHJvb3QgIT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgcmVsID0gcGF0aC5yZWxhdGl2ZShwYXRoLnJlc29sdmUocm9vdCksIGZ1bGxQYXRoKTtcblx0XHRcdGlmIChyZWwgIT09IFwiXCIgJiYgIXJlbC5zdGFydHNXaXRoKFwiLi5cIikgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWwpKSB7XG5cdFx0XHRcdHJldHVybiByZWwucmVwbGFjZUFsbChcIlxcXFxcIiwgXCIvXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcGF0aC5iYXNlbmFtZShmdWxsUGF0aCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NUyIsIkhvdFJlbG9hZFNlcnZlciIsImZvcm1hdEZsdXhSZWJvb3RSZWFkeSIsImZvcm1hdEZsdXhSZWJvb3RTdGFydCIsInJlc29sdmVSZWJvb3REZWJvdW5jZU1zIiwiY3VycmVudEZpbGVQYXRoIiwiaW8iLCJmaWxlVXJsVG9QYXRoIiwiVkVSU0lPTl9VUkxfUEFSQU0iLCJNQVhfUkVCT09UX1RSSUdHRVJfUEFUSFMiLCJ2YWx1ZSIsImRlbGF5IiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJFcnJvciIsIlN0cmluZyIsImZvcm1hdFRyaWdnZXJMaXN0IiwidHJpZ2dlcnMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJqb2luIiwic2xpY2UiLCJCQU5ORVJfUlVMRSIsInJlcGVhdCIsIndyYXBGbHV4QmFubmVyIiwidGl0bGUiLCJkZXRhaWxzIiwiYm9keSIsIm1hcCIsImxpbmUiLCJsYWJlbHMiLCJ3aG8iLCJmaWxlcyIsImVsYXBzZWRNcyIsIk1hdGgiLCJtYXgiLCJyb3VuZCIsIm1vZHVsZVZlcnNpb25TZXEiLCJFdmVudEVtaXR0ZXIiLCJsb2dnZXIiLCJzY3JpYmUiLCJuYW1lIiwibG9hZGVyIiwiU291cmNlTW9kdWxlTG9hZGVyIiwiZGlzcG9zZWQiLCJlbnRyaWVzIiwiTWFwIiwicGVuZGluZ0VudHJ5UmVib290cyIsIlNldCIsInBlbmRpbmdUcmlnZ2VycyIsIndhdGNoU3Vic2NyaXB0aW9uIiwibW9kdWxlQ2FjaGUiLCJkZXBlbmRlbmNpZXMiLCJyZWJvb3RUYWlsIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWJvb3REZWJvdW5jZUdlbiIsInJlYm9vdEluRmxpZ2h0IiwicmVib290Rm9sbG93VXAiLCJyZWJvb3RRdWV1ZWQiLCJwZW5kaW5nR3JhcGhQcnVuZSIsInNjaGVkdWxlUmVib290Iiwic3RhcnQiLCJvcHRpb25zIiwiY2xlYXIiLCJiaW5kU2NoZWR1bGVSZWJvb3QiLCJyZWJvb3REZWJvdW5jZU1zIiwiYnVpbGRDb25maWciLCJjb25maWd1cmUiLCJ3b3Jrc3BhY2UiLCJ2ZXJzaW9uRmlsZVVybCIsImZpbGVVcmwiLCJnZXRDYWNoZWRPck5ldyIsIm9uUmVzb2x2ZWQiLCJvblBvc3RSZXNvbHZlIiwicmVxdWlyZVdvcmtzcGFjZSIsInNlbGVjdGVkIiwicmVzb2x2ZVByb2plY3RzIiwicHJvamVjdCIsImVudHJ5UGF0aCIsInBhdGgiLCJnZXRTb3VyY2VFbnRyeVBhdGgiLCJzZXQiLCJsYWJlbCIsInJlZ2lzdGVySG9va3MiLCJpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMiLCJ3YXRjaCIsInByb2plY3RGaWxlQ2hhbmdlZCQiLCJzdWJzY3JpYmUiLCJvbkZpbGVDaGFuZ2UiLCJlbnRyeSIsInZhbHVlcyIsInRyYWNlIiwiYm9vdEVudHJpZXMiLCJrZXlzIiwiZW1pdCIsImRpc3Bvc2UiLCJ1bnN1YnNjcmliZSIsImRpc3Bvc2VFbnRyaWVzIiwiU3ltYm9sIiwiYXN5bmNEaXNwb3NlIiwiZW50cnlQYXRocyIsImFsbCIsImJvb3RFbnRyeSIsInN0YXRlIiwiZ2V0IiwibW9kIiwiaW1wb3J0RW50cnkiLCJtb2R1bGUiLCJkZWZhdWx0IiwiZXJyb3IiLCJkZWxheU1zIiwiZ2VuIiwiZGVib3VuY2UiLCJyZXF1ZXN0UmVib290IiwidGhlbiIsInJ1blJlYm9vdCIsInRvUmVib290Iiwic2l6ZSIsInBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcyIsInN0YXJ0ZWRBdCIsIkRhdGUiLCJub3ciLCJsYWJlbHNGb3IiLCJ0YWtlVHJpZ2dlcnMiLCJpbmZvIiwibmVlZHNGb2xsb3dVcCIsImRpc3Bvc2VFbnRyeSIsInBhdGhzIiwicCIsImdldFdvcmtzcGFjZSIsInByb2plY3RzIiwiZ2V0UHJvamVjdHMiLCJuYW1lcyIsImZpcnN0IiwiYXQiLCJmb3VuZCIsImZpbmQiLCJwdXNoIiwicmVzdWx0IiwicGFyZW50VXJsIiwidXJsIiwicGFyZW50VXJsQ2xlYW4iLCJzcGxpdCIsImZpbGVQYXRoIiwicGFyZW50UGF0aCIsInVybE9iaiIsIlVSTCIsInNlYXJjaCIsInRvU3RyaW5nIiwiaXNTb3VyY2UiLCJoYXNTb3VyY2VGaWxlIiwicGFyZW50SXNTb3VyY2UiLCJ0cmFja0RlcGVuZGVuY3kiLCJldnQiLCJmaWxlIiwiZXZlbnROYW1lIiwiZnVsbFBhdGgiLCJXYXRjaEV2ZW50cyIsInVubGluayIsImludmFsaWRhdGVUcmFuc3BpbGUiLCJhZGQiLCJpc1NvdXJjZUZpbGUiLCJzZXRTb3VyY2VGaWxlIiwicmVsb2FkSWZBZmZlY3RlZCIsImRlcHMiLCJnZXREZXBlbmRlbmN5R3JhcGgiLCJtb2R1bGVzIiwiYWZmZWN0ZWRFbnRyaWVzIiwiZmlsdGVyIiwiaW5jbHVkZXMiLCJpbnZhbGlkYXRlTW9kdWxlQ2FjaGVzIiwibW9kdWxlSWQiLCJwYXJlbnRNb2R1bGVzIiwiaXNTZWxmIiwibW9kdWxlRGVwcyIsInN1YkRlcHMiLCJkZXAiLCJzdWJzIiwidXBkYXRlZERlcHMiLCJtb2R1bGVVcmwiLCJjYWNoZWQiLCJ2ZXJzaW9uZWQiLCJ2ZXJzaW9uTW9kdWxlIiwidmVyc2lvbmVkVXJsIiwic2VhcmNoUGFyYW1zIiwicHJ1bmVEZXBlbmRlbmN5UGFyZW50cyIsImtleSIsInBhcmVudHMiLCJmaWx0ZXJlZCIsImRlbGV0ZSIsInNvdXJjZUZpbGVQYXRocyIsImJhc2VuYW1lIiwiZm9ybWF0VHJpZ2dlciIsInJvb3QiLCJyb290RGlyIiwicmVsIiwicmVsYXRpdmUiLCJzdGFydHNXaXRoIiwiaXNBYnNvbHV0ZSIsInJlcGxhY2VBbGwiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O1FBYWFBO2VBQUFBOztRQTBFQUM7ZUFBQUE7O1FBckNHQztlQUFBQTs7UUFYQUM7ZUFBQUE7O1FBdEJBQztlQUFBQTs7OzRCQWpCYTtpRUFFWjtvQkFFRTt3QkFDTTt3QkFDVztvQ0FFRDs7Ozs7O0FBRW5DLE1BQU1DLGtCQUFrQkMsTUFBRSxDQUFDQyxhQUFhLENBQUM7QUFDekMsTUFBTUMsb0JBQW9CO0FBRW5CLE1BQU1SLDZCQUE2QjtBQUMxQyx1RUFBdUUsR0FDdkUsTUFBTVMsMkJBQTJCO0FBRTFCLFNBQVNMLHdCQUF3Qk0sS0FBeUI7SUFDaEUsTUFBTUMsUUFBUUQsU0FBU1Y7SUFDdkIsSUFBSSxDQUFDWSxPQUFPQyxRQUFRLENBQUNGLFVBQVVBLFFBQVEsR0FBRztRQUN6QyxNQUFNLElBQUlHLE1BQU0sQ0FBQyxvREFBb0QsRUFBRUMsT0FBT0wsUUFBUTtJQUN2RjtJQUNBLE9BQU9DO0FBQ1I7QUFFQSxTQUFTSyxrQkFBa0JDLFFBQTJCO0lBQ3JELElBQUlBLFNBQVNDLE1BQU0sS0FBSyxHQUFHLE9BQU9DO0lBQ2xDLElBQUlGLFNBQVNDLE1BQU0sSUFBSVQsMEJBQTBCLE9BQU9RLFNBQVNHLElBQUksQ0FBQztJQUN0RSxPQUFPLEdBQUdILFNBQVNJLEtBQUssQ0FBQyxHQUFHWiwwQkFBMEJXLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRUgsU0FBU0MsTUFBTSxHQUFHVCwwQkFBMEI7QUFDbkg7QUFFQSxNQUFNYSxjQUFjLElBQUlDLE1BQU0sQ0FBQztBQUUvQixTQUFTQyxlQUFlQyxLQUFhLEVBQUVDLE9BQTBCO0lBQ2hFLE1BQU1DLE9BQU9ELFFBQVFFLEdBQUcsQ0FBQyxDQUFDQyxPQUFTLENBQUMsRUFBRSxFQUFFQSxNQUFNLEVBQUVULElBQUksQ0FBQztJQUNyRCxPQUFPLENBQUMsRUFBRSxFQUFFRSxZQUFZLElBQUksRUFBRUcsTUFBTSxFQUFFLEVBQUVFLEtBQUssRUFBRSxFQUFFTCxZQUFZLEVBQUUsQ0FBQztBQUNqRTtBQUdPLFNBQVNuQixzQkFDZjJCLE1BQXlCLEVBQ3pCYixXQUE4QixFQUFFO0lBRWhDLE1BQU1jLE1BQU1ELE9BQU9WLElBQUksQ0FBQyxTQUFTO0lBQ2pDLE1BQU1ZLFFBQVFoQixrQkFBa0JDO0lBQ2hDLE1BQU1TLFVBQVVNLFNBQVMsT0FBTztRQUFDRDtLQUFJLEdBQUc7UUFBQ0E7UUFBS0M7S0FBTTtJQUNwRCxPQUFPUixlQUFlLGVBQWVFO0FBQ3RDO0FBR08sU0FBU3hCLHNCQUFzQjRCLE1BQXlCLEVBQUVHLFNBQWlCO0lBQ2pGLE1BQU1GLE1BQU1ELE9BQU9WLElBQUksQ0FBQyxTQUFTO0lBQ2pDLE9BQU9JLGVBQWUsY0FBYztRQUFDTztRQUFLLEdBQUdHLEtBQUtDLEdBQUcsQ0FBQyxHQUFHRCxLQUFLRSxLQUFLLENBQUNILFlBQVksRUFBRSxDQUFDO0tBQUM7QUFDckY7QUFFQSxrR0FBa0csR0FDbEcsSUFBSUksbUJBQW1CO0FBK0JoQixNQUFNcEMsd0JBQXdCcUMsd0JBQVk7SUFDaEQsNEVBQTRFO0lBQzNEQyxTQUFpQkMsY0FBTSxDQUFDRCxNQUFNLENBQUN0QyxnQkFBZ0J3QyxJQUFJLEVBQUU7SUFDckRDLFNBQVMsSUFBSUMsc0NBQWtCLEdBQUc7SUFDM0NDLFdBQVcsTUFBTTtJQUN6QixtRUFBbUUsR0FDbkUsQUFBUUMsVUFBVSxJQUFJQyxNQUEwQjtJQUN4Q0Msc0JBQXNCLElBQUlDLE1BQWM7SUFDaEQsbUZBQW1GLEdBQ25GLEFBQVFDLGtCQUFrQixJQUFJRCxNQUFjO0lBQ3BDRSxrQkFBaUM7SUFDakNDLGNBQWMsSUFBSUwsTUFBNkI7SUFDL0NNLGVBQWUsSUFBSU4sTUFBd0I7SUFDM0NPLGFBQTRCQyxRQUFRQyxPQUFPLEdBQUc7SUFDOUNDLG9CQUFvQixFQUFFO0lBQ3RCQyxpQkFBaUIsTUFBTTtJQUN2QkMsaUJBQWlCLE1BQU07SUFDdkJDLGVBQWUsTUFBTTtJQUM3Qiw2RUFBNkUsR0FDN0UsQUFBUUMsb0JBQW9CLElBQUlaLE1BQWM7SUFDdENhLGlCQUE2QixLQUFPLEVBQUU7SUFFOUMsNEVBQTRFO0lBRTVFLE1BQWFDLE1BQU1DLE9BQStCLEVBQUU7UUFDbkQsSUFBSSxDQUFDbkIsUUFBUSxHQUFHO1FBQ2hCLElBQUksQ0FBQ1EsWUFBWSxDQUFDWSxLQUFLO1FBQ3ZCLElBQUksQ0FBQ2IsV0FBVyxDQUFDYSxLQUFLO1FBQ3RCLElBQUksQ0FBQ25CLE9BQU8sQ0FBQ21CLEtBQUs7UUFDbEIsSUFBSSxDQUFDakIsbUJBQW1CLENBQUNpQixLQUFLO1FBQzlCLElBQUksQ0FBQ2YsZUFBZSxDQUFDZSxLQUFLO1FBQzFCLElBQUksQ0FBQ0osaUJBQWlCLENBQUNJLEtBQUs7UUFDNUIsSUFBSSxDQUFDWCxVQUFVLEdBQUdDLFFBQVFDLE9BQU87UUFDakMsSUFBSSxDQUFDRSxjQUFjLEdBQUc7UUFDdEIsSUFBSSxDQUFDQyxjQUFjLEdBQUc7UUFDdEIsSUFBSSxDQUFDQyxZQUFZLEdBQUc7UUFDcEIsSUFBSSxDQUFDTSxrQkFBa0IsQ0FBQzdELHdCQUF3QjJELFFBQVFHLGdCQUFnQjtRQUV4RSxNQUFNLEVBQUVDLFdBQVcsRUFBRSxHQUFHSjtRQUV4QixNQUFNLElBQUksQ0FBQ3JCLE1BQU0sQ0FBQzBCLFNBQVMsQ0FBQztZQUMzQkQ7WUFDQUUsV0FBV04sUUFBUU0sU0FBUztZQUM1QkMsZ0JBQWdCLENBQUNDLFVBQVksSUFBSSxDQUFDQyxjQUFjLENBQUNEO1lBQ2pERSxZQUFZLElBQUksQ0FBQ0MsYUFBYTtRQUMvQjtRQUVBLE1BQU1MLFlBQVksSUFBSSxDQUFDTSxnQkFBZ0I7UUFDdkMsTUFBTUMsV0FBVyxJQUFJLENBQUNDLGVBQWUsQ0FBQ1YsYUFBYUo7UUFDbkQsS0FBSyxNQUFNZSxXQUFXRixTQUFVO1lBQy9CLE1BQU1HLFlBQVlDLGlCQUFJLENBQUN6QixPQUFPLENBQUN1QixRQUFRRyxrQkFBa0I7WUFDekQsSUFBSSxDQUFDcEMsT0FBTyxDQUFDcUMsR0FBRyxDQUFDSCxXQUFXO2dCQUFFQyxNQUFNRDtnQkFBV0ksT0FBT0wsUUFBUXJDLElBQUk7WUFBQztRQUNwRTtRQUVBLElBQUksQ0FBQ0MsTUFBTSxDQUFDMEMsYUFBYTtRQUN6QixJQUFJLENBQUNDLHdCQUF3QjtRQUU3QixNQUFNaEIsVUFBVWlCLEtBQUssQ0FBQ25CO1FBQ3RCLElBQUksQ0FBQ2pCLGlCQUFpQixHQUFHbUIsVUFBVWtCLG1CQUFtQixDQUFDQyxTQUFTLENBQUMsSUFBSSxDQUFDQyxZQUFZO1FBRWxGLEtBQUssTUFBTUMsU0FBUyxJQUFJLENBQUM3QyxPQUFPLENBQUM4QyxNQUFNLEdBQUk7WUFDMUMsSUFBSSxDQUFDcEQsTUFBTSxDQUFDcUQsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFRixNQUFNVixJQUFJLEVBQUU7UUFDMUM7UUFDQSxNQUFNLElBQUksQ0FBQ2EsV0FBVyxDQUFDO2VBQUksSUFBSSxDQUFDaEQsT0FBTyxDQUFDaUQsSUFBSTtTQUFHO1FBQy9DLElBQUksQ0FBQ0MsSUFBSSxDQUFDO0lBQ1g7SUFFQSxNQUFhQyxVQUFVO1FBQ3RCLElBQUksSUFBSSxDQUFDcEQsUUFBUSxFQUFFO1FBQ25CLElBQUksQ0FBQ0EsUUFBUSxHQUFHO1FBQ2hCLElBQUksQ0FBQ1ksaUJBQWlCLElBQUk7UUFDMUIsSUFBSSxDQUFDTixpQkFBaUIsRUFBRStDO1FBQ3hCLE1BQU0sSUFBSSxDQUFDNUMsVUFBVTtRQUNyQixNQUFNLElBQUksQ0FBQzZDLGNBQWMsQ0FBQztlQUFJLElBQUksQ0FBQ3JELE9BQU8sQ0FBQ2lELElBQUk7U0FBRztRQUNsRCxJQUFJLENBQUNwRCxNQUFNLENBQUNzRCxPQUFPO0lBQ3BCO0lBRUEsTUFBYSxDQUFDRyxPQUFPQyxZQUFZLENBQUMsR0FBRztRQUNwQyxNQUFNLElBQUksQ0FBQ0osT0FBTztJQUNuQjtJQUVBLDRFQUE0RTtJQUU1RSxNQUFjSCxZQUFZUSxVQUE2QixFQUFFO1FBQ3hELE1BQU0vQyxRQUFRZ0QsR0FBRyxDQUFDRCxXQUFXekUsR0FBRyxDQUFDLENBQUNtRCxZQUFjLElBQUksQ0FBQ3dCLFNBQVMsQ0FBQ3hCO0lBQ2hFO0lBRUEsTUFBY3dCLFVBQVV4QixTQUFpQixFQUFFO1FBQzFDLE1BQU15QixRQUFRLElBQUksQ0FBQzNELE9BQU8sQ0FBQzRELEdBQUcsQ0FBQzFCO1FBQy9CLElBQUl5QixTQUFTLE1BQU07UUFDbkIsSUFBSTtZQUNILE1BQU1FLE1BQU8sTUFBTSxJQUFJLENBQUNoRSxNQUFNLENBQUNpRSxXQUFXLENBQUM1QjtZQUczQ3lCLE1BQU1JLE1BQU0sR0FBR0YsS0FBS0c7UUFDckIsRUFBRSxPQUFPQyxPQUFPO1lBQ2ZOLE1BQU1JLE1BQU0sR0FBR3pGO1lBQ2YsSUFBSSxDQUFDb0IsTUFBTSxDQUFDdUUsS0FBSyxDQUNoQiw2RkFDQUE7UUFFRjtJQUNEO0lBRVE3QyxtQkFBbUI4QyxPQUFlLEVBQUU7UUFDM0MsTUFBTUMsTUFBTSxFQUFFLElBQUksQ0FBQ3hELGlCQUFpQjtRQUNwQyxJQUFJLENBQUNLLGNBQWMsR0FBR29ELElBQUFBLGdCQUFRLEVBQUM7WUFDOUIsSUFBSSxJQUFJLENBQUNyRSxRQUFRLElBQUlvRSxRQUFRLElBQUksQ0FBQ3hELGlCQUFpQixFQUFFO1lBQ3JELElBQUksQ0FBQzBELGFBQWE7UUFDbkIsR0FBR0g7SUFDSjtJQUVRRyxnQkFBZ0I7UUFDdkIsSUFBSSxJQUFJLENBQUN0RSxRQUFRLEVBQUU7UUFDbkIsSUFBSSxJQUFJLENBQUNhLGNBQWMsRUFBRTtZQUN4QixJQUFJLENBQUNDLGNBQWMsR0FBRztZQUN0QjtRQUNEO1FBQ0EsSUFBSSxJQUFJLENBQUNDLFlBQVksRUFBRTtRQUN2QixJQUFJLENBQUNBLFlBQVksR0FBRztRQUNwQixJQUFJLENBQUNOLFVBQVUsR0FBRyxJQUFJLENBQUNBLFVBQVUsQ0FBQzhELElBQUksQ0FDckMsSUFBTSxJQUFJLENBQUNDLFNBQVMsSUFDcEIsSUFBTSxJQUFJLENBQUNBLFNBQVM7SUFFdEI7SUFFQSxNQUFjQSxZQUFZO1FBQ3pCLElBQUksQ0FBQ3pELFlBQVksR0FBRztRQUNwQixJQUFJLElBQUksQ0FBQ2YsUUFBUSxFQUFFO1FBQ25CLElBQUksQ0FBQ2EsY0FBYyxHQUFHO1FBQ3RCLElBQUk7WUFDSCxHQUFHO2dCQUNGLElBQUksQ0FBQ0MsY0FBYyxHQUFHO2dCQUN0QixJQUFJLElBQUksQ0FBQ2QsUUFBUSxFQUFFO2dCQUNuQixNQUFNeUUsV0FDTCxJQUFJLENBQUN0RSxtQkFBbUIsQ0FBQ3VFLElBQUksR0FBRyxJQUM3Qjt1QkFBSSxJQUFJLENBQUN2RSxtQkFBbUI7aUJBQUMsR0FDN0I7dUJBQUksSUFBSSxDQUFDRixPQUFPLENBQUNpRCxJQUFJO2lCQUFHO2dCQUM1QixJQUFJLENBQUMvQyxtQkFBbUIsQ0FBQ2lCLEtBQUs7Z0JBQzlCLHdFQUF3RTtnQkFDeEUsNkRBQTZEO2dCQUM3RCxJQUFJLENBQUN1RCwyQkFBMkI7Z0JBQ2hDLE1BQU1DLFlBQVlDLEtBQUtDLEdBQUc7Z0JBQzFCLE1BQU01RixTQUFTLElBQUksQ0FBQzZGLFNBQVMsQ0FBQ047Z0JBQzlCLE1BQU1wRyxXQUFXLElBQUksQ0FBQzJHLFlBQVk7Z0JBQ2xDLElBQUksQ0FBQ3JGLE1BQU0sQ0FBQ3NGLElBQUksQ0FBQzFILHNCQUFzQjJCLFFBQVFiO2dCQUMvQyxNQUFNLElBQUksQ0FBQ2lGLGNBQWMsQ0FBQ21CO2dCQUMxQixNQUFNLElBQUksQ0FBQ3hCLFdBQVcsQ0FBQ3dCO2dCQUN2QixJQUFJLENBQUM5RSxNQUFNLENBQUNzRixJQUFJLENBQUMzSCxzQkFBc0I0QixRQUFRMkYsS0FBS0MsR0FBRyxLQUFLRjtnQkFDNUQsSUFBSSxDQUFDekIsSUFBSSxDQUFDO1lBQ1gsUUFBUyxJQUFJLENBQUNyQyxjQUFjLElBQUksQ0FBQyxJQUFJLENBQUNkLFFBQVEsQ0FBRTtRQUNqRCxTQUFVO1lBQ1QsTUFBTWtGLGdCQUFnQixJQUFJLENBQUNwRSxjQUFjLElBQUksQ0FBQyxJQUFJLENBQUNkLFFBQVE7WUFDM0QsSUFBSSxDQUFDYyxjQUFjLEdBQUc7WUFDdEIsSUFBSSxDQUFDRCxjQUFjLEdBQUc7WUFDdEIsSUFBSXFFLGVBQWUsSUFBSSxDQUFDWixhQUFhO1FBQ3RDO0lBQ0Q7SUFFQSxNQUFjaEIsZUFBZUcsVUFBNkIsRUFBRTtRQUMzRCxNQUFNL0MsUUFBUWdELEdBQUcsQ0FBQ0QsV0FBV3pFLEdBQUcsQ0FBQyxDQUFDbUQsWUFBYyxJQUFJLENBQUNnRCxZQUFZLENBQUNoRDtJQUNuRTtJQUVBLE1BQWNnRCxhQUFhaEQsU0FBa0IsRUFBRTtRQUM5QyxNQUFNaUQsUUFBUWpELGFBQWEsT0FBTztZQUFDQTtTQUFVLEdBQUc7ZUFBSSxJQUFJLENBQUNsQyxPQUFPLENBQUNpRCxJQUFJO1NBQUc7UUFDeEUsS0FBSyxNQUFNbUMsS0FBS0QsTUFBTztZQUN0QixNQUFNeEIsUUFBUSxJQUFJLENBQUMzRCxPQUFPLENBQUM0RCxHQUFHLENBQUN3QjtZQUMvQixJQUFJekIsU0FBUyxNQUFNO1lBQ25CLE1BQU1kLFFBQVFjLE1BQU1JLE1BQU07WUFDMUJKLE1BQU1JLE1BQU0sR0FBR3pGO1lBQ2YsSUFBSTtnQkFDSCxNQUFNdUUsT0FBTyxDQUFDUyxPQUFPQyxZQUFZLENBQUM7WUFDbkMsRUFBRSxPQUFPVSxPQUFPO2dCQUNmLElBQUksQ0FBQ3ZFLE1BQU0sQ0FBQ3VFLEtBQUssQ0FBQyw2QkFBNkJBO1lBQ2hEO1FBQ0Q7SUFDRDtJQUVBLDRFQUE0RTtJQUVwRW5DLG1CQUE4QjtRQUNyQyxNQUFNTixZQUFZLElBQUksQ0FBQzNCLE1BQU0sQ0FBQ3dGLFlBQVk7UUFDMUMsSUFBSTdELGFBQWEsTUFBTTtZQUN0QixNQUFNLElBQUl2RCxNQUFNO1FBQ2pCO1FBQ0EsT0FBT3VEO0lBQ1I7SUFFUVEsZ0JBQWdCVixXQUFtQixFQUFFSixPQUErQixFQUFhO1FBQ3hGLE1BQU1vRSxXQUFXLElBQUksQ0FBQ3pGLE1BQU0sQ0FBQ3dGLFlBQVksSUFBSUUsWUFBWWpFLGdCQUFnQixFQUFFO1FBQzNFLE1BQU1rRSxRQUNMdEUsUUFBUW9FLFFBQVEsSUFBSSxRQUFRcEUsUUFBUW9FLFFBQVEsQ0FBQ2pILE1BQU0sR0FBRyxJQUNuRDZDLFFBQVFvRSxRQUFRLEdBQ2hCcEUsUUFBUWUsT0FBTyxJQUFJLE9BQ2xCO1lBQUNmLFFBQVFlLE9BQU87U0FBQyxHQUNqQjNEO1FBRUwsSUFBSWtILFNBQVMsTUFBTTtZQUNsQixNQUFNQyxRQUFRSCxTQUFTSSxFQUFFLENBQUM7WUFDMUIsSUFBSUQsU0FBUyxNQUFNO2dCQUNsQixNQUFNLElBQUl4SCxNQUFNLENBQUMscUNBQXFDLEVBQUVxRCxhQUFhO1lBQ3RFO1lBQ0EsT0FBTztnQkFBQ21FO2FBQU07UUFDZjtRQUVBLE1BQU0xRCxXQUFzQixFQUFFO1FBQzlCLEtBQUssTUFBTW5DLFFBQVE0RixNQUFPO1lBQ3pCLE1BQU1HLFFBQVFMLFNBQVNNLElBQUksQ0FBQyxDQUFDUixJQUFNQSxFQUFFeEYsSUFBSSxLQUFLQTtZQUM5QyxJQUFJK0YsU0FBUyxNQUFNO2dCQUNsQixNQUFNLElBQUkxSCxNQUFNLENBQUMsU0FBUyxFQUFFMkIsS0FBSyx3QkFBd0IsQ0FBQztZQUMzRDtZQUNBbUMsU0FBUzhELElBQUksQ0FBQ0Y7UUFDZjtRQUNBLE9BQU81RDtJQUNSO0lBRUE7OztFQUdDLEdBQ0QsQUFBUUYsZ0JBQWdCLENBQUNpRSxRQUF5QkM7UUFDakQsTUFBTSxFQUFFQyxHQUFHLEVBQUUsR0FBR0Y7UUFDaEIsTUFBTUcsaUJBQWlCRixVQUFVRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFFOUMsSUFBSUM7UUFDSixJQUFJQztRQUVKLElBQUk7WUFDSCxNQUFNQyxTQUFTLElBQUlDLElBQUlOO1lBQ3ZCSyxPQUFPRSxNQUFNLEdBQUc7WUFDaEJKLFdBQVcxSSxNQUFFLENBQUNDLGFBQWEsQ0FBQzJJLE9BQU9HLFFBQVE7UUFDNUMsRUFBRSxPQUFNO1lBQ1A7UUFDRDtRQUVBLElBQUk7WUFDSEosYUFBYTNJLE1BQUUsQ0FBQ0MsYUFBYSxDQUFDdUk7UUFDL0IsRUFBRSxPQUFNO1lBQ1BHLGFBQWE7UUFDZDtRQUVBLE1BQU1LLFdBQVcsSUFBSSxDQUFDNUcsTUFBTSxDQUFDNkcsYUFBYSxDQUFDUDtRQUMzQyxNQUFNUSxpQkFBaUIsSUFBSSxDQUFDOUcsTUFBTSxDQUFDNkcsYUFBYSxDQUFDTjtRQUVqRCxJQUFJSyxZQUFZRSxnQkFBZ0I7WUFDL0IsSUFBSSxDQUFDQyxlQUFlLENBQUNULFVBQVVDO1FBQ2hDO0lBQ0QsRUFBRTtJQUVGLDRFQUE0RTtJQUVwRXhELGVBQWUsQ0FBQ2lFO1FBQ3ZCLE1BQU0sRUFBRUMsSUFBSSxFQUFFQyxTQUFTLEVBQUU5RSxPQUFPLEVBQUUsR0FBRzRFO1FBQ3JDLE1BQU1HLFdBQVdGLEtBQUtFLFFBQVE7UUFFOUIsSUFBSSxDQUFDdEgsTUFBTSxDQUFDcUQsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFZ0UsVUFBVSxFQUFFLEVBQUVDLFVBQVU7UUFFbEQsSUFBSUQsY0FBY3RKLE1BQUUsQ0FBQ3dKLFdBQVcsQ0FBQ0MsTUFBTSxFQUFFO1lBQ3hDLElBQUksQ0FBQ3JILE1BQU0sQ0FBQ3NILG1CQUFtQixDQUFDSDtZQUNoQyxJQUFJLENBQUMxRyxXQUFXLENBQUMrQixHQUFHLENBQUMyRSxVQUFVO1lBQy9CO1FBQ0Q7UUFFQSxJQUFJRCxjQUFjdEosTUFBRSxDQUFDd0osV0FBVyxDQUFDRyxHQUFHLEVBQUU7WUFDckMsSUFBSW5GLFFBQVFvRixZQUFZLENBQUNQLE9BQU87Z0JBQy9CLElBQUksQ0FBQ2pILE1BQU0sQ0FBQ3lILGFBQWEsQ0FBQ04sVUFBVS9FO2dCQUNwQyxJQUFJLENBQUMzQixXQUFXLENBQUMrQixHQUFHLENBQUMyRSxVQUFVO2dCQUMvQixJQUFJLENBQUNPLGdCQUFnQixDQUFDUDtZQUN2QjtZQUNBO1FBQ0Q7UUFFQSxTQUFTO1FBQ1QsSUFBSSxDQUFDL0UsUUFBUW9GLFlBQVksQ0FBQ1AsT0FBTztRQUNqQyxJQUFJLENBQUNqSCxNQUFNLENBQUNzSCxtQkFBbUIsQ0FBQ0g7UUFDaEMsSUFBSSxDQUFDTyxnQkFBZ0IsQ0FBQ1A7SUFDdkIsRUFBRTtJQUVNTyxpQkFBaUJQLFFBQWdCLEVBQVc7UUFDbkQsTUFBTVEsT0FBTyxJQUFJLENBQUNDLGtCQUFrQixDQUFDVDtRQUNyQyxNQUFNVSxVQUFVO2VBQUksSUFBSXZILElBQUk7bUJBQUlxSDtnQkFBTVI7YUFBUztTQUFFO1FBQ2pELE1BQU1XLGtCQUFrQjtlQUFJLElBQUksQ0FBQzNILE9BQU8sQ0FBQ2lELElBQUk7U0FBRyxDQUFDMkUsTUFBTSxDQUFDLENBQUMxRixZQUN4RHdGLFFBQVFHLFFBQVEsQ0FBQzNGO1FBR2xCLElBQUl5RixnQkFBZ0J0SixNQUFNLEtBQUssR0FBRztZQUNqQyxJQUFJLENBQUNxQixNQUFNLENBQUNxRCxLQUFLLENBQUMsQ0FBQyxVQUFVLEVBQUVpRSxTQUFTLHdDQUF3QyxDQUFDO1lBQ2pGLE9BQU87UUFDUjtRQUVBLElBQUksQ0FBQ3RILE1BQU0sQ0FBQ3FELEtBQUssQ0FDaEIsQ0FBQyxVQUFVLEVBQUVpRSxTQUFTLFNBQVMsRUFBRVUsUUFBUXJKLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQztRQUVoRixJQUFJLENBQUN5SixzQkFBc0IsSUFBSUo7UUFDL0IsS0FBSyxNQUFNM0QsVUFBVTJELFFBQVM7WUFDN0IsSUFBSSxDQUFDM0csaUJBQWlCLENBQUNxRyxHQUFHLENBQUNyRDtRQUM1QjtRQUNBLEtBQUssTUFBTTdCLGFBQWF5RixnQkFBaUI7WUFDeEMsSUFBSSxDQUFDekgsbUJBQW1CLENBQUNrSCxHQUFHLENBQUNsRjtRQUM5QjtRQUNBLElBQUksQ0FBQzlCLGVBQWUsQ0FBQ2dILEdBQUcsQ0FBQ0o7UUFDekIsSUFBSSxDQUFDaEcsY0FBYztRQUNuQixPQUFPO0lBQ1I7SUFFQSw0RUFBNEU7SUFFcEV5RyxtQkFBbUJNLFFBQWdCLEVBQUVDLGdCQUEwQixFQUFFLEVBQVk7UUFDcEYsSUFBSSxJQUFJLENBQUNDLE1BQU0sQ0FBQ0YsV0FBVyxPQUFPLEVBQUU7UUFFcEMsTUFBTUcsYUFBYSxJQUFJLENBQUMzSCxZQUFZLENBQUNxRCxHQUFHLENBQUNtRSxhQUFhLEVBQUU7UUFDeEQsSUFBSUMsY0FBY0gsUUFBUSxDQUFDRSxXQUFXO1lBQ3JDLElBQUksQ0FBQ3JJLE1BQU0sQ0FBQ3VFLEtBQUssQ0FBQyxDQUFDLDZCQUE2QixFQUFFOEQsVUFBVTtZQUM1RCxPQUFPLEVBQUU7UUFDVjtRQUVBLElBQUlJLFVBQW9CLEVBQUU7UUFDMUIsS0FBSyxNQUFNQyxPQUFPRixXQUFZO1lBQzdCLElBQUksQ0FBQyxJQUFJLENBQUNySSxNQUFNLENBQUM2RyxhQUFhLENBQUMwQixNQUFNO1lBQ3JDLE1BQU1DLE9BQU8sSUFBSSxDQUFDWixrQkFBa0IsQ0FBQ1csS0FBSztnQkFBQ0w7bUJBQWFDO2FBQWM7WUFDdEVHLFVBQVU7bUJBQUlBO21CQUFZRTthQUFLO1FBQ2hDO1FBRUEsT0FBTztlQUFJLElBQUlsSSxJQUFJO21CQUFJK0g7bUJBQWVDO2FBQVE7U0FBRTtJQUNqRDtJQUVRdkIsZ0JBQWdCVCxRQUFnQixFQUFFQyxVQUFrQixFQUFFO1FBQzdELElBQUksQ0FBQ0EsWUFBWTtRQUNqQixNQUFNb0IsT0FBTyxJQUFJLENBQUNqSCxZQUFZLENBQUNxRCxHQUFHLENBQUN1QyxhQUFhLEVBQUU7UUFDbEQsTUFBTW1DLGNBQWMsSUFBSW5JLElBQUk7ZUFBSXFIO1lBQU1wQjtTQUFXO1FBQ2pELElBQUksQ0FBQzdGLFlBQVksQ0FBQzhCLEdBQUcsQ0FBQzhELFVBQVU7ZUFBSW1DO1NBQVk7SUFDakQ7SUFFQSw0RUFBNEU7SUFFcEUzRyxlQUFlNEcsU0FBaUIsRUFBRTtRQUN6QyxNQUFNcEMsV0FBVzFJLE1BQUUsQ0FBQ0MsYUFBYSxDQUFDNks7UUFDbEMsTUFBTUMsU0FBUyxJQUFJLENBQUNsSSxXQUFXLENBQUNzRCxHQUFHLENBQUN1QztRQUNwQyxNQUFNc0MsWUFBWUQsVUFBVSxJQUFJLENBQUNFLGFBQWEsQ0FBQ0g7UUFDL0MsSUFBSSxDQUFDakksV0FBVyxDQUFDK0IsR0FBRyxDQUFDOEQsVUFBVXNDO1FBQy9CLE9BQU9BO0lBQ1I7SUFFUUMsY0FBY0gsU0FBaUIsRUFBRTtRQUN4QyxNQUFNSSxlQUFlLElBQUlyQyxJQUFJaUM7UUFDN0JJLGFBQWFDLFlBQVksQ0FBQ3ZHLEdBQUcsQ0FBQzFFLG1CQUFtQk8sT0FBTyxFQUFFc0I7UUFDMUQsT0FBT21KLGFBQWFuQyxRQUFRO0lBQzdCO0lBRVFzQix1QkFBdUIsR0FBR0osT0FBaUIsRUFBRTtRQUNwRCxLQUFLLE1BQU0zRCxVQUFVMkQsUUFBUztZQUM3QixJQUFJLENBQUNwSCxXQUFXLENBQUMrQixHQUFHLENBQUMwQixRQUFRO1lBQzdCLElBQUksQ0FBQ2xFLE1BQU0sQ0FBQ3NILG1CQUFtQixDQUFDcEQ7UUFDakM7SUFDRDtJQUVRVyw4QkFBOEI7UUFDckMsTUFBTWdELFVBQVU7ZUFBSSxJQUFJLENBQUMzRyxpQkFBaUI7U0FBQztRQUMzQyxJQUFJLENBQUNBLGlCQUFpQixDQUFDSSxLQUFLO1FBQzVCLElBQUksQ0FBQzBILHNCQUFzQixJQUFJbkI7SUFDaEM7SUFFQSx1RkFBdUYsR0FDdkYsQUFBUW1CLHVCQUF1QixHQUFHbkIsT0FBaUIsRUFBRTtRQUNwRCxLQUFLLE1BQU0zRCxVQUFVMkQsUUFBUztZQUM3QixLQUFLLE1BQU0sQ0FBQ29CLEtBQUtDLFFBQVEsSUFBSSxJQUFJLENBQUN4SSxZQUFZLENBQUU7Z0JBQy9DLE1BQU15SSxXQUFXRCxRQUFRbkIsTUFBTSxDQUFDLENBQUN4QyxJQUFNQSxNQUFNckI7Z0JBQzdDLElBQUlpRixTQUFTM0ssTUFBTSxLQUFLLEdBQUc7b0JBQzFCLElBQUksQ0FBQ2tDLFlBQVksQ0FBQzBJLE1BQU0sQ0FBQ0g7Z0JBQzFCLE9BQU87b0JBQ04sSUFBSSxDQUFDdkksWUFBWSxDQUFDOEIsR0FBRyxDQUFDeUcsS0FBS0U7Z0JBQzVCO1lBQ0Q7UUFDRDtJQUNEO0lBRVF4RywyQkFBMkI7UUFDbEMsS0FBSyxNQUFNMkQsWUFBWSxJQUFJLENBQUN0RyxNQUFNLENBQUNxSixlQUFlLEdBQUk7WUFDckQsSUFBSSxDQUFDNUksV0FBVyxDQUFDK0IsR0FBRyxDQUFDOEQsVUFBVTtRQUNoQztJQUNEO0lBRVE4QixPQUFPOUIsUUFBZ0IsRUFBRTtRQUNoQyxPQUFPM0ksb0JBQW9CMkUsaUJBQUksQ0FBQ3pCLE9BQU8sQ0FBQ3lGO0lBQ3pDO0lBRVFyQixVQUFVdEIsVUFBNkIsRUFBWTtRQUMxRCxPQUFPQSxXQUFXekUsR0FBRyxDQUNwQixDQUFDbUQsWUFBYyxJQUFJLENBQUNsQyxPQUFPLENBQUM0RCxHQUFHLENBQUMxQixZQUFZSSxTQUFTSCxpQkFBSSxDQUFDZ0gsUUFBUSxDQUFDakg7SUFFckU7SUFFUTZDLGVBQXlCO1FBQ2hDLE1BQU0zRyxXQUFXO2VBQUksSUFBSSxDQUFDZ0MsZUFBZTtTQUFDLENBQUNyQixHQUFHLENBQUMsQ0FBQ2lJLFdBQWEsSUFBSSxDQUFDb0MsYUFBYSxDQUFDcEM7UUFDaEYsSUFBSSxDQUFDNUcsZUFBZSxDQUFDZSxLQUFLO1FBQzFCLE9BQU8vQztJQUNSO0lBRVFnTCxjQUFjcEMsUUFBZ0IsRUFBVTtRQUMvQyxNQUFNcUMsT0FBTyxJQUFJLENBQUN4SixNQUFNLENBQUN3RixZQUFZLElBQUlpRTtRQUN6QyxJQUFJRCxRQUFRLE1BQU07WUFDakIsTUFBTUUsTUFBTXBILGlCQUFJLENBQUNxSCxRQUFRLENBQUNySCxpQkFBSSxDQUFDekIsT0FBTyxDQUFDMkksT0FBT3JDO1lBQzlDLElBQUl1QyxRQUFRLE1BQU0sQ0FBQ0EsSUFBSUUsVUFBVSxDQUFDLFNBQVMsQ0FBQ3RILGlCQUFJLENBQUN1SCxVQUFVLENBQUNILE1BQU07Z0JBQ2pFLE9BQU9BLElBQUlJLFVBQVUsQ0FBQyxNQUFNO1lBQzdCO1FBQ0Q7UUFDQSxPQUFPeEgsaUJBQUksQ0FBQ2dILFFBQVEsQ0FBQ25DO0lBQ3RCO0FBQ0QifQ==
|