@dollhousemcp/mcp-server 2.0.26 → 2.0.27-rc.2
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/CHANGELOG.md +4 -0
- package/dist/elements/ensembles/EnsembleManager.d.ts +18 -0
- package/dist/elements/ensembles/EnsembleManager.d.ts.map +1 -1
- package/dist/elements/ensembles/EnsembleManager.js +37 -5
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.d.ts.map +1 -1
- package/dist/generated/version.js +3 -3
- package/dist/logging/LogHooks.d.ts.map +1 -1
- package/dist/logging/LogHooks.js +33 -1
- package/dist/web/contentPipeline.d.ts +1 -0
- package/dist/web/contentPipeline.d.ts.map +1 -1
- package/dist/web/contentPipeline.js +48 -4
- package/dist/web/public/app.js +204 -83
- package/dist/web/public/index.html +18 -6
- package/dist/web/public/logs.css +157 -1
- package/dist/web/public/logs.js +56 -8
- package/dist/web/public/sessions.css +2 -1
- package/dist/web/public/styles.css +272 -20
- package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
- package/dist/web/routes/permissionRoutes.js +18 -4
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +13 -3
- package/package.json +1 -1
- package/server.json +2 -2
package/dist/logging/LogHooks.js
CHANGED
|
@@ -12,8 +12,10 @@
|
|
|
12
12
|
* cleanups.forEach(fn => fn());
|
|
13
13
|
*/
|
|
14
14
|
import { SecurityMonitor } from '../security/securityMonitor.js';
|
|
15
|
+
import { UnicodeValidator } from '../security/validators/unicodeValidator.js';
|
|
15
16
|
import { DefaultElementProvider } from '../portfolio/DefaultElementProvider.js';
|
|
16
17
|
import { LRUCache } from '../cache/LRUCache.js';
|
|
18
|
+
import { EventDeduplicator } from '../utils/EventDeduplicator.js';
|
|
17
19
|
// ---------------------------------------------------------------------------
|
|
18
20
|
// Severity → LogLevel helper (shared by SecurityMonitor, SecurityTelemetry,
|
|
19
21
|
// SecurityAuditor)
|
|
@@ -28,6 +30,16 @@ const SEVERITY_TO_LEVEL = {
|
|
|
28
30
|
medium: 'warn',
|
|
29
31
|
low: 'info',
|
|
30
32
|
};
|
|
33
|
+
const CONTENT_INJECTION_VISIBILITY_WINDOW_MS = 10 * 60_000;
|
|
34
|
+
const CONTENT_INJECTION_VISIBILITY_MAX_KEYS = 500;
|
|
35
|
+
function extractContentInjectionKey(value) {
|
|
36
|
+
if (typeof value !== 'string') {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
const normalizedValue = UnicodeValidator.normalize(value).normalizedContent;
|
|
40
|
+
const normalized = normalizedValue.replace(/^Detected pattern:\s*/i, '').trim();
|
|
41
|
+
return normalized === '' ? null : `CONTENT_INJECTION\0${normalized}`;
|
|
42
|
+
}
|
|
31
43
|
// ---------------------------------------------------------------------------
|
|
32
44
|
// Exported factory for TriggerMetricsTracker (created outside DI container)
|
|
33
45
|
// ---------------------------------------------------------------------------
|
|
@@ -76,6 +88,7 @@ export function getSecurityAuditorLogListener(logManager, contextTracker) {
|
|
|
76
88
|
*/
|
|
77
89
|
export function wireLogHooks(logManager, container) {
|
|
78
90
|
const cleanups = [];
|
|
91
|
+
const contentInjectionVisibilityDedup = new EventDeduplicator(CONTENT_INJECTION_VISIBILITY_WINDOW_MS, CONTENT_INJECTION_VISIBILITY_MAX_KEYS);
|
|
79
92
|
// Resolve ContextTracker for correlationId injection
|
|
80
93
|
let contextTracker = null;
|
|
81
94
|
try {
|
|
@@ -86,6 +99,13 @@ export function wireLogHooks(logManager, container) {
|
|
|
86
99
|
try {
|
|
87
100
|
const mcpLogger = container.resolve('MCPLogger');
|
|
88
101
|
const unsub = mcpLogger.addLogListener((logEntry) => {
|
|
102
|
+
const contentInjectionKey = logEntry.message === '[CRITICAL SECURITY ALERT]' &&
|
|
103
|
+
logEntry.data?.type === 'CONTENT_INJECTION_ATTEMPT'
|
|
104
|
+
? extractContentInjectionKey(logEntry.data?.details)
|
|
105
|
+
: null;
|
|
106
|
+
if (contentInjectionKey !== null && contentInjectionVisibilityDedup.shouldSuppress(contentInjectionKey)) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
89
109
|
const entry = {
|
|
90
110
|
id: logManager.generateId(),
|
|
91
111
|
timestamp: logEntry.timestamp.toISOString(),
|
|
@@ -104,6 +124,12 @@ export function wireLogHooks(logManager, container) {
|
|
|
104
124
|
// --- SecurityMonitor (security, static) ---------------------------------
|
|
105
125
|
{
|
|
106
126
|
const unsub = SecurityMonitor.addLogListener((logEntry) => {
|
|
127
|
+
const contentInjectionKey = logEntry.type === 'CONTENT_INJECTION_ATTEMPT'
|
|
128
|
+
? extractContentInjectionKey(logEntry.details)
|
|
129
|
+
: null;
|
|
130
|
+
if (contentInjectionKey !== null && contentInjectionVisibilityDedup.shouldSuppress(contentInjectionKey)) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
107
133
|
const entry = {
|
|
108
134
|
id: logManager.generateId(),
|
|
109
135
|
timestamp: logEntry.timestamp,
|
|
@@ -127,6 +153,12 @@ export function wireLogHooks(logManager, container) {
|
|
|
127
153
|
try {
|
|
128
154
|
const secTelemetry = container.resolve('SecurityTelemetry');
|
|
129
155
|
const unsub = secTelemetry.addLogListener((telEntry) => {
|
|
156
|
+
const contentInjectionKey = telEntry.attackType === 'CONTENT_INJECTION'
|
|
157
|
+
? extractContentInjectionKey(telEntry.pattern)
|
|
158
|
+
: null;
|
|
159
|
+
if (contentInjectionKey !== null && contentInjectionVisibilityDedup.shouldSuppress(contentInjectionKey)) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
130
162
|
const entry = {
|
|
131
163
|
id: logManager.generateId(),
|
|
132
164
|
timestamp: telEntry.timestamp,
|
|
@@ -300,4 +332,4 @@ export function wireLogHooks(logManager, container) {
|
|
|
300
332
|
catch { /* StateChangeNotifier not registered */ }
|
|
301
333
|
return cleanups;
|
|
302
334
|
}
|
|
303
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nSG9va3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG9nZ2luZy9Mb2dIb29rcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7QUFJSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDaEYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWhELDhFQUE4RTtBQUM5RSw0RUFBNEU7QUFDNUUsbUJBQW1CO0FBQ25CLDhFQUE4RTtBQUU5RSxNQUFNLGlCQUFpQixHQUE2QjtJQUNsRCxRQUFRLEVBQUUsT0FBTztJQUNqQixJQUFJLEVBQUUsT0FBTztJQUNiLE1BQU0sRUFBRSxNQUFNO0lBQ2QsR0FBRyxFQUFFLE1BQU07SUFDWCxRQUFRLEVBQUUsT0FBTztJQUNqQixJQUFJLEVBQUUsT0FBTztJQUNiLE1BQU0sRUFBRSxNQUFNO0lBQ2QsR0FBRyxFQUFFLE1BQU07Q0FDWixDQUFDO0FBUUYsOEVBQThFO0FBQzlFLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFFOUUsTUFBTSxVQUFVLDRCQUE0QixDQUMxQyxVQUFzQixFQUN0QixjQUFzQztJQUV0QyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUM5QixNQUFNLEtBQUssR0FBb0I7WUFDN0IsRUFBRSxFQUFFLFVBQVUsQ0FBQyxVQUFVLEVBQUU7WUFDM0IsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQ25DLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLEtBQUs7WUFDTCxNQUFNLEVBQUUsdUJBQXVCO1lBQy9CLE9BQU87WUFDUCxJQUFJO1lBQ0osYUFBYSxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRTtTQUNsRCxDQUFDO1FBQ0YsVUFBVSxDQUFDLEdBQUcs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QyxJQUFJLEVBQUUsRUFBRSxhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRTtnQkFDdEUsYUFBYSxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRTthQUNsRCxDQUFDO1lBQ0YsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUM7UUFDRixRQUFRLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUFDLE1BQU0sQ0FBQyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7SUFFcEQsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGhhc2UgNDogSW50ZWdyYXRpb24gSG9va3MgZm9yIFVuaWZpZWQgTG9nZ2luZyBTeXN0ZW0uXG4gKlxuICogTWFwcyBuYXRpdmUgZXZlbnRzIGZyb20gMTAgbW9uaXRvcmluZy9sb2dnaW5nIHN5c3RlbXMgaW50byBVbmlmaWVkTG9nRW50cnlcbiAqIG9iamVjdHMgYW5kIHJvdXRlcyB0aGVtIHRocm91Z2ggTG9nTWFuYWdlci4gIEVhY2ggc291cmNlIHN5c3RlbSBleHBvc2VzIGFcbiAqIGxpZ2h0d2VpZ2h0IGBhZGRMb2dMaXN0ZW5lcmAgY2FsbGJhY2s7IHRoZSB0cmFuc2xhdGlvbiBsb2dpYyBsaXZlcyBoZXJlIHNvXG4gKiBzb3VyY2UgZmlsZXMgc3RheSBtaW5pbWFsIGFuZCBuZXZlciBpbXBvcnQgVW5pZmllZExvZ0VudHJ5LlxuICpcbiAqIFVzYWdlOlxuICogICBjb25zdCBjbGVhbnVwcyA9IHdpcmVMb2dIb29rcyhsb2dNYW5hZ2VyLCBjb250YWluZXIpO1xuICogICAvLyBsYXRlciDigKZcbiAqICAgY2xlYW51cHMuZm9yRWFjaChmbiA9PiBmbigpKTtcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExvZ01hbmFnZXIgfSBmcm9tICcuL0xvZ01hbmFnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgVW5pZmllZExvZ0VudHJ5IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgRGVmYXVsdEVsZW1lbnRQcm92aWRlciB9IGZyb20gJy4uL3BvcnRmb2xpby9EZWZhdWx0RWxlbWVudFByb3ZpZGVyLmpzJztcbmltcG9ydCB7IExSVUNhY2hlIH0gZnJvbSAnLi4vY2FjaGUvTFJVQ2FjaGUuanMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNldmVyaXR5IOKGkiBMb2dMZXZlbCBoZWxwZXIgKHNoYXJlZCBieSBTZWN1cml0eU1vbml0b3IsIFNlY3VyaXR5VGVsZW1ldHJ5LFxuLy8gU2VjdXJpdHlBdWRpdG9yKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFNFVkVSSVRZX1RPX0xFVkVMOiBSZWNvcmQ8c3RyaW5nLCBMb2dMZXZlbD4gPSB7XG4gIENSSVRJQ0FMOiAnZXJyb3InLFxuICBISUdIOiAnZXJyb3InLFxuICBNRURJVU06ICd3YXJuJyxcbiAgTE9XOiAnaW5mbycsXG4gIGNyaXRpY2FsOiAnZXJyb3InLFxuICBoaWdoOiAnZXJyb3InLFxuICBtZWRpdW06ICd3YXJuJyxcbiAgbG93OiAnaW5mbycsXG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvcnJlbGF0aW9uSWQgcHJvdmlkZXIgaW50ZXJmYWNlIChzdWJzZXQgb2YgQ29udGV4dFRyYWNrZXIpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudHlwZSBDb3JyZWxhdGlvbklkUHJvdmlkZXIgPSB7IGdldENvcnJlbGF0aW9uSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIH07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRXhwb3J0ZWQgZmFjdG9yeSBmb3IgVHJpZ2dlck1ldHJpY3NUcmFja2VyIChjcmVhdGVkIG91dHNpZGUgREkgY29udGFpbmVyKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmlnZ2VyTWV0cmljc0xvZ0xpc3RlbmVyKFxuICBsb2dNYW5hZ2VyOiBMb2dNYW5hZ2VyLFxuICBjb250ZXh0VHJhY2tlcj86IENvcnJlbGF0aW9uSWRQcm92aWRlcixcbik6IChsZXZlbDogJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkIHtcbiAgcmV0dXJuIChsZXZlbCwgbWVzc2FnZSwgZGF0YSkgPT4ge1xuICAgIGNvbnN0IGVudHJ5OiBVbmlmaWVkTG9nRW50cnkgPSB7XG4gICAgICBpZDogbG9nTWFuYWdlci5nZW5lcmF0ZUlkKCksXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGNhdGVnb3J5OiAndGVsZW1ldHJ5JyxcbiAgICAgIGxldmVsLFxuICAgICAgc291cmNlOiAnVHJpZ2dlck1ldHJpY3NUcmFja2VyJyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBkYXRhLFxuICAgICAgY29ycmVsYXRpb25JZDogY29udGV4dFRyYWNrZXI/LmdldENvcnJlbGF0aW9uSWQoKSxcbiAgICB9O1xuICAgIGxvZ01hbmFnZXIubG9nKGVudHJ5KTtcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeHBvcnRlZCBmYWN0b3J5IGZvciBTZWN1cml0eUF1ZGl0b3IgKGNyZWF0ZWQgb3V0c2lkZSBESSBjb250YWluZXIpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlY3VyaXR5QXVkaXRvckxvZ0xpc3RlbmVyKFxuICBsb2dNYW5hZ2VyOiBMb2dNYW5hZ2VyLFxuICBjb250ZXh0VHJhY2tlcj86IENvcnJlbGF0aW9uSWRQcm92aWRlcixcbik6IChsZXZlbDogJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkIHtcbiAgcmV0dXJuIChsZXZlbCwgbWVzc2FnZSwgZGF0YSkgPT4ge1xuICAgIGNvbnN0IGVudHJ5OiBVbmlmaWVkTG9nRW50cnkgPSB7XG4gICAgICBpZDogbG9nTWFuYWdlci5nZW5lcmF0ZUlkKCksXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGNhdGVnb3J5OiAnc2VjdXJpdHknLFxuICAgICAgbGV2ZWwsXG4gICAgICBzb3VyY2U6ICdTZWN1cml0eUF1ZGl0b3InLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIGRhdGEsXG4gICAgICBjb3JyZWxhdGlvbklkOiBjb250ZXh0VHJhY2tlcj8uZ2V0Q29ycmVsYXRpb25JZCgpLFxuICAgIH07XG4gICAgbG9nTWFuYWdlci5sb2coZW50cnkpO1xuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1haW4gd2lyaW5nIGZ1bmN0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBXaXJlIGFsbCBtb25pdG9yaW5nIHN5c3RlbXMgaW50byB0aGUgdW5pZmllZCBsb2dnaW5nIHBpcGVsaW5lLlxuICpcbiAqIEBwYXJhbSBsb2dNYW5hZ2VyICBUaGUgTG9nTWFuYWdlciBzaW5nbGV0b24gZnJvbSB0aGUgREkgY29udGFpbmVyLlxuICogQHBhcmFtIGNvbnRhaW5lciAgIFRoZSBESSBjb250YWluZXIgKHVzZWQgdG8gcmVzb2x2ZSBzb3VyY2Ugc2VydmljZXMpLlxuICogQHJldHVybnMgQXJyYXkgb2YgdW5zdWJzY3JpYmUgZnVuY3Rpb25zIOKAlCBjYWxsIHRoZW0gZHVyaW5nIHNodXRkb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2lyZUxvZ0hvb2tzKFxuICBsb2dNYW5hZ2VyOiBMb2dNYW5hZ2VyLFxuICBjb250YWluZXI6IHsgcmVzb2x2ZTxUPihuYW1lOiBzdHJpbmcpOiBUIH0sXG4pOiAoKCkgPT4gdm9pZClbXSB7XG4gIGNvbnN0IGNsZWFudXBzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gIC8vIFJlc29sdmUgQ29udGV4dFRyYWNrZXIgZm9yIGNvcnJlbGF0aW9uSWQgaW5qZWN0aW9uXG4gIGxldCBjb250ZXh0VHJhY2tlcjogQ29ycmVsYXRpb25JZFByb3ZpZGVyIHwgbnVsbCA9IG51bGw7XG4gIHRyeSB7XG4gICAgY29udGV4dFRyYWNrZXIgPSBjb250YWluZXIucmVzb2x2ZTxDb3JyZWxhdGlvbklkUHJvdmlkZXI+KCdDb250ZXh0VHJhY2tlcicpO1xuICB9IGNhdGNoIHsgLyogQ29udGV4dFRyYWNrZXIgbm90IHJlZ2lzdGVyZWQgKi8gfVxuXG4gIC8vIC0tLSBNQ1BMb2dnZXIgKGFwcGxpY2F0aW9uKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIHRyeSB7XG4gICAgY29uc3QgbWNwTG9nZ2VyID0gY29udGFpbmVyLnJlc29sdmU8e1xuICAgICAgYWRkTG9nTGlzdGVuZXIoZm46IChlbnRyeTogeyB0aW1lc3RhbXA6IERhdGU7IGxldmVsOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZzsgZGF0YT86IGFueSB9KSA9PiB2b2lkKTogKCkgPT4gdm9pZDtcbiAgICB9PignTUNQTG9nZ2VyJyk7XG4gICAgY29uc3QgdW5zdWIgPSBtY3BMb2dnZXIuYWRkTG9nTGlzdGVuZXIoKGxvZ0VudHJ5KSA9PiB7XG4gICAgICBjb25zdCBlbnRyeTogVW5pZmllZExvZ0VudHJ5ID0ge1xuICAgICAgICBpZDogbG9nTWFuYWdlci5nZW5lcmF0ZUlkKCksXG4gICAgICAgIHRpbWVzdGFtcDogbG9nRW50cnkudGltZXN0YW1wLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGNhdGVnb3J5OiAnYXBwbGljYXRpb24nLFxuICAgICAgICBsZXZlbDogbG9nRW50cnkubGV2ZWwgYXMgTG9nTGV2ZWwsXG4gICAgICAgIHNvdXJjZTogJ01DUExvZ2dlcicsXG4gICAgICAgIG1lc3NhZ2U6IGxvZ0VudHJ5Lm1lc3NhZ2UsXG4gICAgICAgIGRhdGE6IGxvZ0VudHJ5LmRhdGEgIT0gbnVsbCA/IGxvZ0VudHJ5LmRhdGEgOiB1bmRlZmluZWQsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IGNvbnRleHRUcmFja2VyPy5nZXRDb3JyZWxhdGlvbklkKCksXG4gICAgICB9O1xuICAgICAgbG9nTWFuYWdlci5sb2coZW50cnkpO1xuICAgIH0pO1xuICAgIGNsZWFudXBzLnB1c2godW5zdWIpO1xuICB9IGNhdGNoIHsgLyogTUNQTG9nZ2VyIG5vdCByZWdpc3RlcmVkICovIH1cblxuICAvLyAtLS0gU2VjdXJpdHlNb25pdG9yIChzZWN1cml0eSwgc3RhdGljKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAge1xuICAgIGNvbnN0IHVuc3ViID0gU2VjdXJpdHlNb25pdG9yLmFkZExvZ0xpc3RlbmVyKChsb2dFbnRyeSkgPT4ge1xuICAgICAgY29uc3QgZW50cnk6IFVuaWZpZWRMb2dFbnRyeSA9IHtcbiAgICAgICAgaWQ6IGxvZ01hbmFnZXIuZ2VuZXJhdGVJZCgpLFxuICAgICAgICB0aW1lc3RhbXA6IGxvZ0VudHJ5LnRpbWVzdGFtcCxcbiAgICAgICAgY2F0ZWdvcnk6ICdzZWN1cml0eScsXG4gICAgICAgIGxldmVsOiBTRVZFUklUWV9UT19MRVZFTFtsb2dFbnRyeS5zZXZlcml0eV0gPz8gJ2luZm8nLFxuICAgICAgICBzb3VyY2U6ICdTZWN1cml0eU1vbml0b3InLFxuICAgICAgICBtZXNzYWdlOiBgWyR7bG9nRW50cnkudHlwZX1dICR7bG9nRW50cnkuZGV0YWlsc31gLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgLi4ubG9nRW50cnkuYWRkaXRpb25hbERhdGEsXG4gICAgICAgICAgZXZlbnRUeXBlOiBsb2dFbnRyeS50eXBlLFxuICAgICAgICAgIHNldmVyaXR5OiBsb2dFbnRyeS5zZXZlcml0eSxcbiAgICAgICAgICBzb3VyY2VDb21wb25lbnQ6IGxvZ0VudHJ5LnNvdXJjZSxcbiAgICAgICAgfSxcbiAgICAgICAgY29ycmVsYXRpb25JZDogY29udGV4dFRyYWNrZXI/LmdldENvcnJlbGF0aW9uSWQoKSxcbiAgICAgIH07XG4gICAgICBsb2dNYW5hZ2VyLmxvZyhlbnRyeSk7XG4gICAgfSk7XG4gICAgY2xlYW51cHMucHVzaCh1bnN1Yik7XG4gIH1cblxuICAvLyAtLS0gU2VjdXJpdHlUZWxlbWV0cnkgKHNlY3VyaXR5KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgdHJ5IHtcbiAgICBjb25zdCBzZWNUZWxlbWV0cnkgPSBjb250YWluZXIucmVzb2x2ZTx7XG4gICAgICBhZGRMb2dMaXN0ZW5lcihmbjogKGVudHJ5OiB7XG4gICAgICAgIHRpbWVzdGFtcDogc3RyaW5nOyBhdHRhY2tUeXBlOiBzdHJpbmc7IHBhdHRlcm46IHN0cmluZztcbiAgICAgICAgc2V2ZXJpdHk6IHN0cmluZzsgc291cmNlOiBzdHJpbmc7IG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIH0pID0+IHZvaWQpOiAoKSA9PiB2b2lkO1xuICAgIH0+KCdTZWN1cml0eVRlbGVtZXRyeScpO1xuICAgIGNvbnN0IHVuc3ViID0gc2VjVGVsZW1ldHJ5LmFkZExvZ0xpc3RlbmVyKCh0ZWxFbnRyeSkgPT4ge1xuICAgICAgY29uc3QgZW50cnk6IFVuaWZpZWRMb2dFbnRyeSA9IHtcbiAgICAgICAgaWQ6IGxvZ01hbmFnZXIuZ2VuZXJhdGVJZCgpLFxuICAgICAgICB0aW1lc3RhbXA6IHRlbEVudHJ5LnRpbWVzdGFtcCxcbiAgICAgICAgY2F0ZWdvcnk6ICdzZWN1cml0eScsXG4gICAgICAgIGxldmVsOiBTRVZFUklUWV9UT19MRVZFTFt0ZWxFbnRyeS5zZXZlcml0eV0gPz8gJ2luZm8nLFxuICAgICAgICBzb3VyY2U6ICdTZWN1cml0eVRlbGVtZXRyeScsXG4gICAgICAgIG1lc3NhZ2U6IGBCbG9ja2VkICR7dGVsRW50cnkuYXR0YWNrVHlwZX06ICR7dGVsRW50cnkucGF0dGVybn1gLFxuICAgICAgICBkYXRhOiB0ZWxFbnRyeS5tZXRhZGF0YSxcbiAgICAgICAgY29ycmVsYXRpb25JZDogY29udGV4dFRyYWNrZXI/LmdldENvcnJlbGF0aW9uSWQoKSxcbiAgICAgIH07XG4gICAgICBsb2dNYW5hZ2VyLmxvZyhlbnRyeSk7XG4gICAgfSk7XG4gICAgY2xlYW51cHMucHVzaCh1bnN1Yik7XG4gIH0gY2F0Y2ggeyAvKiBTZWN1cml0eVRlbGVtZXRyeSBub3QgcmVnaXN0ZXJlZCAqLyB9XG5cbiAgLy8gLS0tIFBlcmZvcm1hbmNlTW9uaXRvciAocGVyZm9ybWFuY2UpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIHRyeSB7XG4gICAgY29uc3QgcGVyZk1vbml0b3IgPSBjb250YWluZXIucmVzb2x2ZTx7XG4gICAgICBhZGRMb2dMaXN0ZW5lcihmbjogKGxldmVsOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkKTogKCkgPT4gdm9pZDtcbiAgICB9PignUGVyZm9ybWFuY2VNb25pdG9yJyk7XG4gICAgY29uc3QgdW5zdWIgPSBwZXJmTW9uaXRvci5hZGRMb2dMaXN0ZW5lcigobGV2ZWwsIG1lc3NhZ2UsIGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5OiBVbmlmaWVkTG9nRW50cnkgPSB7XG4gICAgICAgIGlkOiBsb2dNYW5hZ2VyLmdlbmVyYXRlSWQoKSxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGNhdGVnb3J5OiAncGVyZm9ybWFuY2UnLFxuICAgICAgICBsZXZlbDogbGV2ZWwgYXMgTG9nTGV2ZWwsXG4gICAgICAgIHNvdXJjZTogJ1BlcmZvcm1hbmNlTW9uaXRvcicsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IGNvbnRleHRUcmFja2VyPy5nZXRDb3JyZWxhdGlvbklkKCksXG4gICAgICB9O1xuICAgICAgbG9nTWFuYWdlci5sb2coZW50cnkpO1xuICAgIH0pO1xuICAgIGNsZWFudXBzLnB1c2godW5zdWIpO1xuICB9IGNhdGNoIHsgLyogUGVyZm9ybWFuY2VNb25pdG9yIG5vdCByZWdpc3RlcmVkICovIH1cblxuICAvLyAtLS0gRWxlbWVudEV2ZW50RGlzcGF0Y2hlciAoYXBwbGljYXRpb24pIOKAlCBhbHJlYWR5IGhhcyBvbigpIC0tLS0tLS0tLS0tXG4gIHRyeSB7XG4gICAgY29uc3QgZGlzcGF0Y2hlciA9IGNvbnRhaW5lci5yZXNvbHZlPHtcbiAgICAgIG9uKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IChwYXlsb2FkOiBhbnkpID0+IHZvaWQpOiAoKSA9PiB2b2lkO1xuICAgIH0+KCdFbGVtZW50RXZlbnREaXNwYXRjaGVyJyk7XG5cbiAgICBjb25zdCBldmVudExldmVsTWFwOiBSZWNvcmQ8c3RyaW5nLCBMb2dMZXZlbD4gPSB7XG4gICAgICAnZWxlbWVudDpsb2FkOmVycm9yJzogJ2Vycm9yJyxcbiAgICAgICdlbGVtZW50OnNhdmU6ZXJyb3InOiAnZXJyb3InLFxuICAgICAgJ2VsZW1lbnQ6ZGVsZXRlOmVycm9yJzogJ2Vycm9yJyxcbiAgICAgICdlbGVtZW50OmxvY2stdGltZW91dCc6ICd3YXJuJyxcbiAgICAgICdlbGVtZW50OmFjdGl2YXRlJzogJ2luZm8nLFxuICAgICAgJ2VsZW1lbnQ6ZGVhY3RpdmF0ZSc6ICdpbmZvJyxcbiAgICAgICdlbGVtZW50OmxvYWQ6c3VjY2Vzcyc6ICdpbmZvJyxcbiAgICAgICdlbGVtZW50OnNhdmU6c3VjY2Vzcyc6ICdpbmZvJyxcbiAgICAgICdlbGVtZW50OmRlbGV0ZTpzdWNjZXNzJzogJ2luZm8nLFxuICAgIH07XG5cbiAgICAvLyBPbmx5IGxvZyBldmVudHMgdGhhdCBoYXZlIGEgbWFwcGVkIGxldmVsIChlcnJvcnMsIHdhcm5pbmdzLCBzdWNjZXNzLCBhY3RpdmF0ZS9kZWFjdGl2YXRlKS5cbiAgICAvLyBTa2lwIHN0YXJ0L2NhY2hlL2V4dGVybmFsLWNoYW5nZSBldmVudHMg4oCUIHRoZXkgZmlyZSBwZXItZWxlbWVudCBhbmQgY3JlYXRlIG5vaXNlXG4gICAgLy8gd2l0aG91dCBhZGRpbmcgdmFsdWUgYmV5b25kIHRoZSBjb21wbGV0aW9uL2Vycm9yIGxvZ3MuXG4gICAgY29uc3QgbG9nZ2VkRXZlbnRzID0gT2JqZWN0LmtleXMoZXZlbnRMZXZlbE1hcCk7XG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBvZiBsb2dnZWRFdmVudHMpIHtcbiAgICAgIGNvbnN0IHVuc3ViID0gZGlzcGF0Y2hlci5vbihldmVudE5hbWUsIChwYXlsb2FkOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSBldmVudExldmVsTWFwW2V2ZW50TmFtZV0gPz8gJ2RlYnVnJztcbiAgICAgICAgY29uc3QgcmVxdWVzdENvcnJlbGF0aW9uSWQgPSBjb250ZXh0VHJhY2tlcj8uZ2V0Q29ycmVsYXRpb25JZCgpO1xuICAgICAgICAvLyBVc2UgZWxlbWVudElkIGlmIGF2YWlsYWJsZSwgZmFsbCBiYWNrIHRvIGZpbGVuYW1lIGZyb20gZmlsZVBhdGhcbiAgICAgICAgY29uc3QgZWxlbWVudE5hbWUgPSBwYXlsb2FkLmVsZW1lbnRJZFxuICAgICAgICAgIHx8IChwYXlsb2FkLmZpbGVQYXRoID8gcGF5bG9hZC5maWxlUGF0aC5yZXBsYWNlKC9cXC5bXi5dKyQvLCAnJykgOiAnJyk7XG4gICAgICAgIGNvbnN0IGVudHJ5OiBVbmlmaWVkTG9nRW50cnkgPSB7XG4gICAgICAgICAgaWQ6IGxvZ01hbmFnZXIuZ2VuZXJhdGVJZCgpLFxuICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGNhdGVnb3J5OiAnYXBwbGljYXRpb24nLFxuICAgICAgICAgIGxldmVsLFxuICAgICAgICAgIHNvdXJjZTogJ0VsZW1lbnRFdmVudERpc3BhdGNoZXInLFxuICAgICAgICAgIG1lc3NhZ2U6IGAke2V2ZW50TmFtZX0gWyR7cGF5bG9hZC5lbGVtZW50VHlwZSA/PyAndW5rbm93bid9OiR7ZWxlbWVudE5hbWV9XWAsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgLi4ucGF5bG9hZC5leHRyYSxcbiAgICAgICAgICAgIC4uLihwYXlsb2FkLmNvcnJlbGF0aW9uSWQgPyB7IG9wZXJhdGlvbklkOiBwYXlsb2FkLmNvcnJlbGF0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihwYXlsb2FkLmZpbGVQYXRoID8geyBmaWxlUGF0aDogcGF5bG9hZC5maWxlUGF0aCB9IDoge30pLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogcmVxdWVzdENvcnJlbGF0aW9uSWQgPz8gcGF5bG9hZC5jb3JyZWxhdGlvbklkLFxuICAgICAgICB9O1xuICAgICAgICBsb2dNYW5hZ2VyLmxvZyhlbnRyeSk7XG4gICAgICB9KTtcbiAgICAgIGNsZWFudXBzLnB1c2godW5zdWIpO1xuICAgIH1cbiAgfSBjYXRjaCB7IC8qIEVsZW1lbnRFdmVudERpc3BhdGNoZXIgbm90IHJlZ2lzdGVyZWQgKi8gfVxuXG4gIC8vIC0tLSBPcGVyYXRpb25hbFRlbGVtZXRyeSAodGVsZW1ldHJ5KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICB0cnkge1xuICAgIGNvbnN0IG9wc1RlbGVtZXRyeSA9IGNvbnRhaW5lci5yZXNvbHZlPHtcbiAgICAgIGFkZExvZ0xpc3RlbmVyKGZuOiAobGV2ZWw6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQpOiAoKSA9PiB2b2lkO1xuICAgIH0+KCdPcGVyYXRpb25hbFRlbGVtZXRyeScpO1xuICAgIGNvbnN0IHVuc3ViID0gb3BzVGVsZW1ldHJ5LmFkZExvZ0xpc3RlbmVyKChsZXZlbCwgbWVzc2FnZSwgZGF0YSkgPT4ge1xuICAgICAgY29uc3QgZW50cnk6IFVuaWZpZWRMb2dFbnRyeSA9IHtcbiAgICAgICAgaWQ6IGxvZ01hbmFnZXIuZ2VuZXJhdGVJZCgpLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgY2F0ZWdvcnk6ICd0ZWxlbWV0cnknLFxuICAgICAgICBsZXZlbDogbGV2ZWwgYXMgTG9nTGV2ZWwsXG4gICAgICAgIHNvdXJjZTogJ09wZXJhdGlvbmFsVGVsZW1ldHJ5JyxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgY29ycmVsYXRpb25JZDogY29udGV4dFRyYWNrZXI/LmdldENvcnJlbGF0aW9uSWQoKSxcbiAgICAgIH07XG4gICAgICBsb2dNYW5hZ2VyLmxvZyhlbnRyeSk7XG4gICAgfSk7XG4gICAgY2xlYW51cHMucHVzaCh1bnN1Yik7XG4gIH0gY2F0Y2ggeyAvKiBPcGVyYXRpb25hbFRlbGVtZXRyeSBub3QgcmVnaXN0ZXJlZCAqLyB9XG5cbiAgLy8gLS0tIEZpbGVMb2NrTWFuYWdlciAocGVyZm9ybWFuY2UpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIHRyeSB7XG4gICAgY29uc3QgbG9ja01hbmFnZXIgPSBjb250YWluZXIucmVzb2x2ZTx7XG4gICAgICBhZGRMb2dMaXN0ZW5lcihmbjogKGxldmVsOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkKTogKCkgPT4gdm9pZDtcbiAgICB9PignRmlsZUxvY2tNYW5hZ2VyJyk7XG4gICAgY29uc3QgdW5zdWIgPSBsb2NrTWFuYWdlci5hZGRMb2dMaXN0ZW5lcigobGV2ZWwsIG1lc3NhZ2UsIGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5OiBVbmlmaWVkTG9nRW50cnkgPSB7XG4gICAgICAgIGlkOiBsb2dNYW5hZ2VyLmdlbmVyYXRlSWQoKSxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGNhdGVnb3J5OiAncGVyZm9ybWFuY2UnLFxuICAgICAgICBsZXZlbDogbGV2ZWwgYXMgTG9nTGV2ZWwsXG4gICAgICAgIHNvdXJjZTogJ0ZpbGVMb2NrTWFuYWdlcicsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IGNvbnRleHRUcmFja2VyPy5nZXRDb3JyZWxhdGlvbklkKCksXG4gICAgICB9O1xuICAgICAgbG9nTWFuYWdlci5sb2coZW50cnkpO1xuICAgIH0pO1xuICAgIGNsZWFudXBzLnB1c2godW5zdWIpO1xuICB9IGNhdGNoIHsgLyogRmlsZUxvY2tNYW5hZ2VyIG5vdCByZWdpc3RlcmVkICovIH1cblxuICAvLyAtLS0gRGVmYXVsdEVsZW1lbnRQcm92aWRlciAocGVyZm9ybWFuY2UsIHN0YXRpYykgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAge1xuICAgIGNvbnN0IHVuc3ViID0gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5hZGRMb2dMaXN0ZW5lcigobGV2ZWwsIG1lc3NhZ2UsIGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5OiBVbmlmaWVkTG9nRW50cnkgPSB7XG4gICAgICAgIGlkOiBsb2dNYW5hZ2VyLmdlbmVyYXRlSWQoKSxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGNhdGVnb3J5OiAncGVyZm9ybWFuY2UnLFxuICAgICAgICBsZXZlbDogbGV2ZWwgYXMgTG9nTGV2ZWwsXG4gICAgICAgIHNvdXJjZTogJ0RlZmF1bHRFbGVtZW50UHJvdmlkZXInLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBkYXRhLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBjb250ZXh0VHJhY2tlcj8uZ2V0Q29ycmVsYXRpb25JZCgpLFxuICAgICAgfTtcbiAgICAgIGxvZ01hbmFnZXIubG9nKGVudHJ5KTtcbiAgICB9KTtcbiAgICBjbGVhbnVwcy5wdXNoKHVuc3ViKTtcbiAgfVxuXG4gIC8vIC0tLSBMUlVDYWNoZSAocGVyZm9ybWFuY2UsIHN0YXRpYykgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIHtcbiAgICBjb25zdCB1bnN1YiA9IExSVUNhY2hlLmFkZExvZ0xpc3RlbmVyKChsZXZlbCwgbWVzc2FnZSwgZGF0YSkgPT4ge1xuICAgICAgY29uc3QgZW50cnk6IFVuaWZpZWRMb2dFbnRyeSA9IHtcbiAgICAgICAgaWQ6IGxvZ01hbmFnZXIuZ2VuZXJhdGVJZCgpLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgY2F0ZWdvcnk6ICdwZXJmb3JtYW5jZScsXG4gICAgICAgIGxldmVsOiBsZXZlbCBhcyBMb2dMZXZlbCxcbiAgICAgICAgc291cmNlOiAnTFJVQ2FjaGUnLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBkYXRhLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBjb250ZXh0VHJhY2tlcj8uZ2V0Q29ycmVsYXRpb25JZCgpLFxuICAgICAgfTtcbiAgICAgIGxvZ01hbmFnZXIubG9nKGVudHJ5KTtcbiAgICB9KTtcbiAgICBjbGVhbnVwcy5wdXNoKHVuc3ViKTtcbiAgfVxuXG4gIC8vIC0tLSBTdGF0ZUNoYW5nZU5vdGlmaWVyIChhcHBsaWNhdGlvbikg4oCUIGV4dGVuZHMgRXZlbnRFbWl0dGVyIC0tLS0tLS0tLS1cbiAgdHJ5IHtcbiAgICBjb25zdCBub3RpZmllciA9IGNvbnRhaW5lci5yZXNvbHZlPHtcbiAgICAgIG9uKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IGFueTtcbiAgICAgIHJlbW92ZUxpc3RlbmVyKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IGFueTtcbiAgICB9PignU3RhdGVDaGFuZ2VOb3RpZmllcicpO1xuICAgIGNvbnN0IGhhbmRsZXIgPSAoZXZlbnQ6IHsgdHlwZTogc3RyaW5nOyBwcmV2aW91c1ZhbHVlOiBzdHJpbmcgfCBudWxsOyBuZXdWYWx1ZTogc3RyaW5nIHwgbnVsbCB9KSA9PiB7XG4gICAgICBjb25zdCBlbnRyeTogVW5pZmllZExvZ0VudHJ5ID0ge1xuICAgICAgICBpZDogbG9nTWFuYWdlci5nZW5lcmF0ZUlkKCksXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBjYXRlZ29yeTogJ2FwcGxpY2F0aW9uJyxcbiAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgc291cmNlOiAnU3RhdGVDaGFuZ2VOb3RpZmllcicsXG4gICAgICAgIG1lc3NhZ2U6IGBTdGF0ZSBjaGFuZ2U6ICR7ZXZlbnQudHlwZX1gLFxuICAgICAgICBkYXRhOiB7IHByZXZpb3VzVmFsdWU6IGV2ZW50LnByZXZpb3VzVmFsdWUsIG5ld1ZhbHVlOiBldmVudC5uZXdWYWx1ZSB9LFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBjb250ZXh0VHJhY2tlcj8uZ2V0Q29ycmVsYXRpb25JZCgpLFxuICAgICAgfTtcbiAgICAgIGxvZ01hbmFnZXIubG9nKGVudHJ5KTtcbiAgICB9O1xuICAgIG5vdGlmaWVyLm9uKCdzdGF0ZS1jaGFuZ2UnLCBoYW5kbGVyKTtcbiAgICBjbGVhbnVwcy5wdXNoKCgpID0+IG5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKCdzdGF0ZS1jaGFuZ2UnLCBoYW5kbGVyKSk7XG4gIH0gY2F0Y2ggeyAvKiBTdGF0ZUNoYW5nZU5vdGlmaWVyIG5vdCByZWdpc3RlcmVkICovIH1cblxuICByZXR1cm4gY2xlYW51cHM7XG59XG4iXX0=
|
|
335
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nSG9va3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG9nZ2luZy9Mb2dIb29rcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7QUFJSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDaEYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRWxFLDhFQUE4RTtBQUM5RSw0RUFBNEU7QUFDNUUsbUJBQW1CO0FBQ25CLDhFQUE4RTtBQUU5RSxNQUFNLGlCQUFpQixHQUE2QjtJQUNsRCxRQUFRLEVBQUUsT0FBTztJQUNqQixJQUFJLEVBQUUsT0FBTztJQUNiLE1BQU0sRUFBRSxNQUFNO0lBQ2QsR0FBRyxFQUFFLE1BQU07SUFDWCxRQUFRLEVBQUUsT0FBTztJQUNqQixJQUFJLEVBQUUsT0FBTztJQUNiLE1BQU0sRUFBRSxNQUFNO0lBQ2QsR0FBRyxFQUFFLE1BQU07Q0FDWixDQUFDO0FBRUYsTUFBTSxzQ0FBc0MsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDO0FBQzNELE1BQU0scUNBQXFDLEdBQUcsR0FBRyxDQUFDO0FBRWxELFNBQVMsMEJBQTBCLENBQUMsS0FBYztJQUNoRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sZUFBZSxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztJQUM1RSxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLHdCQUF3QixF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QyxDQUFDO1FBQ0gsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBRy9CLHFCQUFxQixDQUFDLENBQUM7UUFDMUIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUE4RSxFQUFFLEVBQUU7WUFDakcsTUFBTSxLQUFLLEdBQW9CO2dCQUM3QixFQUFFLEVBQUUsVUFBVSxDQUFDLFVBQVUsRUFBRTtnQkFDM0IsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2dCQUNuQyxRQUFRLEVBQUUsYUFBYTtnQkFDdkIsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsTUFBTSxFQUFFLHFCQUFxQjtnQkFDN0IsT0FBTyxFQUFFLGlCQUFpQixLQUFLLENBQUMsSUFBSSxFQUFFO2dCQUN0QyxJQUFJLEVBQUUsRUFBRSxhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRTtnQkFDdEUsYUFBYSxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRTthQUNsRCxDQUFDO1lBQ0YsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUM7UUFDRixRQUFRLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUFDLE1BQU0sQ0FBQyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7SUFFcEQsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGhhc2UgNDogSW50ZWdyYXRpb24gSG9va3MgZm9yIFVuaWZpZWQgTG9nZ2luZyBTeXN0ZW0uXG4gKlxuICogTWFwcyBuYXRpdmUgZXZlbnRzIGZyb20gMTAgbW9uaXRvcmluZy9sb2dnaW5nIHN5c3RlbXMgaW50byBVbmlmaWVkTG9nRW50cnlcbiAqIG9iamVjdHMgYW5kIHJvdXRlcyB0aGVtIHRocm91Z2ggTG9nTWFuYWdlci4gIEVhY2ggc291cmNlIHN5c3RlbSBleHBvc2VzIGFcbiAqIGxpZ2h0d2VpZ2h0IGBhZGRMb2dMaXN0ZW5lcmAgY2FsbGJhY2s7IHRoZSB0cmFuc2xhdGlvbiBsb2dpYyBsaXZlcyBoZXJlIHNvXG4gKiBzb3VyY2UgZmlsZXMgc3RheSBtaW5pbWFsIGFuZCBuZXZlciBpbXBvcnQgVW5pZmllZExvZ0VudHJ5LlxuICpcbiAqIFVzYWdlOlxuICogICBjb25zdCBjbGVhbnVwcyA9IHdpcmVMb2dIb29rcyhsb2dNYW5hZ2VyLCBjb250YWluZXIpO1xuICogICAvLyBsYXRlciDigKZcbiAqICAgY2xlYW51cHMuZm9yRWFjaChmbiA9PiBmbigpKTtcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExvZ01hbmFnZXIgfSBmcm9tICcuL0xvZ01hbmFnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgVW5pZmllZExvZ0VudHJ5IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBEZWZhdWx0RWxlbWVudFByb3ZpZGVyIH0gZnJvbSAnLi4vcG9ydGZvbGlvL0RlZmF1bHRFbGVtZW50UHJvdmlkZXIuanMnO1xuaW1wb3J0IHsgTFJVQ2FjaGUgfSBmcm9tICcuLi9jYWNoZS9MUlVDYWNoZS5qcyc7XG5pbXBvcnQgeyBFdmVudERlZHVwbGljYXRvciB9IGZyb20gJy4uL3V0aWxzL0V2ZW50RGVkdXBsaWNhdG9yLmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZXZlcml0eSDihpIgTG9nTGV2ZWwgaGVscGVyIChzaGFyZWQgYnkgU2VjdXJpdHlNb25pdG9yLCBTZWN1cml0eVRlbGVtZXRyeSxcbi8vIFNlY3VyaXR5QXVkaXRvcilcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBTRVZFUklUWV9UT19MRVZFTDogUmVjb3JkPHN0cmluZywgTG9nTGV2ZWw+ID0ge1xuICBDUklUSUNBTDogJ2Vycm9yJyxcbiAgSElHSDogJ2Vycm9yJyxcbiAgTUVESVVNOiAnd2FybicsXG4gIExPVzogJ2luZm8nLFxuICBjcml0aWNhbDogJ2Vycm9yJyxcbiAgaGlnaDogJ2Vycm9yJyxcbiAgbWVkaXVtOiAnd2FybicsXG4gIGxvdzogJ2luZm8nLFxufTtcblxuY29uc3QgQ09OVEVOVF9JTkpFQ1RJT05fVklTSUJJTElUWV9XSU5ET1dfTVMgPSAxMCAqIDYwXzAwMDtcbmNvbnN0IENPTlRFTlRfSU5KRUNUSU9OX1ZJU0lCSUxJVFlfTUFYX0tFWVMgPSA1MDA7XG5cbmZ1bmN0aW9uIGV4dHJhY3RDb250ZW50SW5qZWN0aW9uS2V5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkVmFsdWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh2YWx1ZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkVmFsdWUucmVwbGFjZSgvXkRldGVjdGVkIHBhdHRlcm46XFxzKi9pLCAnJykudHJpbSgpO1xuICByZXR1cm4gbm9ybWFsaXplZCA9PT0gJycgPyBudWxsIDogYENPTlRFTlRfSU5KRUNUSU9OXFwwJHtub3JtYWxpemVkfWA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29ycmVsYXRpb25JZCBwcm92aWRlciBpbnRlcmZhY2UgKHN1YnNldCBvZiBDb250ZXh0VHJhY2tlcilcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50eXBlIENvcnJlbGF0aW9uSWRQcm92aWRlciA9IHsgZ2V0Q29ycmVsYXRpb25JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQgfTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeHBvcnRlZCBmYWN0b3J5IGZvciBUcmlnZ2VyTWV0cmljc1RyYWNrZXIgKGNyZWF0ZWQgb3V0c2lkZSBESSBjb250YWluZXIpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRyaWdnZXJNZXRyaWNzTG9nTGlzdGVuZXIoXG4gIGxvZ01hbmFnZXI6IExvZ01hbmFnZXIsXG4gIGNvbnRleHRUcmFja2VyPzogQ29ycmVsYXRpb25JZFByb3ZpZGVyLFxuKTogKGxldmVsOiAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQge1xuICByZXR1cm4gKGxldmVsLCBtZXNzYWdlLCBkYXRhKSA9PiB7XG4gICAgY29uc3QgZW50cnk6IFVuaWZpZWRMb2dFbnRyeSA9IHtcbiAgICAgIGlkOiBsb2dNYW5hZ2VyLmdlbmVyYXRlSWQoKSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgY2F0ZWdvcnk6ICd0ZWxlbWV0cnknLFxuICAgICAgbGV2ZWwsXG4gICAgICBzb3VyY2U6ICdUcmlnZ2VyTWV0cmljc1RyYWNrZXInLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIGRhdGEsXG4gICAgICBjb3JyZWxhdGlvbklkOiBjb250ZXh0VHJhY2tlcj8uZ2V0Q29ycmVsYXRpb25JZCgpLFxuICAgIH07XG4gICAgbG9nTWFuYWdlci5sb2coZW50cnkpO1xuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV4cG9ydGVkIGZhY3RvcnkgZm9yIFNlY3VyaXR5QXVkaXRvciAoY3JlYXRlZCBvdXRzaWRlIERJIGNvbnRhaW5lcilcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VjdXJpdHlBdWRpdG9yTG9nTGlzdGVuZXIoXG4gIGxvZ01hbmFnZXI6IExvZ01hbmFnZXIsXG4gIGNvbnRleHRUcmFja2VyPzogQ29ycmVsYXRpb25JZFByb3ZpZGVyLFxuKTogKGxldmVsOiAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQge1xuICByZXR1cm4gKGxldmVsLCBtZXNzYWdlLCBkYXRhKSA9PiB7XG4gICAgY29uc3QgZW50cnk6IFVuaWZpZWRMb2dFbnRyeSA9IHtcbiAgICAgIGlkOiBsb2dNYW5hZ2VyLmdlbmVyYXRlSWQoKSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgY2F0ZWdvcnk6ICdzZWN1cml0eScsXG4gICAgICBsZXZlbCxcbiAgICAgIHNvdXJjZTogJ1NlY3VyaXR5QXVkaXRvcicsXG4gICAgICBtZXNzYWdlLFxuICAgICAgZGF0YSxcbiAgICAgIGNvcnJlbGF0aW9uSWQ6IGNvbnRleHRUcmFja2VyPy5nZXRDb3JyZWxhdGlvbklkKCksXG4gICAgfTtcbiAgICBsb2dNYW5hZ2VyLmxvZyhlbnRyeSk7XG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTWFpbiB3aXJpbmcgZnVuY3Rpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFdpcmUgYWxsIG1vbml0b3Jpbmcgc3lzdGVtcyBpbnRvIHRoZSB1bmlmaWVkIGxvZ2dpbmcgcGlwZWxpbmUuXG4gKlxuICogQHBhcmFtIGxvZ01hbmFnZXIgIFRoZSBMb2dNYW5hZ2VyIHNpbmdsZXRvbiBmcm9tIHRoZSBESSBjb250YWluZXIuXG4gKiBAcGFyYW0gY29udGFpbmVyICAgVGhlIERJIGNvbnRhaW5lciAodXNlZCB0byByZXNvbHZlIHNvdXJjZSBzZXJ2aWNlcykuXG4gKiBAcmV0dXJucyBBcnJheSBvZiB1bnN1YnNjcmliZSBmdW5jdGlvbnMg4oCUIGNhbGwgdGhlbSBkdXJpbmcgc2h1dGRvd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXJlTG9nSG9va3MoXG4gIGxvZ01hbmFnZXI6IExvZ01hbmFnZXIsXG4gIGNvbnRhaW5lcjogeyByZXNvbHZlPFQ+KG5hbWU6IHN0cmluZyk6IFQgfSxcbik6ICgoKSA9PiB2b2lkKVtdIHtcbiAgY29uc3QgY2xlYW51cHM6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gIGNvbnN0IGNvbnRlbnRJbmplY3Rpb25WaXNpYmlsaXR5RGVkdXAgPSBuZXcgRXZlbnREZWR1cGxpY2F0b3IoXG4gICAgQ09OVEVOVF9JTkpFQ1RJT05fVklTSUJJTElUWV9XSU5ET1dfTVMsXG4gICAgQ09OVEVOVF9JTkpFQ1RJT05fVklTSUJJTElUWV9NQVhfS0VZUyxcbiAgKTtcblxuICAvLyBSZXNvbHZlIENvbnRleHRUcmFja2VyIGZvciBjb3JyZWxhdGlvbklkIGluamVjdGlvblxuICBsZXQgY29udGV4dFRyYWNrZXI6IENvcnJlbGF0aW9uSWRQcm92aWRlciB8IG51bGwgPSBudWxsO1xuICB0cnkge1xuICAgIGNvbnRleHRUcmFja2VyID0gY29udGFpbmVyLnJlc29sdmU8Q29ycmVsYXRpb25JZFByb3ZpZGVyPignQ29udGV4dFRyYWNrZXInKTtcbiAgfSBjYXRjaCB7IC8qIENvbnRleHRUcmFja2VyIG5vdCByZWdpc3RlcmVkICovIH1cblxuICAvLyAtLS0gTUNQTG9nZ2VyIChhcHBsaWNhdGlvbikgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICB0cnkge1xuICAgIGNvbnN0IG1jcExvZ2dlciA9IGNvbnRhaW5lci5yZXNvbHZlPHtcbiAgICAgIGFkZExvZ0xpc3RlbmVyKGZuOiAoZW50cnk6IHsgdGltZXN0YW1wOiBEYXRlOyBsZXZlbDogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmc7IGRhdGE/OiBhbnkgfSkgPT4gdm9pZCk6ICgpID0+IHZvaWQ7XG4gICAgfT4oJ01DUExvZ2dlcicpO1xuICAgIGNvbnN0IHVuc3ViID0gbWNwTG9nZ2VyLmFkZExvZ0xpc3RlbmVyKChsb2dFbnRyeSkgPT4ge1xuICAgICAgY29uc3QgY29udGVudEluamVjdGlvbktleSA9XG4gICAgICAgIGxvZ0VudHJ5Lm1lc3NhZ2UgPT09ICdbQ1JJVElDQUwgU0VDVVJJVFkgQUxFUlRdJyAmJlxuICAgICAgICBsb2dFbnRyeS5kYXRhPy50eXBlID09PSAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCdcbiAgICAgICAgICA/IGV4dHJhY3RDb250ZW50SW5qZWN0aW9uS2V5KGxvZ0VudHJ5LmRhdGE/LmRldGFpbHMpXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgaWYgKGNvbnRlbnRJbmplY3Rpb25LZXkgIT09IG51bGwgJiYgY29udGVudEluamVjdGlvblZpc2liaWxpdHlEZWR1cC5zaG91bGRTdXBwcmVzcyhjb250ZW50SW5qZWN0aW9uS2V5KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVudHJ5OiBVbmlmaWVkTG9nRW50cnkgPSB7XG4gICAgICAgIGlkOiBsb2dNYW5hZ2VyLmdlbmVyYXRlSWQoKSxcbiAgICAgICAgdGltZXN0YW1wOiBsb2dFbnRyeS50aW1lc3RhbXAudG9JU09TdHJpbmcoKSxcbiAgICAgICAgY2F0ZWdvcnk6ICdhcHBsaWNhdGlvbicsXG4gICAgICAgIGxldmVsOiBsb2dFbnRyeS5sZXZlbCBhcyBMb2dMZXZlbCxcbiAgICAgICAgc291cmNlOiAnTUNQTG9nZ2VyJyxcbiAgICAgICAgbWVzc2FnZTogbG9nRW50cnkubWVzc2FnZSxcbiAgICAgICAgZGF0YTogbG9nRW50cnkuZGF0YSAhPSBudWxsID8gbG9nRW50cnkuZGF0YSA6IHVuZGVmaW5lZCxcbiAgICAgICAgY29ycmVsYXRpb25JZDogY29udGV4dFRyYWNrZXI/LmdldENvcnJlbGF0aW9uSWQoKSxcbiAgICAgIH07XG4gICAgICBsb2dNYW5hZ2VyLmxvZyhlbnRyeSk7XG4gICAgfSk7XG4gICAgY2xlYW51cHMucHVzaCh1bnN1Yik7XG4gIH0gY2F0Y2ggeyAvKiBNQ1BMb2dnZXIgbm90IHJlZ2lzdGVyZWQgKi8gfVxuXG4gIC8vIC0tLSBTZWN1cml0eU1vbml0b3IgKHNlY3VyaXR5LCBzdGF0aWMpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICB7XG4gICAgY29uc3QgdW5zdWIgPSBTZWN1cml0eU1vbml0b3IuYWRkTG9nTGlzdGVuZXIoKGxvZ0VudHJ5KSA9PiB7XG4gICAgICBjb25zdCBjb250ZW50SW5qZWN0aW9uS2V5ID1cbiAgICAgICAgbG9nRW50cnkudHlwZSA9PT0gJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnXG4gICAgICAgICAgPyBleHRyYWN0Q29udGVudEluamVjdGlvbktleShsb2dFbnRyeS5kZXRhaWxzKVxuICAgICAgICAgIDogbnVsbDtcbiAgICAgIGlmIChjb250ZW50SW5qZWN0aW9uS2V5ICE9PSBudWxsICYmIGNvbnRlbnRJbmplY3Rpb25WaXNpYmlsaXR5RGVkdXAuc2hvdWxkU3VwcHJlc3MoY29udGVudEluamVjdGlvbktleSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbnRyeTogVW5pZmllZExvZ0VudHJ5ID0ge1xuICAgICAgICBpZDogbG9nTWFuYWdlci5nZW5lcmF0ZUlkKCksXG4gICAgICAgIHRpbWVzdGFtcDogbG9nRW50cnkudGltZXN0YW1wLFxuICAgICAgICBjYXRlZ29yeTogJ3NlY3VyaXR5JyxcbiAgICAgICAgbGV2ZWw6IFNFVkVSSVRZX1RPX0xFVkVMW2xvZ0VudHJ5LnNldmVyaXR5XSA/PyAnaW5mbycsXG4gICAgICAgIHNvdXJjZTogJ1NlY3VyaXR5TW9uaXRvcicsXG4gICAgICAgIG1lc3NhZ2U6IGBbJHtsb2dFbnRyeS50eXBlfV0gJHtsb2dFbnRyeS5kZXRhaWxzfWAsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAuLi5sb2dFbnRyeS5hZGRpdGlvbmFsRGF0YSxcbiAgICAgICAgICBldmVudFR5cGU6IGxvZ0VudHJ5LnR5cGUsXG4gICAgICAgICAgc2V2ZXJpdHk6IGxvZ0VudHJ5LnNldmVyaXR5LFxuICAgICAgICAgIHNvdXJjZUNvbXBvbmVudDogbG9nRW50cnkuc291cmNlLFxuICAgICAgICB9LFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBjb250ZXh0VHJhY2tlcj8uZ2V0Q29ycmVsYXRpb25JZCgpLFxuICAgICAgfTtcbiAgICAgIGxvZ01hbmFnZXIubG9nKGVudHJ5KTtcbiAgICB9KTtcbiAgICBjbGVhbnVwcy5wdXNoKHVuc3ViKTtcbiAgfVxuXG4gIC8vIC0tLSBTZWN1cml0eVRlbGVtZXRyeSAoc2VjdXJpdHkpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICB0cnkge1xuICAgIGNvbnN0IHNlY1RlbGVtZXRyeSA9IGNvbnRhaW5lci5yZXNvbHZlPHtcbiAgICAgIGFkZExvZ0xpc3RlbmVyKGZuOiAoZW50cnk6IHtcbiAgICAgICAgdGltZXN0YW1wOiBzdHJpbmc7IGF0dGFja1R5cGU6IHN0cmluZzsgcGF0dGVybjogc3RyaW5nO1xuICAgICAgICBzZXZlcml0eTogc3RyaW5nOyBzb3VyY2U6IHN0cmluZzsgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgfSkgPT4gdm9pZCk6ICgpID0+IHZvaWQ7XG4gICAgfT4oJ1NlY3VyaXR5VGVsZW1ldHJ5Jyk7XG4gICAgY29uc3QgdW5zdWIgPSBzZWNUZWxlbWV0cnkuYWRkTG9nTGlzdGVuZXIoKHRlbEVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBjb250ZW50SW5qZWN0aW9uS2V5ID1cbiAgICAgICAgdGVsRW50cnkuYXR0YWNrVHlwZSA9PT0gJ0NPTlRFTlRfSU5KRUNUSU9OJ1xuICAgICAgICAgID8gZXh0cmFjdENvbnRlbnRJbmplY3Rpb25LZXkodGVsRW50cnkucGF0dGVybilcbiAgICAgICAgICA6IG51bGw7XG4gICAgICBpZiAoY29udGVudEluamVjdGlvbktleSAhPT0gbnVsbCAmJiBjb250ZW50SW5qZWN0aW9uVmlzaWJpbGl0eURlZHVwLnNob3VsZFN1cHByZXNzKGNvbnRlbnRJbmplY3Rpb25LZXkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZW50cnk6IFVuaWZpZWRMb2dFbnRyeSA9IHtcbiAgICAgICAgaWQ6IGxvZ01hbmFnZXIuZ2VuZXJhdGVJZCgpLFxuICAgICAgICB0aW1lc3RhbXA6IHRlbEVudHJ5LnRpbWVzdGFtcCxcbiAgICAgICAgY2F0ZWdvcnk6ICdzZWN1cml0eScsXG4gICAgICAgIGxldmVsOiBTRVZFUklUWV9UT19MRVZFTFt0ZWxFbnRyeS5zZXZlcml0eV0gPz8gJ2luZm8nLFxuICAgICAgICBzb3VyY2U6ICdTZWN1cml0eVRlbGVtZXRyeScsXG4gICAgICAgIG1lc3NhZ2U6IGBCbG9ja2VkICR7dGVsRW50cnkuYXR0YWNrVHlwZX06ICR7dGVsRW50cnkucGF0dGVybn1gLFxuICAgICAgICBkYXRhOiB0ZWxFbnRyeS5tZXRhZGF0YSxcbiAgICAgICAgY29ycmVsYXRpb25JZDogY29udGV4dFRyYWNrZXI/LmdldENvcnJlbGF0aW9uSWQoKSxcbiAgICAgIH07XG4gICAgICBsb2dNYW5hZ2VyLmxvZyhlbnRyeSk7XG4gICAgfSk7XG4gICAgY2xlYW51cHMucHVzaCh1bnN1Yik7XG4gIH0gY2F0Y2ggeyAvKiBTZWN1cml0eVRlbGVtZXRyeSBub3QgcmVnaXN0ZXJlZCAqLyB9XG5cbiAgLy8gLS0tIFBlcmZvcm1hbmNlTW9uaXRvciAocGVyZm9ybWFuY2UpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIHRyeSB7XG4gICAgY29uc3QgcGVyZk1vbml0b3IgPSBjb250YWluZXIucmVzb2x2ZTx7XG4gICAgICBhZGRMb2dMaXN0ZW5lcihmbjogKGxldmVsOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkKTogKCkgPT4gdm9pZDtcbiAgICB9PignUGVyZm9ybWFuY2VNb25pdG9yJyk7XG4gICAgY29uc3QgdW5zdWIgPSBwZXJmTW9uaXRvci5hZGRMb2dMaXN0ZW5lcigobGV2ZWwsIG1lc3NhZ2UsIGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5OiBVbmlmaWVkTG9nRW50cnkgPSB7XG4gICAgICAgIGlkOiBsb2dNYW5hZ2VyLmdlbmVyYXRlSWQoKSxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGNhdGVnb3J5OiAncGVyZm9ybWFuY2UnLFxuICAgICAgICBsZXZlbDogbGV2ZWwgYXMgTG9nTGV2ZWwsXG4gICAgICAgIHNvdXJjZTogJ1BlcmZvcm1hbmNlTW9uaXRvcicsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IGNvbnRleHRUcmFja2VyPy5nZXRDb3JyZWxhdGlvbklkKCksXG4gICAgICB9O1xuICAgICAgbG9nTWFuYWdlci5sb2coZW50cnkpO1xuICAgIH0pO1xuICAgIGNsZWFudXBzLnB1c2godW5zdWIpO1xuICB9IGNhdGNoIHsgLyogUGVyZm9ybWFuY2VNb25pdG9yIG5vdCByZWdpc3RlcmVkICovIH1cblxuICAvLyAtLS0gRWxlbWVudEV2ZW50RGlzcGF0Y2hlciAoYXBwbGljYXRpb24pIOKAlCBhbHJlYWR5IGhhcyBvbigpIC0tLS0tLS0tLS0tXG4gIHRyeSB7XG4gICAgY29uc3QgZGlzcGF0Y2hlciA9IGNvbnRhaW5lci5yZXNvbHZlPHtcbiAgICAgIG9uKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IChwYXlsb2FkOiBhbnkpID0+IHZvaWQpOiAoKSA9PiB2b2lkO1xuICAgIH0+KCdFbGVtZW50RXZlbnREaXNwYXRjaGVyJyk7XG5cbiAgICBjb25zdCBldmVudExldmVsTWFwOiBSZWNvcmQ8c3RyaW5nLCBMb2dMZXZlbD4gPSB7XG4gICAgICAnZWxlbWVudDpsb2FkOmVycm9yJzogJ2Vycm9yJyxcbiAgICAgICdlbGVtZW50OnNhdmU6ZXJyb3InOiAnZXJyb3InLFxuICAgICAgJ2VsZW1lbnQ6ZGVsZXRlOmVycm9yJzogJ2Vycm9yJyxcbiAgICAgICdlbGVtZW50OmxvY2stdGltZW91dCc6ICd3YXJuJyxcbiAgICAgICdlbGVtZW50OmFjdGl2YXRlJzogJ2luZm8nLFxuICAgICAgJ2VsZW1lbnQ6ZGVhY3RpdmF0ZSc6ICdpbmZvJyxcbiAgICAgICdlbGVtZW50OmxvYWQ6c3VjY2Vzcyc6ICdpbmZvJyxcbiAgICAgICdlbGVtZW50OnNhdmU6c3VjY2Vzcyc6ICdpbmZvJyxcbiAgICAgICdlbGVtZW50OmRlbGV0ZTpzdWNjZXNzJzogJ2luZm8nLFxuICAgIH07XG5cbiAgICAvLyBPbmx5IGxvZyBldmVudHMgdGhhdCBoYXZlIGEgbWFwcGVkIGxldmVsIChlcnJvcnMsIHdhcm5pbmdzLCBzdWNjZXNzLCBhY3RpdmF0ZS9kZWFjdGl2YXRlKS5cbiAgICAvLyBTa2lwIHN0YXJ0L2NhY2hlL2V4dGVybmFsLWNoYW5nZSBldmVudHMg4oCUIHRoZXkgZmlyZSBwZXItZWxlbWVudCBhbmQgY3JlYXRlIG5vaXNlXG4gICAgLy8gd2l0aG91dCBhZGRpbmcgdmFsdWUgYmV5b25kIHRoZSBjb21wbGV0aW9uL2Vycm9yIGxvZ3MuXG4gICAgY29uc3QgbG9nZ2VkRXZlbnRzID0gT2JqZWN0LmtleXMoZXZlbnRMZXZlbE1hcCk7XG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBvZiBsb2dnZWRFdmVudHMpIHtcbiAgICAgIGNvbnN0IHVuc3ViID0gZGlzcGF0Y2hlci5vbihldmVudE5hbWUsIChwYXlsb2FkOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSBldmVudExldmVsTWFwW2V2ZW50TmFtZV0gPz8gJ2RlYnVnJztcbiAgICAgICAgY29uc3QgcmVxdWVzdENvcnJlbGF0aW9uSWQgPSBjb250ZXh0VHJhY2tlcj8uZ2V0Q29ycmVsYXRpb25JZCgpO1xuICAgICAgICAvLyBVc2UgZWxlbWVudElkIGlmIGF2YWlsYWJsZSwgZmFsbCBiYWNrIHRvIGZpbGVuYW1lIGZyb20gZmlsZVBhdGhcbiAgICAgICAgY29uc3QgZWxlbWVudE5hbWUgPSBwYXlsb2FkLmVsZW1lbnRJZFxuICAgICAgICAgIHx8IChwYXlsb2FkLmZpbGVQYXRoID8gcGF5bG9hZC5maWxlUGF0aC5yZXBsYWNlKC9cXC5bXi5dKyQvLCAnJykgOiAnJyk7XG4gICAgICAgIGNvbnN0IGVudHJ5OiBVbmlmaWVkTG9nRW50cnkgPSB7XG4gICAgICAgICAgaWQ6IGxvZ01hbmFnZXIuZ2VuZXJhdGVJZCgpLFxuICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGNhdGVnb3J5OiAnYXBwbGljYXRpb24nLFxuICAgICAgICAgIGxldmVsLFxuICAgICAgICAgIHNvdXJjZTogJ0VsZW1lbnRFdmVudERpc3BhdGNoZXInLFxuICAgICAgICAgIG1lc3NhZ2U6IGAke2V2ZW50TmFtZX0gWyR7cGF5bG9hZC5lbGVtZW50VHlwZSA/PyAndW5rbm93bid9OiR7ZWxlbWVudE5hbWV9XWAsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgLi4ucGF5bG9hZC5leHRyYSxcbiAgICAgICAgICAgIC4uLihwYXlsb2FkLmNvcnJlbGF0aW9uSWQgPyB7IG9wZXJhdGlvbklkOiBwYXlsb2FkLmNvcnJlbGF0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihwYXlsb2FkLmZpbGVQYXRoID8geyBmaWxlUGF0aDogcGF5bG9hZC5maWxlUGF0aCB9IDoge30pLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogcmVxdWVzdENvcnJlbGF0aW9uSWQgPz8gcGF5bG9hZC5jb3JyZWxhdGlvbklkLFxuICAgICAgICB9O1xuICAgICAgICBsb2dNYW5hZ2VyLmxvZyhlbnRyeSk7XG4gICAgICB9KTtcbiAgICAgIGNsZWFudXBzLnB1c2godW5zdWIpO1xuICAgIH1cbiAgfSBjYXRjaCB7IC8qIEVsZW1lbnRFdmVudERpc3BhdGNoZXIgbm90IHJlZ2lzdGVyZWQgKi8gfVxuXG4gIC8vIC0tLSBPcGVyYXRpb25hbFRlbGVtZXRyeSAodGVsZW1ldHJ5KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICB0cnkge1xuICAgIGNvbnN0IG9wc1RlbGVtZXRyeSA9IGNvbnRhaW5lci5yZXNvbHZlPHtcbiAgICAgIGFkZExvZ0xpc3RlbmVyKGZuOiAobGV2ZWw6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQpOiAoKSA9PiB2b2lkO1xuICAgIH0+KCdPcGVyYXRpb25hbFRlbGVtZXRyeScpO1xuICAgIGNvbnN0IHVuc3ViID0gb3BzVGVsZW1ldHJ5LmFkZExvZ0xpc3RlbmVyKChsZXZlbCwgbWVzc2FnZSwgZGF0YSkgPT4ge1xuICAgICAgY29uc3QgZW50cnk6IFVuaWZpZWRMb2dFbnRyeSA9IHtcbiAgICAgICAgaWQ6IGxvZ01hbmFnZXIuZ2VuZXJhdGVJZCgpLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgY2F0ZWdvcnk6ICd0ZWxlbWV0cnknLFxuICAgICAgICBsZXZlbDogbGV2ZWwgYXMgTG9nTGV2ZWwsXG4gICAgICAgIHNvdXJjZTogJ09wZXJhdGlvbmFsVGVsZW1ldHJ5JyxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgY29ycmVsYXRpb25JZDogY29udGV4dFRyYWNrZXI/LmdldENvcnJlbGF0aW9uSWQoKSxcbiAgICAgIH07XG4gICAgICBsb2dNYW5hZ2VyLmxvZyhlbnRyeSk7XG4gICAgfSk7XG4gICAgY2xlYW51cHMucHVzaCh1bnN1Yik7XG4gIH0gY2F0Y2ggeyAvKiBPcGVyYXRpb25hbFRlbGVtZXRyeSBub3QgcmVnaXN0ZXJlZCAqLyB9XG5cbiAgLy8gLS0tIEZpbGVMb2NrTWFuYWdlciAocGVyZm9ybWFuY2UpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIHRyeSB7XG4gICAgY29uc3QgbG9ja01hbmFnZXIgPSBjb250YWluZXIucmVzb2x2ZTx7XG4gICAgICBhZGRMb2dMaXN0ZW5lcihmbjogKGxldmVsOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkKTogKCkgPT4gdm9pZDtcbiAgICB9PignRmlsZUxvY2tNYW5hZ2VyJyk7XG4gICAgY29uc3QgdW5zdWIgPSBsb2NrTWFuYWdlci5hZGRMb2dMaXN0ZW5lcigobGV2ZWwsIG1lc3NhZ2UsIGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5OiBVbmlmaWVkTG9nRW50cnkgPSB7XG4gICAgICAgIGlkOiBsb2dNYW5hZ2VyLmdlbmVyYXRlSWQoKSxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGNhdGVnb3J5OiAncGVyZm9ybWFuY2UnLFxuICAgICAgICBsZXZlbDogbGV2ZWwgYXMgTG9nTGV2ZWwsXG4gICAgICAgIHNvdXJjZTogJ0ZpbGVMb2NrTWFuYWdlcicsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IGNvbnRleHRUcmFja2VyPy5nZXRDb3JyZWxhdGlvbklkKCksXG4gICAgICB9O1xuICAgICAgbG9nTWFuYWdlci5sb2coZW50cnkpO1xuICAgIH0pO1xuICAgIGNsZWFudXBzLnB1c2godW5zdWIpO1xuICB9IGNhdGNoIHsgLyogRmlsZUxvY2tNYW5hZ2VyIG5vdCByZWdpc3RlcmVkICovIH1cblxuICAvLyAtLS0gRGVmYXVsdEVsZW1lbnRQcm92aWRlciAocGVyZm9ybWFuY2UsIHN0YXRpYykgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAge1xuICAgIGNvbnN0IHVuc3ViID0gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5hZGRMb2dMaXN0ZW5lcigobGV2ZWwsIG1lc3NhZ2UsIGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5OiBVbmlmaWVkTG9nRW50cnkgPSB7XG4gICAgICAgIGlkOiBsb2dNYW5hZ2VyLmdlbmVyYXRlSWQoKSxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGNhdGVnb3J5OiAncGVyZm9ybWFuY2UnLFxuICAgICAgICBsZXZlbDogbGV2ZWwgYXMgTG9nTGV2ZWwsXG4gICAgICAgIHNvdXJjZTogJ0RlZmF1bHRFbGVtZW50UHJvdmlkZXInLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBkYXRhLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBjb250ZXh0VHJhY2tlcj8uZ2V0Q29ycmVsYXRpb25JZCgpLFxuICAgICAgfTtcbiAgICAgIGxvZ01hbmFnZXIubG9nKGVudHJ5KTtcbiAgICB9KTtcbiAgICBjbGVhbnVwcy5wdXNoKHVuc3ViKTtcbiAgfVxuXG4gIC8vIC0tLSBMUlVDYWNoZSAocGVyZm9ybWFuY2UsIHN0YXRpYykgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIHtcbiAgICBjb25zdCB1bnN1YiA9IExSVUNhY2hlLmFkZExvZ0xpc3RlbmVyKChsZXZlbCwgbWVzc2FnZSwgZGF0YSkgPT4ge1xuICAgICAgY29uc3QgZW50cnk6IFVuaWZpZWRMb2dFbnRyeSA9IHtcbiAgICAgICAgaWQ6IGxvZ01hbmFnZXIuZ2VuZXJhdGVJZCgpLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgY2F0ZWdvcnk6ICdwZXJmb3JtYW5jZScsXG4gICAgICAgIGxldmVsOiBsZXZlbCBhcyBMb2dMZXZlbCxcbiAgICAgICAgc291cmNlOiAnTFJVQ2FjaGUnLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBkYXRhLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBjb250ZXh0VHJhY2tlcj8uZ2V0Q29ycmVsYXRpb25JZCgpLFxuICAgICAgfTtcbiAgICAgIGxvZ01hbmFnZXIubG9nKGVudHJ5KTtcbiAgICB9KTtcbiAgICBjbGVhbnVwcy5wdXNoKHVuc3ViKTtcbiAgfVxuXG4gIC8vIC0tLSBTdGF0ZUNoYW5nZU5vdGlmaWVyIChhcHBsaWNhdGlvbikg4oCUIGV4dGVuZHMgRXZlbnRFbWl0dGVyIC0tLS0tLS0tLS1cbiAgdHJ5IHtcbiAgICBjb25zdCBub3RpZmllciA9IGNvbnRhaW5lci5yZXNvbHZlPHtcbiAgICAgIG9uKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IGFueTtcbiAgICAgIHJlbW92ZUxpc3RlbmVyKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IGFueTtcbiAgICB9PignU3RhdGVDaGFuZ2VOb3RpZmllcicpO1xuICAgIGNvbnN0IGhhbmRsZXIgPSAoZXZlbnQ6IHsgdHlwZTogc3RyaW5nOyBwcmV2aW91c1ZhbHVlOiBzdHJpbmcgfCBudWxsOyBuZXdWYWx1ZTogc3RyaW5nIHwgbnVsbCB9KSA9PiB7XG4gICAgICBjb25zdCBlbnRyeTogVW5pZmllZExvZ0VudHJ5ID0ge1xuICAgICAgICBpZDogbG9nTWFuYWdlci5nZW5lcmF0ZUlkKCksXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBjYXRlZ29yeTogJ2FwcGxpY2F0aW9uJyxcbiAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgc291cmNlOiAnU3RhdGVDaGFuZ2VOb3RpZmllcicsXG4gICAgICAgIG1lc3NhZ2U6IGBTdGF0ZSBjaGFuZ2U6ICR7ZXZlbnQudHlwZX1gLFxuICAgICAgICBkYXRhOiB7IHByZXZpb3VzVmFsdWU6IGV2ZW50LnByZXZpb3VzVmFsdWUsIG5ld1ZhbHVlOiBldmVudC5uZXdWYWx1ZSB9LFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBjb250ZXh0VHJhY2tlcj8uZ2V0Q29ycmVsYXRpb25JZCgpLFxuICAgICAgfTtcbiAgICAgIGxvZ01hbmFnZXIubG9nKGVudHJ5KTtcbiAgICB9O1xuICAgIG5vdGlmaWVyLm9uKCdzdGF0ZS1jaGFuZ2UnLCBoYW5kbGVyKTtcbiAgICBjbGVhbnVwcy5wdXNoKCgpID0+IG5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKCdzdGF0ZS1jaGFuZ2UnLCBoYW5kbGVyKSk7XG4gIH0gY2F0Y2ggeyAvKiBTdGF0ZUNoYW5nZU5vdGlmaWVyIG5vdCByZWdpc3RlcmVkICovIH1cblxuICByZXR1cm4gY2xlYW51cHM7XG59XG4iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contentPipeline.d.ts","sourceRoot":"","sources":["../../src/web/contentPipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"contentPipeline.d.ts","sourceRoot":"","sources":["../../src/web/contentPipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAmBH,4EAA4E;AAC5E,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,sBAAsB,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AA+BD,wBAAgB,mCAAmC,IAAI,IAAI,CAE1D;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,cAAc,CA8FhB"}
|
|
@@ -11,10 +11,12 @@
|
|
|
11
11
|
* auto-dollhouse#5 / upstream #1679
|
|
12
12
|
* DMCP-SEC-004 compliant: uses UnicodeValidator.normalize() on all inputs
|
|
13
13
|
*/
|
|
14
|
+
import { createHash } from 'node:crypto';
|
|
14
15
|
import { extname } from 'node:path';
|
|
15
16
|
import { SecureYamlParser } from '../security/secureYamlParser.js';
|
|
16
17
|
import { ContentValidator } from '../security/contentValidator.js';
|
|
17
18
|
import { UnicodeValidator } from '../security/validators/unicodeValidator.js';
|
|
19
|
+
import { LRUCache } from '../cache/LRUCache.js';
|
|
18
20
|
import { logger } from '../utils/logger.js';
|
|
19
21
|
/** Element types that map to content validation contexts */
|
|
20
22
|
const TYPE_TO_CONTEXT = {
|
|
@@ -24,6 +26,34 @@ const TYPE_TO_CONTEXT = {
|
|
|
24
26
|
agents: 'agent',
|
|
25
27
|
memories: 'memory',
|
|
26
28
|
};
|
|
29
|
+
const CONTENT_PIPELINE_CACHE_MAX_SIZE = 256;
|
|
30
|
+
const CONTENT_PIPELINE_CACHE_MAX_MEMORY_MB = 16;
|
|
31
|
+
const CONTENT_PIPELINE_CACHE = new LRUCache({
|
|
32
|
+
name: 'web-content-validation',
|
|
33
|
+
maxSize: CONTENT_PIPELINE_CACHE_MAX_SIZE,
|
|
34
|
+
maxMemoryMB: CONTENT_PIPELINE_CACHE_MAX_MEMORY_MB,
|
|
35
|
+
});
|
|
36
|
+
function buildContentCacheKey(filename, elementType, rawContent) {
|
|
37
|
+
const contentHash = createHash('sha256').update(rawContent).digest('hex');
|
|
38
|
+
// Keep filename/type in the key so identical payloads from different routes
|
|
39
|
+
// remain independently attributable if route-specific handling diverges later.
|
|
40
|
+
return JSON.stringify([elementType, filename, contentHash]);
|
|
41
|
+
}
|
|
42
|
+
function clonePipelineResult(result) {
|
|
43
|
+
return {
|
|
44
|
+
...result,
|
|
45
|
+
metadata: { ...result.metadata },
|
|
46
|
+
rejection: result.rejection
|
|
47
|
+
? {
|
|
48
|
+
...result.rejection,
|
|
49
|
+
patterns: result.rejection.patterns ? [...result.rejection.patterns] : undefined,
|
|
50
|
+
}
|
|
51
|
+
: undefined,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export function resetContentPipelineCacheForTesting() {
|
|
55
|
+
CONTENT_PIPELINE_CACHE.clear();
|
|
56
|
+
}
|
|
27
57
|
/**
|
|
28
58
|
* Validate element content through the security pipeline.
|
|
29
59
|
*
|
|
@@ -40,6 +70,11 @@ export function validateElementContent(filename, rawContent, elementType) {
|
|
|
40
70
|
const normalizedFilename = filenameValidation.normalizedContent;
|
|
41
71
|
const normalizedContent = contentValidation.normalizedContent;
|
|
42
72
|
const normalizedType = elementType.normalize('NFC');
|
|
73
|
+
const cacheKey = buildContentCacheKey(normalizedFilename, normalizedType, rawContent);
|
|
74
|
+
const cachedResult = CONTENT_PIPELINE_CACHE.get(cacheKey);
|
|
75
|
+
if (cachedResult) {
|
|
76
|
+
return clonePipelineResult(cachedResult);
|
|
77
|
+
}
|
|
43
78
|
const ext = extname(normalizedFilename);
|
|
44
79
|
const isYaml = ext === '.yaml' || ext === '.yml';
|
|
45
80
|
const contentContext = TYPE_TO_CONTEXT[normalizedType];
|
|
@@ -65,13 +100,18 @@ export function validateElementContent(filename, rawContent, elementType) {
|
|
|
65
100
|
}
|
|
66
101
|
}
|
|
67
102
|
catch (err) {
|
|
68
|
-
|
|
103
|
+
const result = {
|
|
69
104
|
valid: false,
|
|
70
105
|
content: normalizedContent,
|
|
71
106
|
metadata: {},
|
|
72
107
|
body: '',
|
|
73
108
|
rejection: { reason: `Parse validation failed: ${err.message}`, severity: 'high' },
|
|
74
109
|
};
|
|
110
|
+
// Cache parse failures too: steady-state polling can otherwise keep reparsing
|
|
111
|
+
// identical malformed files forever. If the file is fixed, the content hash
|
|
112
|
+
// changes and this entry is naturally bypassed.
|
|
113
|
+
CONTENT_PIPELINE_CACHE.set(cacheKey, clonePipelineResult(result));
|
|
114
|
+
return result;
|
|
75
115
|
}
|
|
76
116
|
// Step 2: Content injection pattern detection (markdown elements only)
|
|
77
117
|
// YAML memories skip this — they contain legitimate code patterns and
|
|
@@ -88,7 +128,7 @@ export function validateElementContent(filename, rawContent, elementType) {
|
|
|
88
128
|
patterns: validation.detectedPatterns,
|
|
89
129
|
severity: validation.severity,
|
|
90
130
|
});
|
|
91
|
-
|
|
131
|
+
const result = {
|
|
92
132
|
valid: false,
|
|
93
133
|
content: normalizedContent,
|
|
94
134
|
metadata,
|
|
@@ -99,14 +139,18 @@ export function validateElementContent(filename, rawContent, elementType) {
|
|
|
99
139
|
patterns: validation.detectedPatterns,
|
|
100
140
|
},
|
|
101
141
|
};
|
|
142
|
+
CONTENT_PIPELINE_CACHE.set(cacheKey, clonePipelineResult(result));
|
|
143
|
+
return result;
|
|
102
144
|
}
|
|
103
145
|
}
|
|
104
146
|
// Step 3: Return validated content
|
|
105
|
-
|
|
147
|
+
const result = {
|
|
106
148
|
valid: true,
|
|
107
149
|
content: rawContent,
|
|
108
150
|
metadata,
|
|
109
151
|
body,
|
|
110
152
|
};
|
|
153
|
+
CONTENT_PIPELINE_CACHE.set(cacheKey, clonePipelineResult(result));
|
|
154
|
+
return result;
|
|
111
155
|
}
|
|
112
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudFBpcGVsaW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dlYi9jb250ZW50UGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBRUgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQWdDLE1BQU0saUNBQWlDLENBQUM7QUFDakcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTVDLDREQUE0RDtBQUM1RCxNQUFNLGVBQWUsR0FBMEU7SUFDN0YsUUFBUSxFQUFFLFNBQVM7SUFDbkIsTUFBTSxFQUFFLE9BQU87SUFDZixTQUFTLEVBQUUsVUFBVTtJQUNyQixNQUFNLEVBQUUsT0FBTztJQUNmLFFBQVEsRUFBRSxRQUFRO0NBQ25CLENBQUM7QUF1Q0Y7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsUUFBZ0IsRUFDaEIsVUFBa0IsRUFDbEIsV0FBbUI7SUFFbkIscUVBQXFFO0lBQ3JFLDJFQUEyRTtJQUMzRSxNQUFNLGtCQUFrQixHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRSxNQUFNLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqRSxNQUFNLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDO0lBQ2hFLE1BQU0saUJBQWlCLEdBQUcsaUJBQWlCLENBQUMsaUJBQWlCLENBQUM7SUFDOUQsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVwRCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUN4QyxNQUFNLE1BQU0sR0FBRyxHQUFHLEtBQUssT0FBTyxJQUFJLEdBQUcsS0FBSyxNQUFNLENBQUM7SUFDakQsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRXZELDRFQUE0RTtJQUM1RSxJQUFJLFFBQVEsR0FBMkIsRUFBRSxDQUFDO0lBQzFDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUVkLElBQUksQ0FBQztRQUNILElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCx5RUFBeUU7WUFDekUsZ0RBQWdEO1lBQ2hELDRFQUE0RTtZQUM1RSx1RUFBdUU7WUFDdkUsd0VBQXdFO1lBQ3hFLHVEQUF1RDtZQUN2RCxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNoRSxRQUFRLEdBQUcsQ0FBQyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRSxDQUFDO2FBQU0sQ0FBQztZQUNOLGlDQUFpQztZQUNqQyxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO1lBQzdFLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ3ZCLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE9BQU87WUFDTCxLQUFLLEVBQUUsS0FBSztZQUNaLE9BQU8sRUFBRSxpQkFBaUI7WUFDMUIsUUFBUSxFQUFFLEVBQUU7WUFDWixJQUFJLEVBQUUsRUFBRTtZQUNSLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSw0QkFBNkIsR0FBYSxDQUFDLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUU7U0FDOUYsQ0FBQztJQUNKLENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsc0VBQXNFO0lBQ3RFLHVFQUF1RTtJQUN2RSwrRUFBK0U7SUFDL0UsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxVQUFVLEdBQTRCLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixFQUFFO1lBQ2xHLGNBQWM7U0FDZixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0NBQW9DLEVBQUU7Z0JBQ2hELFFBQVE7Z0JBQ1IsV0FBVztnQkFDWCxRQUFRLEVBQUUsVUFBVSxDQUFDLGdCQUFnQjtnQkFDckMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRO2FBQzlCLENBQUMsQ0FBQztZQUNILE9BQU87Z0JBQ0wsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsUUFBUTtnQkFDUixJQUFJO2dCQUNKLFNBQVMsRUFBRTtvQkFDVCxNQUFNLEVBQUUsb0NBQW9DO29CQUM1QyxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7b0JBQzdCLFFBQVEsRUFBRSxVQUFVLENBQUMsZ0JBQWdCO2lCQUN0QzthQUNGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELG1DQUFtQztJQUNuQyxPQUFPO1FBQ0wsS0FBSyxFQUFFLElBQUk7UUFDWCxPQUFPLEVBQUUsVUFBVTtRQUNuQixRQUFRO1FBQ1IsSUFBSTtLQUNMLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb250ZW50IFZhbGlkYXRpb24gUGlwZWxpbmUgZm9yIFdlYiBVSVxuICpcbiAqIENvbXBvc2VzIHRoZSBzdGFuZGFsb25lIHNlY3VyaXR5IHZhbGlkYXRvcnMgaW50byBhIHNpbmdsZSBwaXBlbGluZVxuICogZm9yIHZhbGlkYXRpbmcgcG9ydGZvbGlvIGVsZW1lbnQgY29udGVudCBiZWZvcmUgc2VydmluZyB0byB0aGUgYnJvd3Nlci5cbiAqXG4gKiBVc2VzIHRoZSBzYW1lIHZhbGlkYXRvcnMgYXMgdGhlIE1DUEFRTEhhbmRsZXIgYnV0IHdpdGhvdXQgY291cGxpbmdcbiAqIHRvIHRoZSBoYW5kbGVyJ3Mgb3BlcmF0aW9uIGRpc3BhdGNoLiBUaGlzIGlzIHRoZSBleHRyYWN0aW9uIHBvaW50XG4gKiBmb3IgdGhlIHVwY29taW5nIE1DUEFRTEhhbmRsZXIgZGVjb21wb3NpdGlvbi5cbiAqXG4gKiBhdXRvLWRvbGxob3VzZSM1IC8gdXBzdHJlYW0gIzE2NzlcbiAqIERNQ1AtU0VDLTAwNCBjb21wbGlhbnQ6IHVzZXMgVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoKSBvbiBhbGwgaW5wdXRzXG4gKi9cblxuaW1wb3J0IHsgZXh0bmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJlWWFtbFBhcnNlci5qcyc7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yLCB0eXBlIENvbnRlbnRWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vc2VjdXJpdHkvY29udGVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5cbi8qKiBFbGVtZW50IHR5cGVzIHRoYXQgbWFwIHRvIGNvbnRlbnQgdmFsaWRhdGlvbiBjb250ZXh0cyAqL1xuY29uc3QgVFlQRV9UT19DT05URVhUOiBSZWNvcmQ8c3RyaW5nLCAncGVyc29uYScgfCAnc2tpbGwnIHwgJ3RlbXBsYXRlJyB8ICdhZ2VudCcgfCAnbWVtb3J5Jz4gPSB7XG4gIHBlcnNvbmFzOiAncGVyc29uYScsXG4gIHNraWxsczogJ3NraWxsJyxcbiAgdGVtcGxhdGVzOiAndGVtcGxhdGUnLFxuICBhZ2VudHM6ICdhZ2VudCcsXG4gIG1lbW9yaWVzOiAnbWVtb3J5Jyxcbn07XG5cbi8qKiBLbm93biBtZXRhZGF0YSBmaWVsZHMgZXh0cmFjdGVkIGZyb20gWUFNTCBmcm9udG1hdHRlciBmb3Igd2ViIGRpc3BsYXkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudERpc3BsYXlNZXRhZGF0YSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICB2ZXJzaW9uPzogc3RyaW5nO1xuICBhdXRob3I/OiBzdHJpbmc7XG4gIGNhdGVnb3J5Pzogc3RyaW5nO1xuICBjcmVhdGVkPzogc3RyaW5nO1xuICBjcmVhdGVkX2RhdGU/OiBzdHJpbmc7XG4gIG1vZGlmaWVkPzogc3RyaW5nO1xuICB0YWdzPzogc3RyaW5nW107XG4gIGxpY2Vuc2U/OiBzdHJpbmc7XG4gIGFnZV9yYXRpbmc/OiBzdHJpbmc7XG4gIHRyaWdnZXJzPzogc3RyaW5nW107XG4gIGluc3RydWN0aW9ucz86IHN0cmluZztcbiAgY29vcmRpbmF0aW9uX3N0cmF0ZWd5Pzogc3RyaW5nO1xuICB1c2VfY2FzZXM/OiBzdHJpbmdbXTtcbiAgcHJvZmljaWVuY3lfbGV2ZWxzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgZ2F0ZWtlZXBlcj86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBnb2FsPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGF1dG9ub215PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIG1lbW9yeVR5cGU/OiBzdHJpbmc7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVSZXN1bHQge1xuICB2YWxpZDogYm9vbGVhbjtcbiAgY29udGVudDogc3RyaW5nO1xuICBtZXRhZGF0YTogRWxlbWVudERpc3BsYXlNZXRhZGF0YTtcbiAgYm9keTogc3RyaW5nO1xuICByZWplY3Rpb24/OiB7XG4gICAgcmVhc29uOiBzdHJpbmc7XG4gICAgc2V2ZXJpdHk/OiBzdHJpbmc7XG4gICAgcGF0dGVybnM/OiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBlbGVtZW50IGNvbnRlbnQgdGhyb3VnaCB0aGUgc2VjdXJpdHkgcGlwZWxpbmUuXG4gKlxuICogQHBhcmFtIGZpbGVuYW1lIC0gVGhlIGVsZW1lbnQgZmlsZW5hbWUgKGUuZy4sIFwiYWxleC1zdGVybGluZy5tZFwiKVxuICogQHBhcmFtIHJhd0NvbnRlbnQgLSBUaGUgcmF3IGZpbGUgY29udGVudCBzdHJpbmdcbiAqIEBwYXJhbSBlbGVtZW50VHlwZSAtIFRoZSBwbHVyYWwgZWxlbWVudCB0eXBlIGRpcmVjdG9yeSAoZS5nLiwgXCJwZXJzb25hc1wiKVxuICogQHJldHVybnMgVmFsaWRhdGVkIGNvbnRlbnQgd2l0aCBwYXJzZWQgbWV0YWRhdGEsIG9yIHJlamVjdGlvbiB3aXRoIHJlYXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVFbGVtZW50Q29udGVudChcbiAgZmlsZW5hbWU6IHN0cmluZyxcbiAgcmF3Q29udGVudDogc3RyaW5nLFxuICBlbGVtZW50VHlwZTogc3RyaW5nLFxuKTogUGlwZWxpbmVSZXN1bHQge1xuICAvLyBETUNQLVNFQy0wMDQ6IE5vcm1hbGl6ZSBhbGwgaW5wdXRzIHZpYSBVbmljb2RlVmFsaWRhdG9yIHRvIHByZXZlbnRcbiAgLy8gaG9tb2dyYXBoIGF0dGFja3MsIGRpcmVjdGlvbiBvdmVycmlkZSBieXBhc3NlcywgYW5kIHN1c3BpY2lvdXMgcGF0dGVybnMuXG4gIGNvbnN0IGZpbGVuYW1lVmFsaWRhdGlvbiA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGZpbGVuYW1lKTtcbiAgY29uc3QgY29udGVudFZhbGlkYXRpb24gPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShyYXdDb250ZW50KTtcbiAgY29uc3Qgbm9ybWFsaXplZEZpbGVuYW1lID0gZmlsZW5hbWVWYWxpZGF0aW9uLm5vcm1hbGl6ZWRDb250ZW50O1xuICBjb25zdCBub3JtYWxpemVkQ29udGVudCA9IGNvbnRlbnRWYWxpZGF0aW9uLm5vcm1hbGl6ZWRDb250ZW50O1xuICBjb25zdCBub3JtYWxpemVkVHlwZSA9IGVsZW1lbnRUeXBlLm5vcm1hbGl6ZSgnTkZDJyk7XG5cbiAgY29uc3QgZXh0ID0gZXh0bmFtZShub3JtYWxpemVkRmlsZW5hbWUpO1xuICBjb25zdCBpc1lhbWwgPSBleHQgPT09ICcueWFtbCcgfHwgZXh0ID09PSAnLnltbCc7XG4gIGNvbnN0IGNvbnRlbnRDb250ZXh0ID0gVFlQRV9UT19DT05URVhUW25vcm1hbGl6ZWRUeXBlXTtcblxuICAvLyBTdGVwIDE6IFBhcnNlIGFuZCB2YWxpZGF0ZSBzdHJ1Y3R1cmUgKFlBTUwgYm9tYiBkZXRlY3Rpb24sIGNpcmN1bGFyIHJlZnMpXG4gIGxldCBtZXRhZGF0YTogRWxlbWVudERpc3BsYXlNZXRhZGF0YSA9IHt9O1xuICBsZXQgYm9keSA9ICcnO1xuXG4gIHRyeSB7XG4gICAgaWYgKGlzWWFtbCkge1xuICAgICAgLy8gUHVyZSBZQU1MIGZpbGUgKG1lbW9yaWVzKSDigJQgdXNlIHBhcnNlUmF3WWFtbCBmb3Igc3RydWN0dXJhbCB2YWxpZGF0aW9uXG4gICAgICAvLyAoYm9tYiBkZXRlY3Rpb24sIGNpcmN1bGFyIHJlZnMsIHNpemUgbGltaXRzKS5cbiAgICAgIC8vIFNraXAgQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZVlhbWxDb250ZW50KCkg4oCUIGl0IHByb2R1Y2VzIGZhbHNlIHBvc2l0aXZlc1xuICAgICAgLy8gb24gbWVtb3J5IGNvbnRlbnQgdGhhdCBsZWdpdGltYXRlbHkgY29udGFpbnMgY29kZSBwYXR0ZXJucywgc2VjdXJpdHlcbiAgICAgIC8vIGtleXdvcmRzLCBhbmQgdGVjaG5pY2FsIGRvY3VtZW50YXRpb24uIE1lbW9yaWVzIGFyZSBsb2NhbGx5LWdlbmVyYXRlZFxuICAgICAgLy8gdHJ1c3RlZCBjb250ZW50LCBub3QgdW50cnVzdGVkIGV4dGVybmFsIHN1Ym1pc3Npb25zLlxuICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZVJhd1lhbWwobm9ybWFsaXplZENvbnRlbnQpO1xuICAgICAgbWV0YWRhdGEgPSAodHlwZW9mIHBhcnNlZCA9PT0gJ29iamVjdCcgJiYgcGFyc2VkICE9PSBudWxsKSA/IHBhcnNlZCA6IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNYXJrZG93biB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2Uobm9ybWFsaXplZENvbnRlbnQsIHsgY29udGVudENvbnRleHQgfSk7XG4gICAgICBtZXRhZGF0YSA9IHBhcnNlZC5kYXRhO1xuICAgICAgYm9keSA9IHBhcnNlZC5jb250ZW50O1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgIGNvbnRlbnQ6IG5vcm1hbGl6ZWRDb250ZW50LFxuICAgICAgbWV0YWRhdGE6IHt9LFxuICAgICAgYm9keTogJycsXG4gICAgICByZWplY3Rpb246IHsgcmVhc29uOiBgUGFyc2UgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gLCBzZXZlcml0eTogJ2hpZ2gnIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFN0ZXAgMjogQ29udGVudCBpbmplY3Rpb24gcGF0dGVybiBkZXRlY3Rpb24gKG1hcmtkb3duIGVsZW1lbnRzIG9ubHkpXG4gIC8vIFlBTUwgbWVtb3JpZXMgc2tpcCB0aGlzIOKAlCB0aGV5IGNvbnRhaW4gbGVnaXRpbWF0ZSBjb2RlIHBhdHRlcm5zIGFuZFxuICAvLyB0ZWNobmljYWwgY29udGVudCB0aGF0IHRyaWdnZXJzIGZhbHNlIHBvc2l0aXZlcy4gVGhlIHN0cnVjdHVyYWwgWUFNTFxuICAvLyBwYXJzaW5nIGFib3ZlIChib21iL2NpcmN1bGFyIHJlZiBkZXRlY3Rpb24pIGlzIHN1ZmZpY2llbnQgZm9yIGxvY2FsIGNvbnRlbnQuXG4gIGlmICghaXNZYW1sKSB7XG4gICAgY29uc3QgdmFsaWRhdGlvbjogQ29udGVudFZhbGlkYXRpb25SZXN1bHQgPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUobm9ybWFsaXplZENvbnRlbnQsIHtcbiAgICAgIGNvbnRlbnRDb250ZXh0LFxuICAgIH0pO1xuXG4gICAgaWYgKCF2YWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdbQ29udGVudFBpcGVsaW5lXSBDb250ZW50IHJlamVjdGVkJywge1xuICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIHBhdHRlcm5zOiB2YWxpZGF0aW9uLmRldGVjdGVkUGF0dGVybnMsXG4gICAgICAgIHNldmVyaXR5OiB2YWxpZGF0aW9uLnNldmVyaXR5LFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZDogZmFsc2UsXG4gICAgICAgIGNvbnRlbnQ6IG5vcm1hbGl6ZWRDb250ZW50LFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgYm9keSxcbiAgICAgICAgcmVqZWN0aW9uOiB7XG4gICAgICAgICAgcmVhc29uOiAnQ29udGVudCBmYWlsZWQgc2VjdXJpdHkgdmFsaWRhdGlvbicsXG4gICAgICAgICAgc2V2ZXJpdHk6IHZhbGlkYXRpb24uc2V2ZXJpdHksXG4gICAgICAgICAgcGF0dGVybnM6IHZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLy8gU3RlcCAzOiBSZXR1cm4gdmFsaWRhdGVkIGNvbnRlbnRcbiAgcmV0dXJuIHtcbiAgICB2YWxpZDogdHJ1ZSxcbiAgICBjb250ZW50OiByYXdDb250ZW50LFxuICAgIG1ldGFkYXRhLFxuICAgIGJvZHksXG4gIH07XG59XG4iXX0=
|
|
156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudFBpcGVsaW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dlYi9jb250ZW50UGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBZ0MsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTVDLDREQUE0RDtBQUM1RCxNQUFNLGVBQWUsR0FBMEU7SUFDN0YsUUFBUSxFQUFFLFNBQVM7SUFDbkIsTUFBTSxFQUFFLE9BQU87SUFDZixTQUFTLEVBQUUsVUFBVTtJQUNyQixNQUFNLEVBQUUsT0FBTztJQUNmLFFBQVEsRUFBRSxRQUFRO0NBQ25CLENBQUM7QUF1Q0YsTUFBTSwrQkFBK0IsR0FBRyxHQUFHLENBQUM7QUFDNUMsTUFBTSxvQ0FBb0MsR0FBRyxFQUFFLENBQUM7QUFFaEQsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLFFBQVEsQ0FBaUI7SUFDMUQsSUFBSSxFQUFFLHdCQUF3QjtJQUM5QixPQUFPLEVBQUUsK0JBQStCO0lBQ3hDLFdBQVcsRUFBRSxvQ0FBb0M7Q0FDbEQsQ0FBQyxDQUFDO0FBRUgsU0FBUyxvQkFBb0IsQ0FBQyxRQUFnQixFQUFFLFdBQW1CLEVBQUUsVUFBa0I7SUFDckYsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFV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RSxVQUFVLENBQUMsUUFBUTtvQkFDN0IsUUFBUSxFQUFFLFVBQVUsQ0FBQyxnQkFBZ0I7aUJBQ3RDO2FBQ0YsQ0FBQztZQUNGLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNsRSxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUVELG1DQUFtQztJQUNuQyxNQUFNLE1BQU0sR0FBbUI7UUFDN0IsS0FBSyxFQUFFLElBQUk7UUFDWCxPQUFPLEVBQUUsVUFBVTtRQUNuQixRQUFRO1FBQ1IsSUFBSTtLQUNMLENBQUM7SUFDRixzQkFBc0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbEUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29udGVudCBWYWxpZGF0aW9uIFBpcGVsaW5lIGZvciBXZWIgVUlcbiAqXG4gKiBDb21wb3NlcyB0aGUgc3RhbmRhbG9uZSBzZWN1cml0eSB2YWxpZGF0b3JzIGludG8gYSBzaW5nbGUgcGlwZWxpbmVcbiAqIGZvciB2YWxpZGF0aW5nIHBvcnRmb2xpbyBlbGVtZW50IGNvbnRlbnQgYmVmb3JlIHNlcnZpbmcgdG8gdGhlIGJyb3dzZXIuXG4gKlxuICogVXNlcyB0aGUgc2FtZSB2YWxpZGF0b3JzIGFzIHRoZSBNQ1BBUUxIYW5kbGVyIGJ1dCB3aXRob3V0IGNvdXBsaW5nXG4gKiB0byB0aGUgaGFuZGxlcidzIG9wZXJhdGlvbiBkaXNwYXRjaC4gVGhpcyBpcyB0aGUgZXh0cmFjdGlvbiBwb2ludFxuICogZm9yIHRoZSB1cGNvbWluZyBNQ1BBUUxIYW5kbGVyIGRlY29tcG9zaXRpb24uXG4gKlxuICogYXV0by1kb2xsaG91c2UjNSAvIHVwc3RyZWFtICMxNjc5XG4gKiBETUNQLVNFQy0wMDQgY29tcGxpYW50OiB1c2VzIFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKCkgb24gYWxsIGlucHV0c1xuICovXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBleHRuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IsIHR5cGUgQ29udGVudFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgTFJVQ2FjaGUgfSBmcm9tICcuLi9jYWNoZS9MUlVDYWNoZS5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuXG4vKiogRWxlbWVudCB0eXBlcyB0aGF0IG1hcCB0byBjb250ZW50IHZhbGlkYXRpb24gY29udGV4dHMgKi9cbmNvbnN0IFRZUEVfVE9fQ09OVEVYVDogUmVjb3JkPHN0cmluZywgJ3BlcnNvbmEnIHwgJ3NraWxsJyB8ICd0ZW1wbGF0ZScgfCAnYWdlbnQnIHwgJ21lbW9yeSc+ID0ge1xuICBwZXJzb25hczogJ3BlcnNvbmEnLFxuICBza2lsbHM6ICdza2lsbCcsXG4gIHRlbXBsYXRlczogJ3RlbXBsYXRlJyxcbiAgYWdlbnRzOiAnYWdlbnQnLFxuICBtZW1vcmllczogJ21lbW9yeScsXG59O1xuXG4vKiogS25vd24gbWV0YWRhdGEgZmllbGRzIGV4dHJhY3RlZCBmcm9tIFlBTUwgZnJvbnRtYXR0ZXIgZm9yIHdlYiBkaXNwbGF5ICovXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnREaXNwbGF5TWV0YWRhdGEge1xuICBuYW1lPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgYXV0aG9yPzogc3RyaW5nO1xuICBjYXRlZ29yeT86IHN0cmluZztcbiAgY3JlYXRlZD86IHN0cmluZztcbiAgY3JlYXRlZF9kYXRlPzogc3RyaW5nO1xuICBtb2RpZmllZD86IHN0cmluZztcbiAgdGFncz86IHN0cmluZ1tdO1xuICBsaWNlbnNlPzogc3RyaW5nO1xuICBhZ2VfcmF0aW5nPzogc3RyaW5nO1xuICB0cmlnZ2Vycz86IHN0cmluZ1tdO1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmc7XG4gIGNvb3JkaW5hdGlvbl9zdHJhdGVneT86IHN0cmluZztcbiAgdXNlX2Nhc2VzPzogc3RyaW5nW107XG4gIHByb2ZpY2llbmN5X2xldmVscz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGdhdGVrZWVwZXI/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZ29hbD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBhdXRvbm9teT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBtZW1vcnlUeXBlPzogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lUmVzdWx0IHtcbiAgdmFsaWQ6IGJvb2xlYW47XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgbWV0YWRhdGE6IEVsZW1lbnREaXNwbGF5TWV0YWRhdGE7XG4gIGJvZHk6IHN0cmluZztcbiAgcmVqZWN0aW9uPzoge1xuICAgIHJlYXNvbjogc3RyaW5nO1xuICAgIHNldmVyaXR5Pzogc3RyaW5nO1xuICAgIHBhdHRlcm5zPzogc3RyaW5nW107XG4gIH07XG59XG5cbmNvbnN0IENPTlRFTlRfUElQRUxJTkVfQ0FDSEVfTUFYX1NJWkUgPSAyNTY7XG5jb25zdCBDT05URU5UX1BJUEVMSU5FX0NBQ0hFX01BWF9NRU1PUllfTUIgPSAxNjtcblxuY29uc3QgQ09OVEVOVF9QSVBFTElORV9DQUNIRSA9IG5ldyBMUlVDYWNoZTxQaXBlbGluZVJlc3VsdD4oe1xuICBuYW1lOiAnd2ViLWNvbnRlbnQtdmFsaWRhdGlvbicsXG4gIG1heFNpemU6IENPTlRFTlRfUElQRUxJTkVfQ0FDSEVfTUFYX1NJWkUsXG4gIG1heE1lbW9yeU1COiBDT05URU5UX1BJUEVMSU5FX0NBQ0hFX01BWF9NRU1PUllfTUIsXG59KTtcblxuZnVuY3Rpb24gYnVpbGRDb250ZW50Q2FjaGVLZXkoZmlsZW5hbWU6IHN0cmluZywgZWxlbWVudFR5cGU6IHN0cmluZywgcmF3Q29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY29udGVudEhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUocmF3Q29udGVudCkuZGlnZXN0KCdoZXgnKTtcbiAgLy8gS2VlcCBmaWxlbmFtZS90eXBlIGluIHRoZSBrZXkgc28gaWRlbnRpY2FsIHBheWxvYWRzIGZyb20gZGlmZmVyZW50IHJvdXRlc1xuICAvLyByZW1haW4gaW5kZXBlbmRlbnRseSBhdHRyaWJ1dGFibGUgaWYgcm91dGUtc3BlY2lmaWMgaGFuZGxpbmcgZGl2ZXJnZXMgbGF0ZXIuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbZWxlbWVudFR5cGUsIGZpbGVuYW1lLCBjb250ZW50SGFzaF0pO1xufVxuXG5mdW5jdGlvbiBjbG9uZVBpcGVsaW5lUmVzdWx0KHJlc3VsdDogUGlwZWxpbmVSZXN1bHQpOiBQaXBlbGluZVJlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgLi4ucmVzdWx0LFxuICAgIG1ldGFkYXRhOiB7IC4uLnJlc3VsdC5tZXRhZGF0YSB9LFxuICAgIHJlamVjdGlvbjogcmVzdWx0LnJlamVjdGlvblxuICAgICAgPyB7XG4gICAgICAgICAgLi4ucmVzdWx0LnJlamVjdGlvbixcbiAgICAgICAgICBwYXR0ZXJuczogcmVzdWx0LnJlamVjdGlvbi5wYXR0ZXJucyA/IFsuLi5yZXN1bHQucmVqZWN0aW9uLnBhdHRlcm5zXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNldENvbnRlbnRQaXBlbGluZUNhY2hlRm9yVGVzdGluZygpOiB2b2lkIHtcbiAgQ09OVEVOVF9QSVBFTElORV9DQUNIRS5jbGVhcigpO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGVsZW1lbnQgY29udGVudCB0aHJvdWdoIHRoZSBzZWN1cml0eSBwaXBlbGluZS5cbiAqXG4gKiBAcGFyYW0gZmlsZW5hbWUgLSBUaGUgZWxlbWVudCBmaWxlbmFtZSAoZS5nLiwgXCJhbGV4LXN0ZXJsaW5nLm1kXCIpXG4gKiBAcGFyYW0gcmF3Q29udGVudCAtIFRoZSByYXcgZmlsZSBjb250ZW50IHN0cmluZ1xuICogQHBhcmFtIGVsZW1lbnRUeXBlIC0gVGhlIHBsdXJhbCBlbGVtZW50IHR5cGUgZGlyZWN0b3J5IChlLmcuLCBcInBlcnNvbmFzXCIpXG4gKiBAcmV0dXJucyBWYWxpZGF0ZWQgY29udGVudCB3aXRoIHBhcnNlZCBtZXRhZGF0YSwgb3IgcmVqZWN0aW9uIHdpdGggcmVhc29uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnRDb250ZW50KFxuICBmaWxlbmFtZTogc3RyaW5nLFxuICByYXdDb250ZW50OiBzdHJpbmcsXG4gIGVsZW1lbnRUeXBlOiBzdHJpbmcsXG4pOiBQaXBlbGluZVJlc3VsdCB7XG4gIC8vIERNQ1AtU0VDLTAwNDogTm9ybWFsaXplIGFsbCBpbnB1dHMgdmlhIFVuaWNvZGVWYWxpZGF0b3IgdG8gcHJldmVudFxuICAvLyBob21vZ3JhcGggYXR0YWNrcywgZGlyZWN0aW9uIG92ZXJyaWRlIGJ5cGFzc2VzLCBhbmQgc3VzcGljaW91cyBwYXR0ZXJucy5cbiAgY29uc3QgZmlsZW5hbWVWYWxpZGF0aW9uID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoZmlsZW5hbWUpO1xuICBjb25zdCBjb250ZW50VmFsaWRhdGlvbiA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHJhd0NvbnRlbnQpO1xuICBjb25zdCBub3JtYWxpemVkRmlsZW5hbWUgPSBmaWxlbmFtZVZhbGlkYXRpb24ubm9ybWFsaXplZENvbnRlbnQ7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudFZhbGlkYXRpb24ubm9ybWFsaXplZENvbnRlbnQ7XG4gIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gZWxlbWVudFR5cGUubm9ybWFsaXplKCdORkMnKTtcbiAgY29uc3QgY2FjaGVLZXkgPSBidWlsZENvbnRlbnRDYWNoZUtleShub3JtYWxpemVkRmlsZW5hbWUsIG5vcm1hbGl6ZWRUeXBlLCByYXdDb250ZW50KTtcbiAgY29uc3QgY2FjaGVkUmVzdWx0ID0gQ09OVEVOVF9QSVBFTElORV9DQUNIRS5nZXQoY2FjaGVLZXkpO1xuICBpZiAoY2FjaGVkUmVzdWx0KSB7XG4gICAgcmV0dXJuIGNsb25lUGlwZWxpbmVSZXN1bHQoY2FjaGVkUmVzdWx0KTtcbiAgfVxuXG4gIGNvbnN0IGV4dCA9IGV4dG5hbWUobm9ybWFsaXplZEZpbGVuYW1lKTtcbiAgY29uc3QgaXNZYW1sID0gZXh0ID09PSAnLnlhbWwnIHx8IGV4dCA9PT0gJy55bWwnO1xuICBjb25zdCBjb250ZW50Q29udGV4dCA9IFRZUEVfVE9fQ09OVEVYVFtub3JtYWxpemVkVHlwZV07XG5cbiAgLy8gU3RlcCAxOiBQYXJzZSBhbmQgdmFsaWRhdGUgc3RydWN0dXJlIChZQU1MIGJvbWIgZGV0ZWN0aW9uLCBjaXJjdWxhciByZWZzKVxuICBsZXQgbWV0YWRhdGE6IEVsZW1lbnREaXNwbGF5TWV0YWRhdGEgPSB7fTtcbiAgbGV0IGJvZHkgPSAnJztcblxuICB0cnkge1xuICAgIGlmIChpc1lhbWwpIHtcbiAgICAgIC8vIFB1cmUgWUFNTCBmaWxlIChtZW1vcmllcykg4oCUIHVzZSBwYXJzZVJhd1lhbWwgZm9yIHN0cnVjdHVyYWwgdmFsaWRhdGlvblxuICAgICAgLy8gKGJvbWIgZGV0ZWN0aW9uLCBjaXJjdWxhciByZWZzLCBzaXplIGxpbWl0cykuXG4gICAgICAvLyBTa2lwIENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVZYW1sQ29udGVudCgpIOKAlCBpdCBwcm9kdWNlcyBmYWxzZSBwb3NpdGl2ZXNcbiAgICAgIC8vIG9uIG1lbW9yeSBjb250ZW50IHRoYXQgbGVnaXRpbWF0ZWx5IGNvbnRhaW5zIGNvZGUgcGF0dGVybnMsIHNlY3VyaXR5XG4gICAgICAvLyBrZXl3b3JkcywgYW5kIHRlY2huaWNhbCBkb2N1bWVudGF0aW9uLiBNZW1vcmllcyBhcmUgbG9jYWxseS1nZW5lcmF0ZWRcbiAgICAgIC8vIHRydXN0ZWQgY29udGVudCwgbm90IHVudHJ1c3RlZCBleHRlcm5hbCBzdWJtaXNzaW9ucy5cbiAgICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2VSYXdZYW1sKG5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICAgIG1ldGFkYXRhID0gKHR5cGVvZiBwYXJzZWQgPT09ICdvYmplY3QnICYmIHBhcnNlZCAhPT0gbnVsbCkgPyBwYXJzZWQgOiB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTWFya2Rvd24gd2l0aCBZQU1MIGZyb250bWF0dGVyXG4gICAgICBjb25zdCBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKG5vcm1hbGl6ZWRDb250ZW50LCB7IGNvbnRlbnRDb250ZXh0IH0pO1xuICAgICAgbWV0YWRhdGEgPSBwYXJzZWQuZGF0YTtcbiAgICAgIGJvZHkgPSBwYXJzZWQuY29udGVudDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnN0IHJlc3VsdDogUGlwZWxpbmVSZXN1bHQgPSB7XG4gICAgICB2YWxpZDogZmFsc2UsXG4gICAgICBjb250ZW50OiBub3JtYWxpemVkQ29udGVudCxcbiAgICAgIG1ldGFkYXRhOiB7fSxcbiAgICAgIGJvZHk6ICcnLFxuICAgICAgcmVqZWN0aW9uOiB7IHJlYXNvbjogYFBhcnNlIHZhbGlkYXRpb24gZmFpbGVkOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCwgc2V2ZXJpdHk6ICdoaWdoJyB9LFxuICAgIH07XG4gICAgLy8gQ2FjaGUgcGFyc2UgZmFpbHVyZXMgdG9vOiBzdGVhZHktc3RhdGUgcG9sbGluZyBjYW4gb3RoZXJ3aXNlIGtlZXAgcmVwYXJzaW5nXG4gICAgLy8gaWRlbnRpY2FsIG1hbGZvcm1lZCBmaWxlcyBmb3JldmVyLiBJZiB0aGUgZmlsZSBpcyBmaXhlZCwgdGhlIGNvbnRlbnQgaGFzaFxuICAgIC8vIGNoYW5nZXMgYW5kIHRoaXMgZW50cnkgaXMgbmF0dXJhbGx5IGJ5cGFzc2VkLlxuICAgIENPTlRFTlRfUElQRUxJTkVfQ0FDSEUuc2V0KGNhY2hlS2V5LCBjbG9uZVBpcGVsaW5lUmVzdWx0KHJlc3VsdCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBTdGVwIDI6IENvbnRlbnQgaW5qZWN0aW9uIHBhdHRlcm4gZGV0ZWN0aW9uIChtYXJrZG93biBlbGVtZW50cyBvbmx5KVxuICAvLyBZQU1MIG1lbW9yaWVzIHNraXAgdGhpcyDigJQgdGhleSBjb250YWluIGxlZ2l0aW1hdGUgY29kZSBwYXR0ZXJucyBhbmRcbiAgLy8gdGVjaG5pY2FsIGNvbnRlbnQgdGhhdCB0cmlnZ2VycyBmYWxzZSBwb3NpdGl2ZXMuIFRoZSBzdHJ1Y3R1cmFsIFlBTUxcbiAgLy8gcGFyc2luZyBhYm92ZSAoYm9tYi9jaXJjdWxhciByZWYgZGV0ZWN0aW9uKSBpcyBzdWZmaWNpZW50IGZvciBsb2NhbCBjb250ZW50LlxuICBpZiAoIWlzWWFtbCkge1xuICAgIGNvbnN0IHZhbGlkYXRpb246IENvbnRlbnRWYWxpZGF0aW9uUmVzdWx0ID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKG5vcm1hbGl6ZWRDb250ZW50LCB7XG4gICAgICBjb250ZW50Q29udGV4dCxcbiAgICB9KTtcblxuICAgIGlmICghdmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICBsb2dnZXIud2FybignW0NvbnRlbnRQaXBlbGluZV0gQ29udGVudCByZWplY3RlZCcsIHtcbiAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICBwYXR0ZXJuczogdmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zLFxuICAgICAgICBzZXZlcml0eTogdmFsaWRhdGlvbi5zZXZlcml0eSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0OiBQaXBlbGluZVJlc3VsdCA9IHtcbiAgICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgICBjb250ZW50OiBub3JtYWxpemVkQ29udGVudCxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIGJvZHksXG4gICAgICAgIHJlamVjdGlvbjoge1xuICAgICAgICAgIHJlYXNvbjogJ0NvbnRlbnQgZmFpbGVkIHNlY3VyaXR5IHZhbGlkYXRpb24nLFxuICAgICAgICAgIHNldmVyaXR5OiB2YWxpZGF0aW9uLnNldmVyaXR5LFxuICAgICAgICAgIHBhdHRlcm5zOiB2YWxpZGF0aW9uLmRldGVjdGVkUGF0dGVybnMsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgQ09OVEVOVF9QSVBFTElORV9DQUNIRS5zZXQoY2FjaGVLZXksIGNsb25lUGlwZWxpbmVSZXN1bHQocmVzdWx0KSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0ZXAgMzogUmV0dXJuIHZhbGlkYXRlZCBjb250ZW50XG4gIGNvbnN0IHJlc3VsdDogUGlwZWxpbmVSZXN1bHQgPSB7XG4gICAgdmFsaWQ6IHRydWUsXG4gICAgY29udGVudDogcmF3Q29udGVudCxcbiAgICBtZXRhZGF0YSxcbiAgICBib2R5LFxuICB9O1xuICBDT05URU5UX1BJUEVMSU5FX0NBQ0hFLnNldChjYWNoZUtleSwgY2xvbmVQaXBlbGluZVJlc3VsdChyZXN1bHQpKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
|