claude-code-sync 0.1.13 → 0.1.14
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/dist/cli.js +208 -28
- package/dist/index.d.ts +55 -24
- package/dist/index.js +169 -40
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -25,7 +25,7 @@ export interface SessionData {
|
|
|
25
25
|
gitRepo?: string;
|
|
26
26
|
model?: string;
|
|
27
27
|
startType?: "new" | "resume" | "continue";
|
|
28
|
-
endReason?: "user_stop" | "max_turns" | "error" | "completed";
|
|
28
|
+
endReason?: "user_stop" | "max_turns" | "error" | "completed" | "clear" | "logout" | "prompt_input_exit" | "other" | string;
|
|
29
29
|
thinkingEnabled?: boolean;
|
|
30
30
|
permissionMode?: string;
|
|
31
31
|
mcpServers?: string[];
|
|
@@ -39,6 +39,10 @@ export interface SessionData {
|
|
|
39
39
|
startedAt?: string;
|
|
40
40
|
endedAt?: string;
|
|
41
41
|
}
|
|
42
|
+
export interface MessagePart {
|
|
43
|
+
type: "text" | "tool-call" | "tool-result";
|
|
44
|
+
content: unknown;
|
|
45
|
+
}
|
|
42
46
|
export interface MessageData {
|
|
43
47
|
sessionId: string;
|
|
44
48
|
messageId: string;
|
|
@@ -49,6 +53,7 @@ export interface MessageData {
|
|
|
49
53
|
toolName?: string;
|
|
50
54
|
toolArgs?: Record<string, unknown>;
|
|
51
55
|
toolResult?: string;
|
|
56
|
+
parts?: MessagePart[];
|
|
52
57
|
durationMs?: number;
|
|
53
58
|
tokenCount?: number;
|
|
54
59
|
timestamp?: string;
|
|
@@ -71,46 +76,72 @@ export interface ClaudeCodeHooks {
|
|
|
71
76
|
SessionEnd?: (data: SessionEndEvent) => void | Promise<void>;
|
|
72
77
|
}
|
|
73
78
|
export interface SessionStartEvent {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
79
|
+
session_id: string;
|
|
80
|
+
transcript_path: string;
|
|
81
|
+
permission_mode: string;
|
|
82
|
+
hook_event_name: "SessionStart";
|
|
83
|
+
source: "startup" | "resume" | "clear" | "compact";
|
|
84
|
+
sessionId?: string;
|
|
85
|
+
cwd?: string;
|
|
86
|
+
model?: string;
|
|
87
|
+
startType?: "new" | "resume" | "continue";
|
|
78
88
|
thinkingEnabled?: boolean;
|
|
79
89
|
permissionMode?: string;
|
|
80
90
|
mcpServers?: string[];
|
|
81
91
|
}
|
|
82
92
|
export interface UserPromptEvent {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
93
|
+
session_id: string;
|
|
94
|
+
transcript_path: string;
|
|
95
|
+
permission_mode: string;
|
|
96
|
+
hook_event_name: "UserPromptSubmit";
|
|
97
|
+
prompt?: string;
|
|
98
|
+
sessionId?: string;
|
|
99
|
+
timestamp?: string;
|
|
86
100
|
}
|
|
87
101
|
export interface ToolUseEvent {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
102
|
+
session_id: string;
|
|
103
|
+
transcript_path: string;
|
|
104
|
+
tool_name: string;
|
|
105
|
+
permission_mode: string;
|
|
106
|
+
hook_event_name: "PostToolUse";
|
|
107
|
+
sessionId?: string;
|
|
108
|
+
toolName?: string;
|
|
109
|
+
args?: Record<string, unknown>;
|
|
110
|
+
result?: string;
|
|
111
|
+
success?: boolean;
|
|
112
|
+
durationMs?: number;
|
|
94
113
|
}
|
|
95
114
|
export interface StopEvent {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
115
|
+
session_id: string;
|
|
116
|
+
transcript_path: string;
|
|
117
|
+
permission_mode: string;
|
|
118
|
+
hook_event_name: "Stop";
|
|
119
|
+
stop_hook_active: boolean;
|
|
120
|
+
sessionId?: string;
|
|
121
|
+
response?: string;
|
|
122
|
+
tokenUsage?: {
|
|
99
123
|
input: number;
|
|
100
124
|
output: number;
|
|
101
125
|
};
|
|
102
|
-
durationMs
|
|
126
|
+
durationMs?: number;
|
|
127
|
+
model?: string;
|
|
103
128
|
}
|
|
104
129
|
export interface SessionEndEvent {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
130
|
+
session_id: string;
|
|
131
|
+
transcript_path: string;
|
|
132
|
+
cwd: string;
|
|
133
|
+
permission_mode: string;
|
|
134
|
+
hook_event_name: "SessionEnd";
|
|
135
|
+
reason: "clear" | "logout" | "prompt_input_exit" | "other";
|
|
136
|
+
sessionId?: string;
|
|
137
|
+
endReason?: string;
|
|
138
|
+
messageCount?: number;
|
|
139
|
+
toolCallCount?: number;
|
|
140
|
+
totalTokenUsage?: {
|
|
110
141
|
input: number;
|
|
111
142
|
output: number;
|
|
112
143
|
};
|
|
113
|
-
costEstimate
|
|
144
|
+
costEstimate?: number;
|
|
114
145
|
}
|
|
115
146
|
export declare function loadConfig(): Config | null;
|
|
116
147
|
export declare function saveConfig(config: Config): void;
|
package/dist/index.js
CHANGED
|
@@ -50,6 +50,114 @@ exports.createPlugin = createPlugin;
|
|
|
50
50
|
const fs = __importStar(require("fs"));
|
|
51
51
|
const path = __importStar(require("path"));
|
|
52
52
|
const os = __importStar(require("os"));
|
|
53
|
+
/**
|
|
54
|
+
* Parse transcript file to extract model, token usage, and stats
|
|
55
|
+
*/
|
|
56
|
+
function parseTranscript(transcriptPath) {
|
|
57
|
+
const stats = {
|
|
58
|
+
model: undefined,
|
|
59
|
+
inputTokens: 0,
|
|
60
|
+
cacheCreationTokens: 0,
|
|
61
|
+
cacheReadTokens: 0,
|
|
62
|
+
outputTokens: 0,
|
|
63
|
+
messageCount: 0,
|
|
64
|
+
toolCallCount: 0,
|
|
65
|
+
title: undefined,
|
|
66
|
+
cwd: undefined,
|
|
67
|
+
};
|
|
68
|
+
try {
|
|
69
|
+
if (!fs.existsSync(transcriptPath)) {
|
|
70
|
+
return stats;
|
|
71
|
+
}
|
|
72
|
+
const content = fs.readFileSync(transcriptPath, "utf-8");
|
|
73
|
+
const lines = content.trim().split("\n");
|
|
74
|
+
for (const line of lines) {
|
|
75
|
+
try {
|
|
76
|
+
const entry = JSON.parse(line);
|
|
77
|
+
// Get cwd and title from first entry that has them
|
|
78
|
+
if (!stats.cwd && entry.cwd) {
|
|
79
|
+
stats.cwd = entry.cwd;
|
|
80
|
+
}
|
|
81
|
+
if (!stats.title && entry.slug) {
|
|
82
|
+
stats.title = entry.slug;
|
|
83
|
+
}
|
|
84
|
+
// Count messages
|
|
85
|
+
if (entry.type === "user") {
|
|
86
|
+
stats.messageCount++;
|
|
87
|
+
}
|
|
88
|
+
// Extract model and tokens from assistant messages
|
|
89
|
+
if (entry.type === "assistant" && entry.message) {
|
|
90
|
+
if (entry.message.model && !stats.model) {
|
|
91
|
+
stats.model = entry.message.model;
|
|
92
|
+
}
|
|
93
|
+
if (entry.message.usage) {
|
|
94
|
+
const usage = entry.message.usage;
|
|
95
|
+
stats.inputTokens += usage.input_tokens || 0;
|
|
96
|
+
stats.cacheCreationTokens += usage.cache_creation_input_tokens || 0;
|
|
97
|
+
stats.cacheReadTokens += usage.cache_read_input_tokens || 0;
|
|
98
|
+
stats.outputTokens += usage.output_tokens || 0;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Count tool uses
|
|
102
|
+
if (entry.type === "assistant" && entry.message?.content) {
|
|
103
|
+
const msgContent = entry.message.content;
|
|
104
|
+
if (Array.isArray(msgContent)) {
|
|
105
|
+
for (const part of msgContent) {
|
|
106
|
+
if (part && typeof part === "object" && "type" in part && part.type === "tool_use") {
|
|
107
|
+
stats.toolCallCount++;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Skip malformed lines
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
console.error("[claude-code-sync] Error parsing transcript:", error);
|
|
120
|
+
}
|
|
121
|
+
return stats;
|
|
122
|
+
}
|
|
123
|
+
// ============================================================================
|
|
124
|
+
// Model Pricing & Cost Calculation
|
|
125
|
+
// ============================================================================
|
|
126
|
+
// Pricing per million tokens (USD) with cache pricing
|
|
127
|
+
// Source: https://www.anthropic.com/pricing
|
|
128
|
+
const MODEL_PRICING = {
|
|
129
|
+
"claude-sonnet-4-20250514": { input: 3.00, output: 15.00, cacheWrite: 3.75, cacheRead: 0.30 },
|
|
130
|
+
"claude-opus-4-20250514": { input: 15.00, output: 75.00, cacheWrite: 18.75, cacheRead: 1.50 },
|
|
131
|
+
"claude-opus-4-5-20251101": { input: 15.00, output: 75.00, cacheWrite: 18.75, cacheRead: 1.50 },
|
|
132
|
+
"claude-3-5-sonnet-20241022": { input: 3.00, output: 15.00, cacheWrite: 3.75, cacheRead: 0.30 },
|
|
133
|
+
"claude-3-opus-20240229": { input: 15.00, output: 75.00, cacheWrite: 18.75, cacheRead: 1.50 },
|
|
134
|
+
"claude-3-5-haiku-20241022": { input: 0.80, output: 4.00, cacheWrite: 1.00, cacheRead: 0.08 },
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* Calculate cost from model and token usage with proper cache pricing
|
|
138
|
+
* Returns 0 if model is unknown or pricing not available
|
|
139
|
+
*/
|
|
140
|
+
function calculateCost(model, stats) {
|
|
141
|
+
if (!model)
|
|
142
|
+
return 0;
|
|
143
|
+
// Try exact match first
|
|
144
|
+
let pricing = MODEL_PRICING[model];
|
|
145
|
+
// Try partial match if exact match fails
|
|
146
|
+
if (!pricing) {
|
|
147
|
+
const matchingKey = Object.keys(MODEL_PRICING).find(k => model.includes(k) || k.includes(model));
|
|
148
|
+
if (matchingKey) {
|
|
149
|
+
pricing = MODEL_PRICING[matchingKey];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (!pricing)
|
|
153
|
+
return 0;
|
|
154
|
+
// Calculate cost with proper cache pricing
|
|
155
|
+
const inputCost = stats.inputTokens * pricing.input;
|
|
156
|
+
const cacheWriteCost = stats.cacheCreationTokens * pricing.cacheWrite;
|
|
157
|
+
const cacheReadCost = stats.cacheReadTokens * pricing.cacheRead;
|
|
158
|
+
const outputCost = stats.outputTokens * pricing.output;
|
|
159
|
+
return (inputCost + cacheWriteCost + cacheReadCost + outputCost) / 1_000_000;
|
|
160
|
+
}
|
|
53
161
|
// ============================================================================
|
|
54
162
|
// Configuration
|
|
55
163
|
// ============================================================================
|
|
@@ -306,24 +414,28 @@ function createPlugin() {
|
|
|
306
414
|
SessionStart: async (event) => {
|
|
307
415
|
messageCounter = 0;
|
|
308
416
|
toolCallCounter = 0;
|
|
417
|
+
// Use session_id (new) or sessionId (legacy)
|
|
418
|
+
const sessionId = event.session_id || event.sessionId || "";
|
|
419
|
+
const cwd = event.cwd;
|
|
420
|
+
const permissionMode = event.permission_mode || event.permissionMode;
|
|
309
421
|
const session = {
|
|
310
|
-
sessionId
|
|
422
|
+
sessionId,
|
|
311
423
|
source: "claude-code",
|
|
312
|
-
cwd
|
|
424
|
+
cwd,
|
|
313
425
|
model: event.model,
|
|
314
426
|
startType: event.startType,
|
|
315
427
|
thinkingEnabled: event.thinkingEnabled,
|
|
316
|
-
permissionMode
|
|
428
|
+
permissionMode,
|
|
317
429
|
mcpServers: event.mcpServers,
|
|
318
430
|
startedAt: new Date().toISOString(),
|
|
319
431
|
};
|
|
320
432
|
// Extract project info from cwd
|
|
321
|
-
if (
|
|
322
|
-
session.projectPath =
|
|
323
|
-
session.projectName = path.basename(
|
|
433
|
+
if (cwd) {
|
|
434
|
+
session.projectPath = cwd;
|
|
435
|
+
session.projectName = path.basename(cwd);
|
|
324
436
|
// Try to get git info
|
|
325
437
|
try {
|
|
326
|
-
const gitDir = path.join(
|
|
438
|
+
const gitDir = path.join(cwd, ".git");
|
|
327
439
|
if (fs.existsSync(gitDir)) {
|
|
328
440
|
const headFile = path.join(gitDir, "HEAD");
|
|
329
441
|
if (fs.existsSync(headFile)) {
|
|
@@ -338,7 +450,7 @@ function createPlugin() {
|
|
|
338
450
|
// Ignore git errors
|
|
339
451
|
}
|
|
340
452
|
}
|
|
341
|
-
client.updateSessionState(
|
|
453
|
+
client.updateSessionState(sessionId, session);
|
|
342
454
|
await client.syncSession(session);
|
|
343
455
|
},
|
|
344
456
|
/**
|
|
@@ -346,12 +458,14 @@ function createPlugin() {
|
|
|
346
458
|
*/
|
|
347
459
|
UserPromptSubmit: async (event) => {
|
|
348
460
|
messageCounter++;
|
|
461
|
+
const sessionId = event.session_id || event.sessionId || "";
|
|
462
|
+
const prompt = event.prompt || "";
|
|
349
463
|
const message = {
|
|
350
|
-
sessionId
|
|
351
|
-
messageId: `${
|
|
464
|
+
sessionId,
|
|
465
|
+
messageId: `${sessionId}-msg-${messageCounter}`,
|
|
352
466
|
source: "claude-code",
|
|
353
467
|
role: "user",
|
|
354
|
-
content:
|
|
468
|
+
content: prompt,
|
|
355
469
|
timestamp: event.timestamp || new Date().toISOString(),
|
|
356
470
|
};
|
|
357
471
|
await client.syncMessage(message);
|
|
@@ -364,12 +478,14 @@ function createPlugin() {
|
|
|
364
478
|
return;
|
|
365
479
|
toolCallCounter++;
|
|
366
480
|
messageCounter++;
|
|
481
|
+
const sessionId = event.session_id || event.sessionId || "";
|
|
482
|
+
const toolName = event.tool_name || event.toolName || "unknown";
|
|
367
483
|
const message = {
|
|
368
|
-
sessionId
|
|
369
|
-
messageId: `${
|
|
484
|
+
sessionId,
|
|
485
|
+
messageId: `${sessionId}-tool-${toolCallCounter}`,
|
|
370
486
|
source: "claude-code",
|
|
371
487
|
role: "assistant",
|
|
372
|
-
toolName
|
|
488
|
+
toolName,
|
|
373
489
|
toolArgs: event.args,
|
|
374
490
|
toolResult: event.result,
|
|
375
491
|
durationMs: event.durationMs,
|
|
@@ -381,38 +497,51 @@ function createPlugin() {
|
|
|
381
497
|
* Called when Claude stops responding
|
|
382
498
|
*/
|
|
383
499
|
Stop: async (event) => {
|
|
384
|
-
|
|
385
|
-
const
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
500
|
+
const sessionId = event.session_id || event.sessionId || "";
|
|
501
|
+
const tokenUsage = event.tokenUsage || { input: 0, output: 0 };
|
|
502
|
+
// Only create message if we have response content
|
|
503
|
+
if (event.response) {
|
|
504
|
+
messageCounter++;
|
|
505
|
+
const message = {
|
|
506
|
+
sessionId,
|
|
507
|
+
messageId: `${sessionId}-msg-${messageCounter}`,
|
|
508
|
+
source: "claude-code",
|
|
509
|
+
role: "assistant",
|
|
510
|
+
content: event.response,
|
|
511
|
+
model: event.model,
|
|
512
|
+
tokenCount: tokenUsage.input + tokenUsage.output,
|
|
513
|
+
durationMs: event.durationMs,
|
|
514
|
+
timestamp: new Date().toISOString(),
|
|
515
|
+
};
|
|
516
|
+
await client.syncMessage(message);
|
|
517
|
+
}
|
|
395
518
|
// Update session state with token usage
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
519
|
+
if (tokenUsage.input > 0 || tokenUsage.output > 0) {
|
|
520
|
+
const currentState = client.getSessionState(sessionId);
|
|
521
|
+
const currentTokens = currentState.tokenUsage || { input: 0, output: 0 };
|
|
522
|
+
client.updateSessionState(sessionId, {
|
|
523
|
+
tokenUsage: {
|
|
524
|
+
input: currentTokens.input + tokenUsage.input,
|
|
525
|
+
output: currentTokens.output + tokenUsage.output,
|
|
526
|
+
},
|
|
527
|
+
});
|
|
528
|
+
}
|
|
405
529
|
},
|
|
406
530
|
/**
|
|
407
531
|
* Called when session ends
|
|
408
532
|
*/
|
|
409
533
|
SessionEnd: async (event) => {
|
|
410
|
-
const
|
|
534
|
+
const sessionId = event.session_id || event.sessionId || "";
|
|
535
|
+
const currentState = client.getSessionState(sessionId);
|
|
536
|
+
const endReason = event.reason || event.endReason;
|
|
411
537
|
const session = {
|
|
412
538
|
...currentState,
|
|
413
|
-
sessionId
|
|
539
|
+
sessionId,
|
|
414
540
|
source: "claude-code",
|
|
415
|
-
|
|
541
|
+
cwd: event.cwd,
|
|
542
|
+
projectPath: event.cwd,
|
|
543
|
+
projectName: event.cwd ? path.basename(event.cwd) : undefined,
|
|
544
|
+
endReason,
|
|
416
545
|
messageCount: event.messageCount,
|
|
417
546
|
toolCallCount: event.toolCallCount,
|
|
418
547
|
tokenUsage: event.totalTokenUsage,
|
|
@@ -420,11 +549,11 @@ function createPlugin() {
|
|
|
420
549
|
endedAt: new Date().toISOString(),
|
|
421
550
|
};
|
|
422
551
|
await client.syncSession(session);
|
|
423
|
-
client.clearSessionState(
|
|
424
|
-
console.log(`[claude-code-sync] Session synced: ${event.messageCount} messages, ${event.toolCallCount} tool calls`);
|
|
552
|
+
client.clearSessionState(sessionId);
|
|
553
|
+
console.log(`[claude-code-sync] Session synced: ${event.messageCount || 0} messages, ${event.toolCallCount || 0} tool calls`);
|
|
425
554
|
},
|
|
426
555
|
};
|
|
427
556
|
}
|
|
428
557
|
// Default export for Claude Code plugin system
|
|
429
558
|
exports.default = createPlugin;
|
|
430
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxSUgsZ0NBNEJDO0FBRUQsZ0NBVUM7QUFFRCxrQ0FRQztBQXdNRCxvQ0FxS0M7QUFsaUJELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsdUNBQXlCO0FBMEh6QiwrRUFBK0U7QUFDL0UsZ0JBQWdCO0FBQ2hCLCtFQUErRTtBQUUvRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztBQUMxRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUV6RCxTQUFnQixVQUFVO0lBQ3hCLG9DQUFvQztJQUNwQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDO0lBQ2xELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUM7SUFFL0MsSUFBSSxNQUFNLElBQUksTUFBTSxFQUFFLENBQUM7UUFDckIsT0FBTztZQUNMLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7WUFDckMsTUFBTSxFQUFFLE1BQU07WUFDZCxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsS0FBSyxPQUFPO1lBQ3ZELGFBQWEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixLQUFLLE9BQU87WUFDN0QsWUFBWSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEtBQUssTUFBTTtTQUMxRCxDQUFDO0lBQ0osQ0FBQztJQUVELDJCQUEyQjtJQUMzQixJQUFJLENBQUM7UUFDSCxJQUFJLEVB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TSxFQUFFLGFBQWE7Z0JBQ3JCLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDMUIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO2dCQUNoQyxhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWE7Z0JBQ2xDLFVBQVUsRUFBRSxLQUFLLENBQUMsZUFBZTtnQkFDakMsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO2dCQUNoQyxPQUFPLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7YUFDbEMsQ0FBQztZQUVGLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRTFDLE9BQU8sQ0FBQyxHQUFHLENBQ1Qsc0NBQXNDLEtBQUssQ0FBQyxZQUFZLGNBQWMsS0FBSyxDQUFDLGFBQWEsYUFBYSxDQUN2RyxDQUFDO1FBQ0osQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsK0NBQStDO0FBQy9DLGtCQUFlLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2xhdWRlIENvZGUgU3luYyBQbHVnaW5cbiAqXG4gKiBTeW5jcyBDbGF1ZGUgQ29kZSBzZXNzaW9ucyB0byBPcGVuU3luYyBkYXNoYm9hcmQuXG4gKiBVc2VzIEFQSSBLZXkgYXV0aGVudGljYXRpb24gKG5vIGJyb3dzZXIgT0F1dGggcmVxdWlyZWQpLlxuICpcbiAqIEluc3RhbGw6IG5wbSBpbnN0YWxsIC1nIGNsYXVkZS1jb2RlLXN5bmNcbiAqIENvbmZpZ3VyZTogY2xhdWRlLWNvZGUtc3luYyBsb2dpblxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm9zXCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFR5cGVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnIHtcbiAgY29udmV4VXJsOiBzdHJpbmc7XG4gIGFwaUtleTogc3RyaW5nO1xuICBhdXRvU3luYz86IGJvb2xlYW47XG4gIHN5bmNUb29sQ2FsbHM/OiBib29sZWFuO1xuICBzeW5jVGhpbmtpbmc/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb25EYXRhIHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHNvdXJjZTogXCJjbGF1ZGUtY29kZVwiO1xuICB0aXRsZT86IHN0cmluZztcbiAgcHJvamVjdFBhdGg/OiBzdHJpbmc7XG4gIHByb2plY3ROYW1lPzogc3RyaW5nO1xuICBjd2Q/OiBzdHJpbmc7XG4gIGdpdEJyYW5jaD86IHN0cmluZztcbiAgZ2l0UmVwbz86IHN0cmluZztcbiAgbW9kZWw/OiBzdHJpbmc7XG4gIHN0YXJ0VHlwZT86IFwibmV3XCIgfCBcInJlc3VtZVwiIHwgXCJjb250aW51ZVwiO1xuICBlbmRSZWFzb24/OiBcInVzZXJfc3RvcFwiIHwgXCJtYXhfdHVybnNcIiB8IFwiZXJyb3JcIiB8IFwiY29tcGxldGVkXCI7XG4gIHRoaW5raW5nRW5hYmxlZD86IGJvb2xlYW47XG4gIHBlcm1pc3Npb25Nb2RlPzogc3RyaW5nO1xuICBtY3BTZXJ2ZXJzPzogc3RyaW5nW107XG4gIG1lc3NhZ2VDb3VudD86IG51bWJlcjtcbiAgdG9vbENhbGxDb3VudD86IG51bWJlcjtcbiAgdG9rZW5Vc2FnZT86IHtcbiAgICBpbnB1dDogbnVtYmVyO1xuICAgIG91dHB1dDogbnVtYmVyO1xuICB9O1xuICBjb3N0RXN0aW1hdGU/OiBudW1iZXI7XG4gIHN0YXJ0ZWRBdD86IHN0cmluZztcbiAgZW5kZWRBdD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlRGF0YSB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBtZXNzYWdlSWQ6IHN0cmluZztcbiAgc291cmNlOiBcImNsYXVkZS1jb2RlXCI7XG4gIHJvbGU6IFwidXNlclwiIHwgXCJhc3Npc3RhbnRcIiB8IFwic3lzdGVtXCI7XG4gIGNvbnRlbnQ/OiBzdHJpbmc7XG4gIHRoaW5raW5nQ29udGVudD86IHN0cmluZztcbiAgdG9vbE5hbWU/OiBzdHJpbmc7XG4gIHRvb2xBcmdzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHRvb2xSZXN1bHQ/OiBzdHJpbmc7XG4gIGR1cmF0aW9uTXM/OiBudW1iZXI7XG4gIHRva2VuQ291bnQ/OiBudW1iZXI7XG4gIHRpbWVzdGFtcD86IHN0cmluZztcbiAgbW9kZWw/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbFVzZURhdGEge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgdG9vbE5hbWU6IHN0cmluZztcbiAgdG9vbEFyZ3M/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmVzdWx0Pzogc3RyaW5nO1xuICBzdWNjZXNzPzogYm9vbGVhbjtcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgdGltZXN0YW1wPzogc3RyaW5nO1xufVxuXG4vLyBDbGF1ZGUgQ29kZSBIb29rIFR5cGVzXG5leHBvcnQgaW50ZXJmYWNlIENsYXVkZUNvZGVIb29rcyB7XG4gIFNlc3Npb25TdGFydD86IChkYXRhOiBTZXNzaW9uU3RhcnRFdmVudCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIFVzZXJQcm9tcHRTdWJtaXQ/OiAoZGF0YTogVXNlclByb21wdEV2ZW50KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgUG9zdFRvb2xVc2U/OiAoZGF0YTogVG9vbFVzZUV2ZW50KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgU3RvcD86IChkYXRhOiBTdG9wRXZlbnQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBTZXNzaW9uRW5kPzogKGRhdGE6IFNlc3Npb25FbmRFdmVudCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvblN0YXJ0RXZlbnQge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgY3dkOiBzdHJpbmc7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIHN0YXJ0VHlwZTogXCJuZXdcIiB8IFwicmVzdW1lXCIgfCBcImNvbnRpbnVlXCI7XG4gIHRoaW5raW5nRW5hYmxlZD86IGJvb2xlYW47XG4gIHBlcm1pc3Npb25Nb2RlPzogc3RyaW5nO1xuICBtY3BTZXJ2ZXJzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclByb21wdEV2ZW50IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHByb21wdDogc3RyaW5nO1xuICB0aW1lc3RhbXA6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb29sVXNlRXZlbnQge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgdG9vbE5hbWU6IHN0cmluZztcbiAgYXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJlc3VsdDogc3RyaW5nO1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBkdXJhdGlvbk1zOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcEV2ZW50IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHJlc3BvbnNlOiBzdHJpbmc7XG4gIHRva2VuVXNhZ2U6IHtcbiAgICBpbnB1dDogbnVtYmVyO1xuICAgIG91dHB1dDogbnVtYmVyO1xuICB9O1xuICBkdXJhdGlvbk1zOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvbkVuZEV2ZW50IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIGVuZFJlYXNvbjogXCJ1c2VyX3N0b3BcIiB8IFwibWF4X3R1cm5zXCIgfCBcImVycm9yXCIgfCBcImNvbXBsZXRlZFwiO1xuICBtZXNzYWdlQ291bnQ6IG51bWJlcjtcbiAgdG9vbENhbGxDb3VudDogbnVtYmVyO1xuICB0b3RhbFRva2VuVXNhZ2U6IHtcbiAgICBpbnB1dDogbnVtYmVyO1xuICAgIG91dHB1dDogbnVtYmVyO1xuICB9O1xuICBjb3N0RXN0aW1hdGU6IG51bWJlcjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29uZmlndXJhdGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5jb25zdCBDT05GSUdfRElSID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgXCIuY29uZmlnXCIsIFwiY2xhdWRlLWNvZGUtc3luY1wiKTtcbmNvbnN0IENPTkZJR19GSUxFID0gcGF0aC5qb2luKENPTkZJR19ESVIsIFwiY29uZmlnLmpzb25cIik7XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQ29uZmlnKCk6IENvbmZpZyB8IG51bGwge1xuICAvLyBDaGVjayBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZmlyc3RcbiAgY29uc3QgZW52VXJsID0gcHJvY2Vzcy5lbnYuQ0xBVURFX1NZTkNfQ09OVkVYX1VSTDtcbiAgY29uc3QgZW52S2V5ID0gcHJvY2Vzcy5lbnYuQ0xBVURFX1NZTkNfQVBJX0tFWTtcblxuICBpZiAoZW52VXJsICYmIGVudktleSkge1xuICAgIHJldHVybiB7XG4gICAgICBjb252ZXhVcmw6IG5vcm1hbGl6ZUNvbnZleFVybChlbnZVcmwpLFxuICAgICAgYXBpS2V5OiBlbnZLZXksXG4gICAgICBhdXRvU3luYzogcHJvY2Vzcy5lbnYuQ0xBVURFX1NZTkNfQVVUT19TWU5DICE9PSBcImZhbHNlXCIsXG4gICAgICBzeW5jVG9vbENhbGxzOiBwcm9jZXNzLmVudi5DTEFVREVfU1lOQ19UT09MX0NBTExTICE9PSBcImZhbHNlXCIsXG4gICAgICBzeW5jVGhpbmtpbmc6IHByb2Nlc3MuZW52LkNMQVVERV9TWU5DX1RISU5LSU5HID09PSBcInRydWVcIixcbiAgICB9O1xuICB9XG5cbiAgLy8gRmFsbCBiYWNrIHRvIGNvbmZpZyBmaWxlXG4gIHRyeSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoQ09ORklHX0ZJTEUpKSB7XG4gICAgICBjb25zdCBkYXRhID0gZnMucmVhZEZpbGVTeW5jKENPTkZJR19GSUxFLCBcInV0Zi04XCIpO1xuICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShkYXRhKSBhcyBDb25maWc7XG4gICAgICBjb25maWcuY29udmV4VXJsID0gbm9ybWFsaXplQ29udmV4VXJsKGNvbmZpZy5jb252ZXhVcmwpO1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGxvYWRpbmcgY29uZmlnOlwiLCBlcnJvcik7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhdmVDb25maWcoY29uZmlnOiBDb25maWcpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoQ09ORklHX0RJUikpIHtcbiAgICAgIGZzLm1rZGlyU3luYyhDT05GSUdfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgZnMud3JpdGVGaWxlU3luYyhDT05GSUdfRklMRSwgSlNPTi5zdHJpbmdpZnkoY29uZmlnLCBudWxsLCAyKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIHNhdmluZyBjb25maWc6XCIsIGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDb25maWcoKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoQ09ORklHX0ZJTEUpKSB7XG4gICAgICBmcy51bmxpbmtTeW5jKENPTkZJR19GSUxFKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGNsZWFyaW5nIGNvbmZpZzpcIiwgZXJyb3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbnZleFVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIENvbnZlcnQgLmNvbnZleC5jbG91ZCB0byAuY29udmV4LnNpdGUgZm9yIEFQSSBjYWxsc1xuICByZXR1cm4gdXJsLnJlcGxhY2UoXCIuY29udmV4LmNsb3VkXCIsIFwiLmNvbnZleC5zaXRlXCIpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTeW5jIENsaWVudFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY2xhc3MgU3luY0NsaWVudCB7XG4gIHByaXZhdGUgY29uZmlnOiBDb25maWc7XG4gIHByaXZhdGUgc2l0ZVVybDogc3RyaW5nO1xuICBwcml2YXRlIHNlc3Npb25DYWNoZTogTWFwPHN0cmluZywgUGFydGlhbDxTZXNzaW9uRGF0YT4+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgLy8gTm9ybWFsaXplIFVSTCB0byAuY29udmV4LnNpdGUgZm9yIEhUVFAgZW5kcG9pbnRzXG4gICAgLy8gU3VwcG9ydHMgYm90aCAuY29udmV4LmNsb3VkIGFuZCAuY29udmV4LnNpdGUgaW5wdXQgVVJMc1xuICAgIHRoaXMuc2l0ZVVybCA9IGNvbmZpZy5jb252ZXhVcmwucmVwbGFjZShcIi5jb252ZXguY2xvdWRcIiwgXCIuY29udmV4LnNpdGVcIik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlcXVlc3QoZW5kcG9pbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuc2l0ZVVybH0ke2VuZHBvaW50fWA7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy5hcGlLZXl9YCxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c30gLSAke3RleHR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgfVxuXG4gIC8vIFRyYW5zZm9ybSBzZXNzaW9uIGRhdGEgdG8gYmFja2VuZCBmb3JtYXRcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1TZXNzaW9uKHNlc3Npb246IFNlc3Npb25EYXRhKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgZXh0ZXJuYWxJZDogc2Vzc2lvbi5zZXNzaW9uSWQsXG4gICAgICBzb3VyY2U6IHNlc3Npb24uc291cmNlLFxuICAgIH07XG4gICAgXG4gICAgLy8gT25seSBpbmNsdWRlIGZpZWxkcyB0aGF0IGFyZSBkZWZpbmVkXG4gICAgaWYgKHNlc3Npb24udGl0bGUgIT09IHVuZGVmaW5lZCkgcGF5bG9hZC50aXRsZSA9IHNlc3Npb24udGl0bGU7XG4gICAgaWYgKHNlc3Npb24ucHJvamVjdFBhdGggfHwgc2Vzc2lvbi5jd2QpIHBheWxvYWQucHJvamVjdFBhdGggPSBzZXNzaW9uLnByb2plY3RQYXRoIHx8IHNlc3Npb24uY3dkO1xuICAgIGlmIChzZXNzaW9uLnByb2plY3ROYW1lKSBwYXlsb2FkLnByb2plY3ROYW1lID0gc2Vzc2lvbi5wcm9qZWN0TmFtZTtcbiAgICBpZiAoc2Vzc2lvbi5tb2RlbCkgcGF5bG9hZC5tb2RlbCA9IHNlc3Npb24ubW9kZWw7XG4gICAgaWYgKHNlc3Npb24udG9rZW5Vc2FnZT8uaW5wdXQgIT09IHVuZGVmaW5lZCkgcGF5bG9hZC5wcm9tcHRUb2tlbnMgPSBzZXNzaW9uLnRva2VuVXNhZ2UuaW5wdXQ7XG4gICAgaWYgKHNlc3Npb24udG9rZW5Vc2FnZT8ub3V0cHV0ICE9PSB1bmRlZmluZWQpIHBheWxvYWQuY29tcGxldGlvblRva2VucyA9IHNlc3Npb24udG9rZW5Vc2FnZS5vdXRwdXQ7XG4gICAgaWYgKHNlc3Npb24uY29zdEVzdGltYXRlICE9PSB1bmRlZmluZWQpIHBheWxvYWQuY29zdCA9IHNlc3Npb24uY29zdEVzdGltYXRlO1xuICAgIGlmIChzZXNzaW9uLm1lc3NhZ2VDb3VudCAhPT0gdW5kZWZpbmVkKSBwYXlsb2FkLm1lc3NhZ2VDb3VudCA9IHNlc3Npb24ubWVzc2FnZUNvdW50O1xuICAgIGlmIChzZXNzaW9uLnRvb2xDYWxsQ291bnQgIT09IHVuZGVmaW5lZCkgcGF5bG9hZC50b29sQ2FsbENvdW50ID0gc2Vzc2lvbi50b29sQ2FsbENvdW50O1xuICAgIGlmIChzZXNzaW9uLmVuZFJlYXNvbikgcGF5bG9hZC5lbmRSZWFzb24gPSBzZXNzaW9uLmVuZFJlYXNvbjtcbiAgICBcbiAgICAvLyBDYWxjdWxhdGUgZHVyYXRpb24gaWYgYm90aCB0aW1lc3RhbXBzIGV4aXN0XG4gICAgaWYgKHNlc3Npb24uZW5kZWRBdCAmJiBzZXNzaW9uLnN0YXJ0ZWRBdCkge1xuICAgICAgcGF5bG9hZC5kdXJhdGlvbk1zID0gbmV3IERhdGUoc2Vzc2lvbi5lbmRlZEF0KS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShzZXNzaW9uLnN0YXJ0ZWRBdCkuZ2V0VGltZSgpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gcGF5bG9hZDtcbiAgfVxuXG4gIC8vIFRyYW5zZm9ybSBtZXNzYWdlIGRhdGEgdG8gYmFja2VuZCBmb3JtYXRcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1NZXNzYWdlKG1lc3NhZ2U6IE1lc3NhZ2VEYXRhKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgc2Vzc2lvbkV4dGVybmFsSWQ6IG1lc3NhZ2Uuc2Vzc2lvbklkLFxuICAgICAgZXh0ZXJuYWxJZDogbWVzc2FnZS5tZXNzYWdlSWQsXG4gICAgICByb2xlOiBtZXNzYWdlLnJvbGUsXG4gICAgICBzb3VyY2U6IG1lc3NhZ2Uuc291cmNlLFxuICAgIH07XG4gICAgXG4gICAgLy8gU2V0IHRleHRDb250ZW50IGZvciB1c2VyIHByb21wdHMgYW5kIGFzc2lzdGFudCByZXNwb25zZXNcbiAgICBpZiAobWVzc2FnZS5jb250ZW50KSB7XG4gICAgICBwYXlsb2FkLnRleHRDb250ZW50ID0gbWVzc2FnZS5jb250ZW50O1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50b29sUmVzdWx0ICYmICFtZXNzYWdlLnRvb2xOYW1lKSB7XG4gICAgICAvLyBPbmx5IHVzZSB0b29sUmVzdWx0IGFzIHRleHRDb250ZW50IGlmIG5vIHRvb2xOYW1lIChmYWxsYmFjaylcbiAgICAgIHBheWxvYWQudGV4dENvbnRlbnQgPSBtZXNzYWdlLnRvb2xSZXN1bHQ7XG4gICAgfVxuICAgIFxuICAgIC8vIEluY2x1ZGUgZHVyYXRpb24gaWYgYXZhaWxhYmxlXG4gICAgaWYgKG1lc3NhZ2UuZHVyYXRpb25NcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXlsb2FkLmR1cmF0aW9uTXMgPSBtZXNzYWdlLmR1cmF0aW9uTXM7XG4gICAgfVxuICAgIFxuICAgIC8vIEluY2x1ZGUgdG9rZW4gY291bnQgaWYgYXZhaWxhYmxlXG4gICAgaWYgKG1lc3NhZ2UudG9rZW5Db3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXlsb2FkLnByb21wdFRva2VucyA9IG1lc3NhZ2UudG9rZW5Db3VudDtcbiAgICB9XG4gICAgXG4gICAgLy8gSW5jbHVkZSBtb2RlbCBpZiBhdmFpbGFibGVcbiAgICBpZiAobWVzc2FnZS5tb2RlbCkge1xuICAgICAgcGF5bG9hZC5tb2RlbCA9IG1lc3NhZ2UubW9kZWw7XG4gICAgfVxuICAgIFxuICAgIC8vIFRvb2wgdXNlIGluZm8gc3RvcmVkIGluIHBhcnRzXG4gICAgaWYgKG1lc3NhZ2UudG9vbE5hbWUpIHtcbiAgICAgIHBheWxvYWQucGFydHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgIHRvb2xOYW1lOiBtZXNzYWdlLnRvb2xOYW1lLFxuICAgICAgICAgICAgYXJnczogbWVzc2FnZS50b29sQXJncyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIC8vIEFkZCB0b29sIHJlc3VsdCBhcyBzZXBhcmF0ZSBwYXJ0XG4gICAgICBpZiAobWVzc2FnZS50b29sUmVzdWx0KSB7XG4gICAgICAgIChwYXlsb2FkLnBhcnRzIGFzIEFycmF5PHsgdHlwZTogc3RyaW5nOyBjb250ZW50OiB1bmtub3duIH0+KS5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgY29udGVudDogbWVzc2FnZS50b29sUmVzdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICBhc3luYyBzeW5jU2Vzc2lvbihzZXNzaW9uOiBTZXNzaW9uRGF0YSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy50cmFuc2Zvcm1TZXNzaW9uKHNlc3Npb24pO1xuICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0KFwiL3N5bmMvc2Vzc2lvblwiLCBwYXlsb2FkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBzeW5jIHNlc3Npb246XCIsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN5bmNNZXNzYWdlKG1lc3NhZ2U6IE1lc3NhZ2VEYXRhKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLnRyYW5zZm9ybU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoXCIvc3luYy9tZXNzYWdlXCIsIHBheWxvYWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHN5bmMgbWVzc2FnZTpcIiwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3luY0JhdGNoKFxuICAgIHNlc3Npb25zOiBTZXNzaW9uRGF0YVtdLFxuICAgIG1lc3NhZ2VzOiBNZXNzYWdlRGF0YVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lZFNlc3Npb25zID0gc2Vzc2lvbnMubWFwKChzKSA9PiB0aGlzLnRyYW5zZm9ybVNlc3Npb24ocykpO1xuICAgICAgY29uc3QgdHJhbnNmb3JtZWRNZXNzYWdlcyA9IG1lc3NhZ2VzLm1hcCgobSkgPT4gdGhpcy50cmFuc2Zvcm1NZXNzYWdlKG0pKTtcbiAgICAgIGF3YWl0IHRoaXMucmVxdWVzdChcIi9zeW5jL2JhdGNoXCIsIHtcbiAgICAgICAgc2Vzc2lvbnM6IHRyYW5zZm9ybWVkU2Vzc2lvbnMsXG4gICAgICAgIG1lc3NhZ2VzOiB0cmFuc2Zvcm1lZE1lc3NhZ2VzLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gc3luYyBiYXRjaDpcIiwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdGVzdENvbm5lY3Rpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuc2l0ZVVybH0vaGVhbHRoYDtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5vaztcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXNzaW9uIHN0YXRlIG1hbmFnZW1lbnRcbiAgZ2V0U2Vzc2lvblN0YXRlKHNlc3Npb25JZDogc3RyaW5nKTogUGFydGlhbDxTZXNzaW9uRGF0YT4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25DYWNoZS5nZXQoc2Vzc2lvbklkKSB8fCB7fTtcbiAgfVxuXG4gIHVwZGF0ZVNlc3Npb25TdGF0ZShcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICB1cGRhdGVzOiBQYXJ0aWFsPFNlc3Npb25EYXRhPlxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5zZXNzaW9uQ2FjaGUuZ2V0KHNlc3Npb25JZCkgfHwge307XG4gICAgdGhpcy5zZXNzaW9uQ2FjaGUuc2V0KHNlc3Npb25JZCwgeyAuLi5jdXJyZW50LCAuLi51cGRhdGVzIH0pO1xuICB9XG5cbiAgY2xlYXJTZXNzaW9uU3RhdGUoc2Vzc2lvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlc3Npb25DYWNoZS5kZWxldGUoc2Vzc2lvbklkKTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQbHVnaW4gRXhwb3J0XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2xhdWRlIENvZGUgUGx1Z2luIEVudHJ5IFBvaW50XG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQ2xhdWRlIENvZGUgdG8gcmVnaXN0ZXIgdGhlIHBsdWdpbi5cbiAqIEl0IHJldHVybnMgaG9vayBoYW5kbGVycyB0aGF0IGZpcmUgYXQga2V5IHBvaW50cyBpbiB0aGUgc2Vzc2lvbiBsaWZlY3ljbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQbHVnaW4oKTogQ2xhdWRlQ29kZUhvb2tzIHwgbnVsbCB7XG4gIGNvbnN0IGNvbmZpZyA9IGxvYWRDb25maWcoKTtcblxuICBpZiAoIWNvbmZpZykge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgXCJbY2xhdWRlLWNvZGUtc3luY10gTm90IGNvbmZpZ3VyZWQuIFJ1biAnY2xhdWRlLWNvZGUtc3luYyBsb2dpbicgdG8gc2V0IHVwLlwiXG4gICAgKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChjb25maWcuYXV0b1N5bmMgPT09IGZhbHNlKSB7XG4gICAgY29uc29sZS5sb2coXCJbY2xhdWRlLWNvZGUtc3luY10gQXV0by1zeW5jIGRpc2FibGVkIGluIGNvbmZpZy5cIik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBjbGllbnQgPSBuZXcgU3luY0NsaWVudChjb25maWcpO1xuICBsZXQgbWVzc2FnZUNvdW50ZXIgPSAwO1xuICBsZXQgdG9vbENhbGxDb3VudGVyID0gMDtcblxuICBjb25zb2xlLmxvZyhcIltjbGF1ZGUtY29kZS1zeW5jXSBQbHVnaW4gbG9hZGVkLiBTZXNzaW9ucyB3aWxsIHN5bmMgdG8gT3BlblN5bmMuXCIpO1xuXG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSBuZXcgc2Vzc2lvbiBzdGFydHNcbiAgICAgKi9cbiAgICBTZXNzaW9uU3RhcnQ6IGFzeW5jIChldmVudDogU2Vzc2lvblN0YXJ0RXZlbnQpID0+IHtcbiAgICAgIG1lc3NhZ2VDb3VudGVyID0gMDtcbiAgICAgIHRvb2xDYWxsQ291bnRlciA9IDA7XG5cbiAgICAgIGNvbnN0IHNlc3Npb246IFNlc3Npb25EYXRhID0ge1xuICAgICAgICBzZXNzaW9uSWQ6IGV2ZW50LnNlc3Npb25JZCxcbiAgICAgICAgc291cmNlOiBcImNsYXVkZS1jb2RlXCIsXG4gICAgICAgIGN3ZDogZXZlbnQuY3dkLFxuICAgICAgICBtb2RlbDogZXZlbnQubW9kZWwsXG4gICAgICAgIHN0YXJ0VHlwZTogZXZlbnQuc3RhcnRUeXBlLFxuICAgICAgICB0aGlua2luZ0VuYWJsZWQ6IGV2ZW50LnRoaW5raW5nRW5hYmxlZCxcbiAgICAgICAgcGVybWlzc2lvbk1vZGU6IGV2ZW50LnBlcm1pc3Npb25Nb2RlLFxuICAgICAgICBtY3BTZXJ2ZXJzOiBldmVudC5tY3BTZXJ2ZXJzLFxuICAgICAgICBzdGFydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIH07XG5cbiAgICAgIC8vIEV4dHJhY3QgcHJvamVjdCBpbmZvIGZyb20gY3dkXG4gICAgICBpZiAoZXZlbnQuY3dkKSB7XG4gICAgICAgIHNlc3Npb24ucHJvamVjdFBhdGggPSBldmVudC5jd2Q7XG4gICAgICAgIHNlc3Npb24ucHJvamVjdE5hbWUgPSBwYXRoLmJhc2VuYW1lKGV2ZW50LmN3ZCk7XG5cbiAgICAgICAgLy8gVHJ5IHRvIGdldCBnaXQgaW5mb1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGdpdERpciA9IHBhdGguam9pbihldmVudC5jd2QsIFwiLmdpdFwiKTtcbiAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhnaXREaXIpKSB7XG4gICAgICAgICAgICBjb25zdCBoZWFkRmlsZSA9IHBhdGguam9pbihnaXREaXIsIFwiSEVBRFwiKTtcbiAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGhlYWRGaWxlKSkge1xuICAgICAgICAgICAgICBjb25zdCBoZWFkID0gZnMucmVhZEZpbGVTeW5jKGhlYWRGaWxlLCBcInV0Zi04XCIpLnRyaW0oKTtcbiAgICAgICAgICAgICAgaWYgKGhlYWQuc3RhcnRzV2l0aChcInJlZjogcmVmcy9oZWFkcy9cIikpIHtcbiAgICAgICAgICAgICAgICBzZXNzaW9uLmdpdEJyYW5jaCA9IGhlYWQucmVwbGFjZShcInJlZjogcmVmcy9oZWFkcy9cIiwgXCJcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIElnbm9yZSBnaXQgZXJyb3JzXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2xpZW50LnVwZGF0ZVNlc3Npb25TdGF0ZShldmVudC5zZXNzaW9uSWQsIHNlc3Npb24pO1xuICAgICAgYXdhaXQgY2xpZW50LnN5bmNTZXNzaW9uKHNlc3Npb24pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiB1c2VyIHN1Ym1pdHMgYSBwcm9tcHRcbiAgICAgKi9cbiAgICBVc2VyUHJvbXB0U3VibWl0OiBhc3luYyAoZXZlbnQ6IFVzZXJQcm9tcHRFdmVudCkgPT4ge1xuICAgICAgbWVzc2FnZUNvdW50ZXIrKztcblxuICAgICAgY29uc3QgbWVzc2FnZTogTWVzc2FnZURhdGEgPSB7XG4gICAgICAgIHNlc3Npb25JZDogZXZlbnQuc2Vzc2lvbklkLFxuICAgICAgICBtZXNzYWdlSWQ6IGAke2V2ZW50LnNlc3Npb25JZH0tbXNnLSR7bWVzc2FnZUNvdW50ZXJ9YCxcbiAgICAgICAgc291cmNlOiBcImNsYXVkZS1jb2RlXCIsXG4gICAgICAgIHJvbGU6IFwidXNlclwiLFxuICAgICAgICBjb250ZW50OiBldmVudC5wcm9tcHQsXG4gICAgICAgIHRpbWVzdGFtcDogZXZlbnQudGltZXN0YW1wIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGNsaWVudC5zeW5jTWVzc2FnZShtZXNzYWdlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGFmdGVyIGVhY2ggdG9vbCB1c2VcbiAgICAgKi9cbiAgICBQb3N0VG9vbFVzZTogYXN5bmMgKGV2ZW50OiBUb29sVXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghY29uZmlnLnN5bmNUb29sQ2FsbHMpIHJldHVybjtcblxuICAgICAgdG9vbENhbGxDb3VudGVyKys7XG4gICAgICBtZXNzYWdlQ291bnRlcisrO1xuXG4gICAgICBjb25zdCBtZXNzYWdlOiBNZXNzYWdlRGF0YSA9IHtcbiAgICAgICAgc2Vzc2lvbklkOiBldmVudC5zZXNzaW9uSWQsXG4gICAgICAgIG1lc3NhZ2VJZDogYCR7ZXZlbnQuc2Vzc2lvbklkfS10b29sLSR7dG9vbENhbGxDb3VudGVyfWAsXG4gICAgICAgIHNvdXJjZTogXCJjbGF1ZGUtY29kZVwiLFxuICAgICAgICByb2xlOiBcImFzc2lzdGFudFwiLFxuICAgICAgICB0b29sTmFtZTogZXZlbnQudG9vbE5hbWUsXG4gICAgICAgIHRvb2xBcmdzOiBldmVudC5hcmdzLFxuICAgICAgICB0b29sUmVzdWx0OiBldmVudC5yZXN1bHQsXG4gICAgICAgIGR1cmF0aW9uTXM6IGV2ZW50LmR1cmF0aW9uTXMsXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgY2xpZW50LnN5bmNNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBDbGF1ZGUgc3RvcHMgcmVzcG9uZGluZ1xuICAgICAqL1xuICAgIFN0b3A6IGFzeW5jIChldmVudDogU3RvcEV2ZW50KSA9PiB7XG4gICAgICBtZXNzYWdlQ291bnRlcisrO1xuXG4gICAgICBjb25zdCBtZXNzYWdlOiBNZXNzYWdlRGF0YSA9IHtcbiAgICAgICAgc2Vzc2lvbklkOiBldmVudC5zZXNzaW9uSWQsXG4gICAgICAgIG1lc3NhZ2VJZDogYCR7ZXZlbnQuc2Vzc2lvbklkfS1tc2ctJHttZXNzYWdlQ291bnRlcn1gLFxuICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIixcbiAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgY29udGVudDogZXZlbnQucmVzcG9uc2UsXG4gICAgICAgIHRva2VuQ291bnQ6IGV2ZW50LnRva2VuVXNhZ2UuaW5wdXQgKyBldmVudC50b2tlblVzYWdlLm91dHB1dCxcbiAgICAgICAgZHVyYXRpb25NczogZXZlbnQuZHVyYXRpb25NcyxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9O1xuXG4gICAgICAvLyBVcGRhdGUgc2Vzc2lvbiBzdGF0ZSB3aXRoIHRva2VuIHVzYWdlXG4gICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBjbGllbnQuZ2V0U2Vzc2lvblN0YXRlKGV2ZW50LnNlc3Npb25JZCk7XG4gICAgICBjb25zdCBjdXJyZW50VG9rZW5zID0gY3VycmVudFN0YXRlLnRva2VuVXNhZ2UgfHwgeyBpbnB1dDogMCwgb3V0cHV0OiAwIH07XG4gICAgICBjbGllbnQudXBkYXRlU2Vzc2lvblN0YXRlKGV2ZW50LnNlc3Npb25JZCwge1xuICAgICAgICB0b2tlblVzYWdlOiB7XG4gICAgICAgICAgaW5wdXQ6IGN1cnJlbnRUb2tlbnMuaW5wdXQgKyBldmVudC50b2tlblVzYWdlLmlucHV0LFxuICAgICAgICAgIG91dHB1dDogY3VycmVudFRva2Vucy5vdXRwdXQgKyBldmVudC50b2tlblVzYWdlLm91dHB1dCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBjbGllbnQuc3luY01lc3NhZ2UobWVzc2FnZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHNlc3Npb24gZW5kc1xuICAgICAqL1xuICAgIFNlc3Npb25FbmQ6IGFzeW5jIChldmVudDogU2Vzc2lvbkVuZEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBjbGllbnQuZ2V0U2Vzc2lvblN0YXRlKGV2ZW50LnNlc3Npb25JZCk7XG5cbiAgICAgIGNvbnN0IHNlc3Npb246IFNlc3Npb25EYXRhID0ge1xuICAgICAgICAuLi5jdXJyZW50U3RhdGUsXG4gICAgICAgIHNlc3Npb25JZDogZXZlbnQuc2Vzc2lvbklkLFxuICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIixcbiAgICAgICAgZW5kUmVhc29uOiBldmVudC5lbmRSZWFzb24sXG4gICAgICAgIG1lc3NhZ2VDb3VudDogZXZlbnQubWVzc2FnZUNvdW50LFxuICAgICAgICB0b29sQ2FsbENvdW50OiBldmVudC50b29sQ2FsbENvdW50LFxuICAgICAgICB0b2tlblVzYWdlOiBldmVudC50b3RhbFRva2VuVXNhZ2UsXG4gICAgICAgIGNvc3RFc3RpbWF0ZTogZXZlbnQuY29zdEVzdGltYXRlLFxuICAgICAgICBlbmRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBjbGllbnQuc3luY1Nlc3Npb24oc2Vzc2lvbik7XG4gICAgICBjbGllbnQuY2xlYXJTZXNzaW9uU3RhdGUoZXZlbnQuc2Vzc2lvbklkKTtcblxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBbY2xhdWRlLWNvZGUtc3luY10gU2Vzc2lvbiBzeW5jZWQ6ICR7ZXZlbnQubWVzc2FnZUNvdW50fSBtZXNzYWdlcywgJHtldmVudC50b29sQ2FsbENvdW50fSB0b29sIGNhbGxzYFxuICAgICAgKTtcbiAgICB9LFxuICB9O1xufVxuXG4vLyBEZWZhdWx0IGV4cG9ydCBmb3IgQ2xhdWRlIENvZGUgcGx1Z2luIHN5c3RlbVxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlUGx1Z2luO1xuIl19
|
|
559
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxVUgsZ0NBNEJDO0FBRUQsZ0NBVUM7QUFFRCxrQ0FRQztBQXdNRCxvQ0E0TEM7QUF6dkJELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsdUNBQXlCO0FBZ016Qjs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLGNBQXNCO0lBQzdDLE1BQU0sS0FBSyxHQUFvQjtRQUM3QixLQUFLLEVBQUUsU0FBUztRQUNoQixXQUFXLEVBQUUsQ0FBQztRQUNkLG1CQUFtQixFQUFFLENBQUM7UUFDdEIsZUFBZSxFQUFFLENBQUM7UUFDbEIsWUFBWSxFQUFFLENBQUM7UUFDZixZQUFZLEVBQUUsQ0FBQztRQUNmLGFBQWEsRUFBRSxDQUFDO1FBQ2hCLEtBQUssRUFBRSxTQUFTO1FBQ2hCLEdBQUcsRUFBRSxTQUFTO0tBQ2YsQ0FBQztJQUVGLElBQUksQ0FBQztRQUNILElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDbkMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDekQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV6QyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQztnQkFDSCxNQUFNLEtBQUssR0FBb0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFaEQsbURBQW1EO2dCQUNuRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFB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QUMsWUFBWTtnQkFDaEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO2dCQUNsQyxVQUFVLEVBQUUsS0FBSyxDQUFDLGVBQWU7Z0JBQ2pDLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtnQkFDaEMsT0FBTyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2FBQ2xDLENBQUM7WUFFRixNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXBDLE9BQU8sQ0FBQyxHQUFHLENBQ1Qsc0NBQXNDLEtBQUssQ0FBQyxZQUFZLElBQUksQ0FBQyxjQUFjLEtBQUssQ0FBQyxhQUFhLElBQUksQ0FBQyxhQUFhLENBQ2pILENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCwrQ0FBK0M7QUFDL0Msa0JBQWUsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDbGF1ZGUgQ29kZSBTeW5jIFBsdWdpblxuICpcbiAqIFN5bmNzIENsYXVkZSBDb2RlIHNlc3Npb25zIHRvIE9wZW5TeW5jIGRhc2hib2FyZC5cbiAqIFVzZXMgQVBJIEtleSBhdXRoZW50aWNhdGlvbiAobm8gYnJvd3NlciBPQXV0aCByZXF1aXJlZCkuXG4gKlxuICogSW5zdGFsbDogbnBtIGluc3RhbGwgLWcgY2xhdWRlLWNvZGUtc3luY1xuICogQ29uZmlndXJlOiBjbGF1ZGUtY29kZS1zeW5jIGxvZ2luXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBvcyBmcm9tIFwib3NcIjtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVHlwZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBDb25maWcge1xuICBjb252ZXhVcmw6IHN0cmluZztcbiAgYXBpS2V5OiBzdHJpbmc7XG4gIGF1dG9TeW5jPzogYm9vbGVhbjtcbiAgc3luY1Rvb2xDYWxscz86IGJvb2xlYW47XG4gIHN5bmNUaGlua2luZz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvbkRhdGEge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgc291cmNlOiBcImNsYXVkZS1jb2RlXCI7XG4gIHRpdGxlPzogc3RyaW5nO1xuICBwcm9qZWN0UGF0aD86IHN0cmluZztcbiAgcHJvamVjdE5hbWU/OiBzdHJpbmc7XG4gIGN3ZD86IHN0cmluZztcbiAgZ2l0QnJhbmNoPzogc3RyaW5nO1xuICBnaXRSZXBvPzogc3RyaW5nO1xuICBtb2RlbD86IHN0cmluZztcbiAgc3RhcnRUeXBlPzogXCJuZXdcIiB8IFwicmVzdW1lXCIgfCBcImNvbnRpbnVlXCI7XG4gIGVuZFJlYXNvbj86IFwidXNlcl9zdG9wXCIgfCBcIm1heF90dXJuc1wiIHwgXCJlcnJvclwiIHwgXCJjb21wbGV0ZWRcIiB8IFwiY2xlYXJcIiB8IFwibG9nb3V0XCIgfCBcInByb21wdF9pbnB1dF9leGl0XCIgfCBcIm90aGVyXCIgfCBzdHJpbmc7XG4gIHRoaW5raW5nRW5hYmxlZD86IGJvb2xlYW47XG4gIHBlcm1pc3Npb25Nb2RlPzogc3RyaW5nO1xuICBtY3BTZXJ2ZXJzPzogc3RyaW5nW107XG4gIG1lc3NhZ2VDb3VudD86IG51bWJlcjtcbiAgdG9vbENhbGxDb3VudD86IG51bWJlcjtcbiAgdG9rZW5Vc2FnZT86IHtcbiAgICBpbnB1dDogbnVtYmVyO1xuICAgIG91dHB1dDogbnVtYmVyO1xuICB9O1xuICBjb3N0RXN0aW1hdGU/OiBudW1iZXI7XG4gIHN0YXJ0ZWRBdD86IHN0cmluZztcbiAgZW5kZWRBdD86IHN0cmluZztcbn1cblxuLy8gTWVzc2FnZSBwYXJ0IHR5cGUgZm9yIHRvb2wgY2FsbHMgYW5kIHJlc3VsdHNcbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZVBhcnQge1xuICB0eXBlOiBcInRleHRcIiB8IFwidG9vbC1jYWxsXCIgfCBcInRvb2wtcmVzdWx0XCI7XG4gIGNvbnRlbnQ6IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZURhdGEge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgbWVzc2FnZUlkOiBzdHJpbmc7XG4gIHNvdXJjZTogXCJjbGF1ZGUtY29kZVwiO1xuICByb2xlOiBcInVzZXJcIiB8IFwiYXNzaXN0YW50XCIgfCBcInN5c3RlbVwiO1xuICBjb250ZW50Pzogc3RyaW5nO1xuICB0aGlua2luZ0NvbnRlbnQ/OiBzdHJpbmc7XG4gIHRvb2xOYW1lPzogc3RyaW5nO1xuICB0b29sQXJncz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB0b29sUmVzdWx0Pzogc3RyaW5nO1xuICBwYXJ0cz86IE1lc3NhZ2VQYXJ0W107XG4gIGR1cmF0aW9uTXM/OiBudW1iZXI7XG4gIHRva2VuQ291bnQ/OiBudW1iZXI7XG4gIHRpbWVzdGFtcD86IHN0cmluZztcbiAgbW9kZWw/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbFVzZURhdGEge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgdG9vbE5hbWU6IHN0cmluZztcbiAgdG9vbEFyZ3M/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmVzdWx0Pzogc3RyaW5nO1xuICBzdWNjZXNzPzogYm9vbGVhbjtcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgdGltZXN0YW1wPzogc3RyaW5nO1xufVxuXG4vLyBDbGF1ZGUgQ29kZSBIb29rIFR5cGVzXG5leHBvcnQgaW50ZXJmYWNlIENsYXVkZUNvZGVIb29rcyB7XG4gIFNlc3Npb25TdGFydD86IChkYXRhOiBTZXNzaW9uU3RhcnRFdmVudCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIFVzZXJQcm9tcHRTdWJtaXQ/OiAoZGF0YTogVXNlclByb21wdEV2ZW50KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgUG9zdFRvb2xVc2U/OiAoZGF0YTogVG9vbFVzZUV2ZW50KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgU3RvcD86IChkYXRhOiBTdG9wRXZlbnQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBTZXNzaW9uRW5kPzogKGRhdGE6IFNlc3Npb25FbmRFdmVudCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG59XG5cbi8vIEFjdHVhbCBDbGF1ZGUgQ29kZSBob29rIGV2ZW50IGludGVyZmFjZXMgKGZyb20gZG9jdW1lbnRhdGlvbilcbi8vIFN1cHBvcnRzIGJvdGggbmV3IGZvcm1hdCAoc2Vzc2lvbl9pZCwgdHJhbnNjcmlwdF9wYXRoKSBhbmQgbGVnYWN5IGZvcm1hdCAoc2Vzc2lvbklkKVxuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uU3RhcnRFdmVudCB7XG4gIHNlc3Npb25faWQ6IHN0cmluZztcbiAgdHJhbnNjcmlwdF9wYXRoOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25fbW9kZTogc3RyaW5nO1xuICBob29rX2V2ZW50X25hbWU6IFwiU2Vzc2lvblN0YXJ0XCI7XG4gIHNvdXJjZTogXCJzdGFydHVwXCIgfCBcInJlc3VtZVwiIHwgXCJjbGVhclwiIHwgXCJjb21wYWN0XCI7XG4gIC8vIExlZ2FjeSBmaWVsZHMgKG1heSBvciBtYXkgbm90IGJlIHByb3ZpZGVkKVxuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIGN3ZD86IHN0cmluZztcbiAgbW9kZWw/OiBzdHJpbmc7XG4gIHN0YXJ0VHlwZT86IFwibmV3XCIgfCBcInJlc3VtZVwiIHwgXCJjb250aW51ZVwiO1xuICB0aGlua2luZ0VuYWJsZWQ/OiBib29sZWFuO1xuICBwZXJtaXNzaW9uTW9kZT86IHN0cmluZztcbiAgbWNwU2VydmVycz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJQcm9tcHRFdmVudCB7XG4gIHNlc3Npb25faWQ6IHN0cmluZztcbiAgdHJhbnNjcmlwdF9wYXRoOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25fbW9kZTogc3RyaW5nO1xuICBob29rX2V2ZW50X25hbWU6IFwiVXNlclByb21wdFN1Ym1pdFwiO1xuICBwcm9tcHQ/OiBzdHJpbmc7XG4gIC8vIExlZ2FjeSBmaWVsZHNcbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICB0aW1lc3RhbXA/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbFVzZUV2ZW50IHtcbiAgc2Vzc2lvbl9pZDogc3RyaW5nO1xuICB0cmFuc2NyaXB0X3BhdGg6IHN0cmluZztcbiAgdG9vbF9uYW1lOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25fbW9kZTogc3RyaW5nO1xuICBob29rX2V2ZW50X25hbWU6IFwiUG9zdFRvb2xVc2VcIjtcbiAgLy8gTGVnYWN5IGZpZWxkc1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIHRvb2xOYW1lPzogc3RyaW5nO1xuICBhcmdzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJlc3VsdD86IHN0cmluZztcbiAgc3VjY2Vzcz86IGJvb2xlYW47XG4gIGR1cmF0aW9uTXM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcEV2ZW50IHtcbiAgc2Vzc2lvbl9pZDogc3RyaW5nO1xuICB0cmFuc2NyaXB0X3BhdGg6IHN0cmluZztcbiAgcGVybWlzc2lvbl9tb2RlOiBzdHJpbmc7XG4gIGhvb2tfZXZlbnRfbmFtZTogXCJTdG9wXCI7XG4gIHN0b3BfaG9va19hY3RpdmU6IGJvb2xlYW47XG4gIC8vIExlZ2FjeSBmaWVsZHNcbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICByZXNwb25zZT86IHN0cmluZztcbiAgdG9rZW5Vc2FnZT86IHsgaW5wdXQ6IG51bWJlcjsgb3V0cHV0OiBudW1iZXIgfTtcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgbW9kZWw/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvbkVuZEV2ZW50IHtcbiAgc2Vzc2lvbl9pZDogc3RyaW5nO1xuICB0cmFuc2NyaXB0X3BhdGg6IHN0cmluZztcbiAgY3dkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25fbW9kZTogc3RyaW5nO1xuICBob29rX2V2ZW50X25hbWU6IFwiU2Vzc2lvbkVuZFwiO1xuICByZWFzb246IFwiY2xlYXJcIiB8IFwibG9nb3V0XCIgfCBcInByb21wdF9pbnB1dF9leGl0XCIgfCBcIm90aGVyXCI7XG4gIC8vIExlZ2FjeSBmaWVsZHNcbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICBlbmRSZWFzb24/OiBzdHJpbmc7XG4gIG1lc3NhZ2VDb3VudD86IG51bWJlcjtcbiAgdG9vbENhbGxDb3VudD86IG51bWJlcjtcbiAgdG90YWxUb2tlblVzYWdlPzogeyBpbnB1dDogbnVtYmVyOyBvdXRwdXQ6IG51bWJlciB9O1xuICBjb3N0RXN0aW1hdGU/OiBudW1iZXI7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRyYW5zY3JpcHQgUGFyc2luZ1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBUcmFuc2NyaXB0IGVudHJ5IHR5cGVzIGZvciBwYXJzaW5nIEpTT05MIGZpbGVzXG5pbnRlcmZhY2UgVHJhbnNjcmlwdEVudHJ5IHtcbiAgdHlwZTogc3RyaW5nO1xuICBtZXNzYWdlPzoge1xuICAgIG1vZGVsPzogc3RyaW5nO1xuICAgIHJvbGU/OiBzdHJpbmc7XG4gICAgdXNhZ2U/OiB7XG4gICAgICBpbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gICAgICBvdXRwdXRfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gICAgfTtcbiAgICBjb250ZW50PzogdW5rbm93bjtcbiAgfTtcbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICBjd2Q/OiBzdHJpbmc7XG4gIHNsdWc/OiBzdHJpbmc7XG59XG5cbi8vIFN0YXRzIGV4dHJhY3RlZCBmcm9tIHRyYW5zY3JpcHRcbmludGVyZmFjZSBUcmFuc2NyaXB0U3RhdHMge1xuICBtb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpbnB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZUNyZWF0aW9uVG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlUmVhZFRva2VuczogbnVtYmVyO1xuICBvdXRwdXRUb2tlbnM6IG51bWJlcjtcbiAgbWVzc2FnZUNvdW50OiBudW1iZXI7XG4gIHRvb2xDYWxsQ291bnQ6IG51bWJlcjtcbiAgdGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY3dkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGFyc2UgdHJhbnNjcmlwdCBmaWxlIHRvIGV4dHJhY3QgbW9kZWwsIHRva2VuIHVzYWdlLCBhbmQgc3RhdHNcbiAqL1xuZnVuY3Rpb24gcGFyc2VUcmFuc2NyaXB0KHRyYW5zY3JpcHRQYXRoOiBzdHJpbmcpOiBUcmFuc2NyaXB0U3RhdHMge1xuICBjb25zdCBzdGF0czogVHJhbnNjcmlwdFN0YXRzID0ge1xuICAgIG1vZGVsOiB1bmRlZmluZWQsXG4gICAgaW5wdXRUb2tlbnM6IDAsXG4gICAgY2FjaGVDcmVhdGlvblRva2VuczogMCxcbiAgICBjYWNoZVJlYWRUb2tlbnM6IDAsXG4gICAgb3V0cHV0VG9rZW5zOiAwLFxuICAgIG1lc3NhZ2VDb3VudDogMCxcbiAgICB0b29sQ2FsbENvdW50OiAwLFxuICAgIHRpdGxlOiB1bmRlZmluZWQsXG4gICAgY3dkOiB1bmRlZmluZWQsXG4gIH07XG5cbiAgdHJ5IHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModHJhbnNjcmlwdFBhdGgpKSB7XG4gICAgICByZXR1cm4gc3RhdHM7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyh0cmFuc2NyaXB0UGF0aCwgXCJ1dGYtOFwiKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQudHJpbSgpLnNwbGl0KFwiXFxuXCIpO1xuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbnRyeTogVHJhbnNjcmlwdEVudHJ5ID0gSlNPTi5wYXJzZShsaW5lKTtcblxuICAgICAgICAvLyBHZXQgY3dkIGFuZCB0aXRsZSBmcm9tIGZpcnN0IGVudHJ5IHRoYXQgaGFzIHRoZW1cbiAgICAgICAgaWYgKCFzdGF0cy5jd2QgJiYgZW50cnkuY3dkKSB7XG4gICAgICAgICAgc3RhdHMuY3dkID0gZW50cnkuY3dkO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3RhdHMudGl0bGUgJiYgZW50cnkuc2x1Zykge1xuICAgICAgICAgIHN0YXRzLnRpdGxlID0gZW50cnkuc2x1ZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvdW50IG1lc3NhZ2VzXG4gICAgICAgIGlmIChlbnRyeS50eXBlID09PSBcInVzZXJcIikge1xuICAgICAgICAgIHN0YXRzLm1lc3NhZ2VDb3VudCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXh0cmFjdCBtb2RlbCBhbmQgdG9rZW5zIGZyb20gYXNzaXN0YW50IG1lc3NhZ2VzXG4gICAgICAgIGlmIChlbnRyeS50eXBlID09PSBcImFzc2lzdGFudFwiICYmIGVudHJ5Lm1lc3NhZ2UpIHtcbiAgICAgICAgICBpZiAoZW50cnkubWVzc2FnZS5tb2RlbCAmJiAhc3RhdHMubW9kZWwpIHtcbiAgICAgICAgICAgIHN0YXRzLm1vZGVsID0gZW50cnkubWVzc2FnZS5tb2RlbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZW50cnkubWVzc2FnZS51c2FnZSkge1xuICAgICAgICAgICAgY29uc3QgdXNhZ2UgPSBlbnRyeS5tZXNzYWdlLnVzYWdlO1xuICAgICAgICAgICAgc3RhdHMuaW5wdXRUb2tlbnMgKz0gdXNhZ2UuaW5wdXRfdG9rZW5zIHx8IDA7XG4gICAgICAgICAgICBzdGF0cy5jYWNoZUNyZWF0aW9uVG9rZW5zICs9IHVzYWdlLmNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyB8fCAwO1xuICAgICAgICAgICAgc3RhdHMuY2FjaGVSZWFkVG9rZW5zICs9IHVzYWdlLmNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zIHx8IDA7XG4gICAgICAgICAgICBzdGF0cy5vdXRwdXRUb2tlbnMgKz0gdXNhZ2Uub3V0cHV0X3Rva2VucyB8fCAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvdW50IHRvb2wgdXNlc1xuICAgICAgICBpZiAoZW50cnkudHlwZSA9PT0gXCJhc3Npc3RhbnRcIiAmJiBlbnRyeS5tZXNzYWdlPy5jb250ZW50KSB7XG4gICAgICAgICAgY29uc3QgbXNnQ29udGVudCA9IGVudHJ5Lm1lc3NhZ2UuY29udGVudDtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtc2dDb250ZW50KSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIG1zZ0NvbnRlbnQpIHtcbiAgICAgICAgICAgICAgaWYgKHBhcnQgJiYgdHlwZW9mIHBhcnQgPT09IFwib2JqZWN0XCIgJiYgXCJ0eXBlXCIgaW4gcGFydCAmJiBwYXJ0LnR5cGUgPT09IFwidG9vbF91c2VcIikge1xuICAgICAgICAgICAgICAgIHN0YXRzLnRvb2xDYWxsQ291bnQrKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFNraXAgbWFsZm9ybWVkIGxpbmVzXG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJbY2xhdWRlLWNvZGUtc3luY10gRXJyb3IgcGFyc2luZyB0cmFuc2NyaXB0OlwiLCBlcnJvcik7XG4gIH1cblxuICByZXR1cm4gc3RhdHM7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE1vZGVsIFByaWNpbmcgJiBDb3N0IENhbGN1bGF0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIFByaWNpbmcgcGVyIG1pbGxpb24gdG9rZW5zIChVU0QpIHdpdGggY2FjaGUgcHJpY2luZ1xuLy8gU291cmNlOiBodHRwczovL3d3dy5hbnRocm9waWMuY29tL3ByaWNpbmdcbmNvbnN0IE1PREVMX1BSSUNJTkc6IFJlY29yZDxzdHJpbmcsIHsgaW5wdXQ6IG51bWJlcjsgb3V0cHV0OiBudW1iZXI7IGNhY2hlV3JpdGU6IG51bWJlcjsgY2FjaGVSZWFkOiBudW1iZXIgfT4gPSB7XG4gIFwiY2xhdWRlLXNvbm5ldC00LTIwMjUwNTE0XCI6IHsgaW5wdXQ6IDMuMDAsIG91dHB1dDogMTUuMDAsIGNhY2hlV3JpdGU6IDMuNzUsIGNhY2hlUmVhZDogMC4zMCB9LFxuICBcImNsYXVkZS1vcHVzLTQtMjAyNTA1MTRcIjogeyBpbnB1dDogMTUuMDAsIG91dHB1dDogNzUuMDAsIGNhY2hlV3JpdGU6IDE4Ljc1LCBjYWNoZVJlYWQ6IDEuNTAgfSxcbiAgXCJjbGF1ZGUtb3B1cy00LTUtMjAyNTExMDFcIjogeyBpbnB1dDogMTUuMDAsIG91dHB1dDogNzUuMDAsIGNhY2hlV3JpdGU6IDE4Ljc1LCBjYWNoZVJlYWQ6IDEuNTAgfSxcbiAgXCJjbGF1ZGUtMy01LXNvbm5ldC0yMDI0MTAyMlwiOiB7IGlucHV0OiAzLjAwLCBvdXRwdXQ6IDE1LjAwLCBjYWNoZVdyaXRlOiAzLjc1LCBjYWNoZVJlYWQ6IDAuMzAgfSxcbiAgXCJjbGF1ZGUtMy1vcHVzLTIwMjQwMjI5XCI6IHsgaW5wdXQ6IDE1LjAwLCBvdXRwdXQ6IDc1LjAwLCBjYWNoZVdyaXRlOiAxOC43NSwgY2FjaGVSZWFkOiAxLjUwIH0sXG4gIFwiY2xhdWRlLTMtNS1oYWlrdS0yMDI0MTAyMlwiOiB7IGlucHV0OiAwLjgwLCBvdXRwdXQ6IDQuMDAsIGNhY2hlV3JpdGU6IDEuMDAsIGNhY2hlUmVhZDogMC4wOCB9LFxufTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgY29zdCBmcm9tIG1vZGVsIGFuZCB0b2tlbiB1c2FnZSB3aXRoIHByb3BlciBjYWNoZSBwcmljaW5nXG4gKiBSZXR1cm5zIDAgaWYgbW9kZWwgaXMgdW5rbm93biBvciBwcmljaW5nIG5vdCBhdmFpbGFibGVcbiAqL1xuZnVuY3Rpb24gY2FsY3VsYXRlQ29zdChtb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkLCBzdGF0czogVHJhbnNjcmlwdFN0YXRzKTogbnVtYmVyIHtcbiAgaWYgKCFtb2RlbCkgcmV0dXJuIDA7XG5cbiAgLy8gVHJ5IGV4YWN0IG1hdGNoIGZpcnN0XG4gIGxldCBwcmljaW5nID0gTU9ERUxfUFJJQ0lOR1ttb2RlbF07XG5cbiAgLy8gVHJ5IHBhcnRpYWwgbWF0Y2ggaWYgZXhhY3QgbWF0Y2ggZmFpbHNcbiAgaWYgKCFwcmljaW5nKSB7XG4gICAgY29uc3QgbWF0Y2hpbmdLZXkgPSBPYmplY3Qua2V5cyhNT0RFTF9QUklDSU5HKS5maW5kKGsgPT4gbW9kZWwuaW5jbHVkZXMoaykgfHwgay5pbmNsdWRlcyhtb2RlbCkpO1xuICAgIGlmIChtYXRjaGluZ0tleSkge1xuICAgICAgcHJpY2luZyA9IE1PREVMX1BSSUNJTkdbbWF0Y2hpbmdLZXldO1xuICAgIH1cbiAgfVxuXG4gIGlmICghcHJpY2luZykgcmV0dXJuIDA7XG5cbiAgLy8gQ2FsY3VsYXRlIGNvc3Qgd2l0aCBwcm9wZXIgY2FjaGUgcHJpY2luZ1xuICBjb25zdCBpbnB1dENvc3QgPSBzdGF0cy5pbnB1dFRva2VucyAqIHByaWNpbmcuaW5wdXQ7XG4gIGNvbnN0IGNhY2hlV3JpdGVDb3N0ID0gc3RhdHMuY2FjaGVDcmVhdGlvblRva2VucyAqIHByaWNpbmcuY2FjaGVXcml0ZTtcbiAgY29uc3QgY2FjaGVSZWFkQ29zdCA9IHN0YXRzLmNhY2hlUmVhZFRva2VucyAqIHByaWNpbmcuY2FjaGVSZWFkO1xuICBjb25zdCBvdXRwdXRDb3N0ID0gc3RhdHMub3V0cHV0VG9rZW5zICogcHJpY2luZy5vdXRwdXQ7XG5cbiAgcmV0dXJuIChpbnB1dENvc3QgKyBjYWNoZVdyaXRlQ29zdCArIGNhY2hlUmVhZENvc3QgKyBvdXRwdXRDb3N0KSAvIDFfMDAwXzAwMDtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29uZmlndXJhdGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5jb25zdCBDT05GSUdfRElSID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgXCIuY29uZmlnXCIsIFwiY2xhdWRlLWNvZGUtc3luY1wiKTtcbmNvbnN0IENPTkZJR19GSUxFID0gcGF0aC5qb2luKENPTkZJR19ESVIsIFwiY29uZmlnLmpzb25cIik7XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQ29uZmlnKCk6IENvbmZpZyB8IG51bGwge1xuICAvLyBDaGVjayBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZmlyc3RcbiAgY29uc3QgZW52VXJsID0gcHJvY2Vzcy5lbnYuQ0xBVURFX1NZTkNfQ09OVkVYX1VSTDtcbiAgY29uc3QgZW52S2V5ID0gcHJvY2Vzcy5lbnYuQ0xBVURFX1NZTkNfQVBJX0tFWTtcblxuICBpZiAoZW52VXJsICYmIGVudktleSkge1xuICAgIHJldHVybiB7XG4gICAgICBjb252ZXhVcmw6IG5vcm1hbGl6ZUNvbnZleFVybChlbnZVcmwpLFxuICAgICAgYXBpS2V5OiBlbnZLZXksXG4gICAgICBhdXRvU3luYzogcHJvY2Vzcy5lbnYuQ0xBVURFX1NZTkNfQVVUT19TWU5DICE9PSBcImZhbHNlXCIsXG4gICAgICBzeW5jVG9vbENhbGxzOiBwcm9jZXNzLmVudi5DTEFVREVfU1lOQ19UT09MX0NBTExTICE9PSBcImZhbHNlXCIsXG4gICAgICBzeW5jVGhpbmtpbmc6IHByb2Nlc3MuZW52LkNMQVVERV9TWU5DX1RISU5LSU5HID09PSBcInRydWVcIixcbiAgICB9O1xuICB9XG5cbiAgLy8gRmFsbCBiYWNrIHRvIGNvbmZpZyBmaWxlXG4gIHRyeSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoQ09ORklHX0ZJTEUpKSB7XG4gICAgICBjb25zdCBkYXRhID0gZnMucmVhZEZpbGVTeW5jKENPTkZJR19GSUxFLCBcInV0Zi04XCIpO1xuICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShkYXRhKSBhcyBDb25maWc7XG4gICAgICBjb25maWcuY29udmV4VXJsID0gbm9ybWFsaXplQ29udmV4VXJsKGNvbmZpZy5jb252ZXhVcmwpO1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGxvYWRpbmcgY29uZmlnOlwiLCBlcnJvcik7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhdmVDb25maWcoY29uZmlnOiBDb25maWcpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoQ09ORklHX0RJUikpIHtcbiAgICAgIGZzLm1rZGlyU3luYyhDT05GSUdfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgZnMud3JpdGVGaWxlU3luYyhDT05GSUdfRklMRSwgSlNPTi5zdHJpbmdpZnkoY29uZmlnLCBudWxsLCAyKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIHNhdmluZyBjb25maWc6XCIsIGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDb25maWcoKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoQ09ORklHX0ZJTEUpKSB7XG4gICAgICBmcy51bmxpbmtTeW5jKENPTkZJR19GSUxFKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGNsZWFyaW5nIGNvbmZpZzpcIiwgZXJyb3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbnZleFVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIENvbnZlcnQgLmNvbnZleC5jbG91ZCB0byAuY29udmV4LnNpdGUgZm9yIEFQSSBjYWxsc1xuICByZXR1cm4gdXJsLnJlcGxhY2UoXCIuY29udmV4LmNsb3VkXCIsIFwiLmNvbnZleC5zaXRlXCIpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTeW5jIENsaWVudFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY2xhc3MgU3luY0NsaWVudCB7XG4gIHByaXZhdGUgY29uZmlnOiBDb25maWc7XG4gIHByaXZhdGUgc2l0ZVVybDogc3RyaW5nO1xuICBwcml2YXRlIHNlc3Npb25DYWNoZTogTWFwPHN0cmluZywgUGFydGlhbDxTZXNzaW9uRGF0YT4+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgLy8gTm9ybWFsaXplIFVSTCB0byAuY29udmV4LnNpdGUgZm9yIEhUVFAgZW5kcG9pbnRzXG4gICAgLy8gU3VwcG9ydHMgYm90aCAuY29udmV4LmNsb3VkIGFuZCAuY29udmV4LnNpdGUgaW5wdXQgVVJMc1xuICAgIHRoaXMuc2l0ZVVybCA9IGNvbmZpZy5jb252ZXhVcmwucmVwbGFjZShcIi5jb252ZXguY2xvdWRcIiwgXCIuY29udmV4LnNpdGVcIik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlcXVlc3QoZW5kcG9pbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuc2l0ZVVybH0ke2VuZHBvaW50fWA7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy5hcGlLZXl9YCxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c30gLSAke3RleHR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgfVxuXG4gIC8vIFRyYW5zZm9ybSBzZXNzaW9uIGRhdGEgdG8gYmFja2VuZCBmb3JtYXRcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1TZXNzaW9uKHNlc3Npb246IFNlc3Npb25EYXRhKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgZXh0ZXJuYWxJZDogc2Vzc2lvbi5zZXNzaW9uSWQsXG4gICAgICBzb3VyY2U6IHNlc3Npb24uc291cmNlLFxuICAgIH07XG4gICAgXG4gICAgLy8gT25seSBpbmNsdWRlIGZpZWxkcyB0aGF0IGFyZSBkZWZpbmVkXG4gICAgaWYgKHNlc3Npb24udGl0bGUgIT09IHVuZGVmaW5lZCkgcGF5bG9hZC50aXRsZSA9IHNlc3Npb24udGl0bGU7XG4gICAgaWYgKHNlc3Npb24ucHJvamVjdFBhdGggfHwgc2Vzc2lvbi5jd2QpIHBheWxvYWQucHJvamVjdFBhdGggPSBzZXNzaW9uLnByb2plY3RQYXRoIHx8IHNlc3Npb24uY3dkO1xuICAgIGlmIChzZXNzaW9uLnByb2plY3ROYW1lKSBwYXlsb2FkLnByb2plY3ROYW1lID0gc2Vzc2lvbi5wcm9qZWN0TmFtZTtcbiAgICBpZiAoc2Vzc2lvbi5tb2RlbCkgcGF5bG9hZC5tb2RlbCA9IHNlc3Npb24ubW9kZWw7XG4gICAgaWYgKHNlc3Npb24udG9rZW5Vc2FnZT8uaW5wdXQgIT09IHVuZGVmaW5lZCkgcGF5bG9hZC5wcm9tcHRUb2tlbnMgPSBzZXNzaW9uLnRva2VuVXNhZ2UuaW5wdXQ7XG4gICAgaWYgKHNlc3Npb24udG9rZW5Vc2FnZT8ub3V0cHV0ICE9PSB1bmRlZmluZWQpIHBheWxvYWQuY29tcGxldGlvblRva2VucyA9IHNlc3Npb24udG9rZW5Vc2FnZS5vdXRwdXQ7XG4gICAgaWYgKHNlc3Npb24uY29zdEVzdGltYXRlICE9PSB1bmRlZmluZWQpIHBheWxvYWQuY29zdCA9IHNlc3Npb24uY29zdEVzdGltYXRlO1xuICAgIGlmIChzZXNzaW9uLm1lc3NhZ2VDb3VudCAhPT0gdW5kZWZpbmVkKSBwYXlsb2FkLm1lc3NhZ2VDb3VudCA9IHNlc3Npb24ubWVzc2FnZUNvdW50O1xuICAgIGlmIChzZXNzaW9uLnRvb2xDYWxsQ291bnQgIT09IHVuZGVmaW5lZCkgcGF5bG9hZC50b29sQ2FsbENvdW50ID0gc2Vzc2lvbi50b29sQ2FsbENvdW50O1xuICAgIGlmIChzZXNzaW9uLmVuZFJlYXNvbikgcGF5bG9hZC5lbmRSZWFzb24gPSBzZXNzaW9uLmVuZFJlYXNvbjtcbiAgICBcbiAgICAvLyBDYWxjdWxhdGUgZHVyYXRpb24gaWYgYm90aCB0aW1lc3RhbXBzIGV4aXN0XG4gICAgaWYgKHNlc3Npb24uZW5kZWRBdCAmJiBzZXNzaW9uLnN0YXJ0ZWRBdCkge1xuICAgICAgcGF5bG9hZC5kdXJhdGlvbk1zID0gbmV3IERhdGUoc2Vzc2lvbi5lbmRlZEF0KS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShzZXNzaW9uLnN0YXJ0ZWRBdCkuZ2V0VGltZSgpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gcGF5bG9hZDtcbiAgfVxuXG4gIC8vIFRyYW5zZm9ybSBtZXNzYWdlIGRhdGEgdG8gYmFja2VuZCBmb3JtYXRcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1NZXNzYWdlKG1lc3NhZ2U6IE1lc3NhZ2VEYXRhKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgc2Vzc2lvbkV4dGVybmFsSWQ6IG1lc3NhZ2Uuc2Vzc2lvbklkLFxuICAgICAgZXh0ZXJuYWxJZDogbWVzc2FnZS5tZXNzYWdlSWQsXG4gICAgICByb2xlOiBtZXNzYWdlLnJvbGUsXG4gICAgICBzb3VyY2U6IG1lc3NhZ2Uuc291cmNlLFxuICAgIH07XG4gICAgXG4gICAgLy8gU2V0IHRleHRDb250ZW50IGZvciB1c2VyIHByb21wdHMgYW5kIGFzc2lzdGFudCByZXNwb25zZXNcbiAgICBpZiAobWVzc2FnZS5jb250ZW50KSB7XG4gICAgICBwYXlsb2FkLnRleHRDb250ZW50ID0gbWVzc2FnZS5jb250ZW50O1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50b29sUmVzdWx0ICYmICFtZXNzYWdlLnRvb2xOYW1lKSB7XG4gICAgICAvLyBPbmx5IHVzZSB0b29sUmVzdWx0IGFzIHRleHRDb250ZW50IGlmIG5vIHRvb2xOYW1lIChmYWxsYmFjaylcbiAgICAgIHBheWxvYWQudGV4dENvbnRlbnQgPSBtZXNzYWdlLnRvb2xSZXN1bHQ7XG4gICAgfVxuICAgIFxuICAgIC8vIEluY2x1ZGUgZHVyYXRpb24gaWYgYXZhaWxhYmxlXG4gICAgaWYgKG1lc3NhZ2UuZHVyYXRpb25NcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXlsb2FkLmR1cmF0aW9uTXMgPSBtZXNzYWdlLmR1cmF0aW9uTXM7XG4gICAgfVxuICAgIFxuICAgIC8vIEluY2x1ZGUgdG9rZW4gY291bnQgaWYgYXZhaWxhYmxlXG4gICAgaWYgKG1lc3NhZ2UudG9rZW5Db3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXlsb2FkLnByb21wdFRva2VucyA9IG1lc3NhZ2UudG9rZW5Db3VudDtcbiAgICB9XG4gICAgXG4gICAgLy8gSW5jbHVkZSBtb2RlbCBpZiBhdmFpbGFibGVcbiAgICBpZiAobWVzc2FnZS5tb2RlbCkge1xuICAgICAgcGF5bG9hZC5tb2RlbCA9IG1lc3NhZ2UubW9kZWw7XG4gICAgfVxuICAgIFxuICAgIC8vIFRvb2wgdXNlIGluZm8gc3RvcmVkIGluIHBhcnRzXG4gICAgaWYgKG1lc3NhZ2UudG9vbE5hbWUpIHtcbiAgICAgIHBheWxvYWQucGFydHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgIHRvb2xOYW1lOiBtZXNzYWdlLnRvb2xOYW1lLFxuICAgICAgICAgICAgYXJnczogbWVzc2FnZS50b29sQXJncyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIC8vIEFkZCB0b29sIHJlc3VsdCBhcyBzZXBhcmF0ZSBwYXJ0XG4gICAgICBpZiAobWVzc2FnZS50b29sUmVzdWx0KSB7XG4gICAgICAgIChwYXlsb2FkLnBhcnRzIGFzIEFycmF5PHsgdHlwZTogc3RyaW5nOyBjb250ZW50OiB1bmtub3duIH0+KS5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgY29udGVudDogbWVzc2FnZS50b29sUmVzdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICBhc3luYyBzeW5jU2Vzc2lvbihzZXNzaW9uOiBTZXNzaW9uRGF0YSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy50cmFuc2Zvcm1TZXNzaW9uKHNlc3Npb24pO1xuICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0KFwiL3N5bmMvc2Vzc2lvblwiLCBwYXlsb2FkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBzeW5jIHNlc3Npb246XCIsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN5bmNNZXNzYWdlKG1lc3NhZ2U6IE1lc3NhZ2VEYXRhKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLnRyYW5zZm9ybU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoXCIvc3luYy9tZXNzYWdlXCIsIHBheWxvYWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHN5bmMgbWVzc2FnZTpcIiwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3luY0JhdGNoKFxuICAgIHNlc3Npb25zOiBTZXNzaW9uRGF0YVtdLFxuICAgIG1lc3NhZ2VzOiBNZXNzYWdlRGF0YVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lZFNlc3Npb25zID0gc2Vzc2lvbnMubWFwKChzKSA9PiB0aGlzLnRyYW5zZm9ybVNlc3Npb24ocykpO1xuICAgICAgY29uc3QgdHJhbnNmb3JtZWRNZXNzYWdlcyA9IG1lc3NhZ2VzLm1hcCgobSkgPT4gdGhpcy50cmFuc2Zvcm1NZXNzYWdlKG0pKTtcbiAgICAgIGF3YWl0IHRoaXMucmVxdWVzdChcIi9zeW5jL2JhdGNoXCIsIHtcbiAgICAgICAgc2Vzc2lvbnM6IHRyYW5zZm9ybWVkU2Vzc2lvbnMsXG4gICAgICAgIG1lc3NhZ2VzOiB0cmFuc2Zvcm1lZE1lc3NhZ2VzLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gc3luYyBiYXRjaDpcIiwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdGVzdENvbm5lY3Rpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuc2l0ZVVybH0vaGVhbHRoYDtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5vaztcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXNzaW9uIHN0YXRlIG1hbmFnZW1lbnRcbiAgZ2V0U2Vzc2lvblN0YXRlKHNlc3Npb25JZDogc3RyaW5nKTogUGFydGlhbDxTZXNzaW9uRGF0YT4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25DYWNoZS5nZXQoc2Vzc2lvbklkKSB8fCB7fTtcbiAgfVxuXG4gIHVwZGF0ZVNlc3Npb25TdGF0ZShcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICB1cGRhdGVzOiBQYXJ0aWFsPFNlc3Npb25EYXRhPlxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5zZXNzaW9uQ2FjaGUuZ2V0KHNlc3Npb25JZCkgfHwge307XG4gICAgdGhpcy5zZXNzaW9uQ2FjaGUuc2V0KHNlc3Npb25JZCwgeyAuLi5jdXJyZW50LCAuLi51cGRhdGVzIH0pO1xuICB9XG5cbiAgY2xlYXJTZXNzaW9uU3RhdGUoc2Vzc2lvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlc3Npb25DYWNoZS5kZWxldGUoc2Vzc2lvbklkKTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQbHVnaW4gRXhwb3J0XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2xhdWRlIENvZGUgUGx1Z2luIEVudHJ5IFBvaW50XG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQ2xhdWRlIENvZGUgdG8gcmVnaXN0ZXIgdGhlIHBsdWdpbi5cbiAqIEl0IHJldHVybnMgaG9vayBoYW5kbGVycyB0aGF0IGZpcmUgYXQga2V5IHBvaW50cyBpbiB0aGUgc2Vzc2lvbiBsaWZlY3ljbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQbHVnaW4oKTogQ2xhdWRlQ29kZUhvb2tzIHwgbnVsbCB7XG4gIGNvbnN0IGNvbmZpZyA9IGxvYWRDb25maWcoKTtcblxuICBpZiAoIWNvbmZpZykge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgXCJbY2xhdWRlLWNvZGUtc3luY10gTm90IGNvbmZpZ3VyZWQuIFJ1biAnY2xhdWRlLWNvZGUtc3luYyBsb2dpbicgdG8gc2V0IHVwLlwiXG4gICAgKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChjb25maWcuYXV0b1N5bmMgPT09IGZhbHNlKSB7XG4gICAgY29uc29sZS5sb2coXCJbY2xhdWRlLWNvZGUtc3luY10gQXV0by1zeW5jIGRpc2FibGVkIGluIGNvbmZpZy5cIik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBjbGllbnQgPSBuZXcgU3luY0NsaWVudChjb25maWcpO1xuICBsZXQgbWVzc2FnZUNvdW50ZXIgPSAwO1xuICBsZXQgdG9vbENhbGxDb3VudGVyID0gMDtcblxuICBjb25zb2xlLmxvZyhcIltjbGF1ZGUtY29kZS1zeW5jXSBQbHVnaW4gbG9hZGVkLiBTZXNzaW9ucyB3aWxsIHN5bmMgdG8gT3BlblN5bmMuXCIpO1xuXG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSBuZXcgc2Vzc2lvbiBzdGFydHNcbiAgICAgKi9cbiAgICBTZXNzaW9uU3RhcnQ6IGFzeW5jIChldmVudDogU2Vzc2lvblN0YXJ0RXZlbnQpID0+IHtcbiAgICAgIG1lc3NhZ2VDb3VudGVyID0gMDtcbiAgICAgIHRvb2xDYWxsQ291bnRlciA9IDA7XG5cbiAgICAgIC8vIFVzZSBzZXNzaW9uX2lkIChuZXcpIG9yIHNlc3Npb25JZCAobGVnYWN5KVxuICAgICAgY29uc3Qgc2Vzc2lvbklkID0gZXZlbnQuc2Vzc2lvbl9pZCB8fCBldmVudC5zZXNzaW9uSWQgfHwgXCJcIjtcbiAgICAgIGNvbnN0IGN3ZCA9IGV2ZW50LmN3ZDtcbiAgICAgIGNvbnN0IHBlcm1pc3Npb25Nb2RlID0gZXZlbnQucGVybWlzc2lvbl9tb2RlIHx8IGV2ZW50LnBlcm1pc3Npb25Nb2RlO1xuXG4gICAgICBjb25zdCBzZXNzaW9uOiBTZXNzaW9uRGF0YSA9IHtcbiAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIixcbiAgICAgICAgY3dkLFxuICAgICAgICBtb2RlbDogZXZlbnQubW9kZWwsXG4gICAgICAgIHN0YXJ0VHlwZTogZXZlbnQuc3RhcnRUeXBlLFxuICAgICAgICB0aGlua2luZ0VuYWJsZWQ6IGV2ZW50LnRoaW5raW5nRW5hYmxlZCxcbiAgICAgICAgcGVybWlzc2lvbk1vZGUsXG4gICAgICAgIG1jcFNlcnZlcnM6IGV2ZW50Lm1jcFNlcnZlcnMsXG4gICAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgfTtcblxuICAgICAgLy8gRXh0cmFjdCBwcm9qZWN0IGluZm8gZnJvbSBjd2RcbiAgICAgIGlmIChjd2QpIHtcbiAgICAgICAgc2Vzc2lvbi5wcm9qZWN0UGF0aCA9IGN3ZDtcbiAgICAgICAgc2Vzc2lvbi5wcm9qZWN0TmFtZSA9IHBhdGguYmFzZW5hbWUoY3dkKTtcblxuICAgICAgICAvLyBUcnkgdG8gZ2V0IGdpdCBpbmZvXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZ2l0RGlyID0gcGF0aC5qb2luKGN3ZCwgXCIuZ2l0XCIpO1xuICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGdpdERpcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRGaWxlID0gcGF0aC5qb2luKGdpdERpciwgXCJIRUFEXCIpO1xuICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoaGVhZEZpbGUpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGhlYWQgPSBmcy5yZWFkRmlsZVN5bmMoaGVhZEZpbGUsIFwidXRmLThcIikudHJpbSgpO1xuICAgICAgICAgICAgICBpZiAoaGVhZC5zdGFydHNXaXRoKFwicmVmOiByZWZzL2hlYWRzL1wiKSkge1xuICAgICAgICAgICAgICAgIHNlc3Npb24uZ2l0QnJhbmNoID0gaGVhZC5yZXBsYWNlKFwicmVmOiByZWZzL2hlYWRzL1wiLCBcIlwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gSWdub3JlIGdpdCBlcnJvcnNcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjbGllbnQudXBkYXRlU2Vzc2lvblN0YXRlKHNlc3Npb25JZCwgc2Vzc2lvbik7XG4gICAgICBhd2FpdCBjbGllbnQuc3luY1Nlc3Npb24oc2Vzc2lvbik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHVzZXIgc3VibWl0cyBhIHByb21wdFxuICAgICAqL1xuICAgIFVzZXJQcm9tcHRTdWJtaXQ6IGFzeW5jIChldmVudDogVXNlclByb21wdEV2ZW50KSA9PiB7XG4gICAgICBtZXNzYWdlQ291bnRlcisrO1xuICAgICAgY29uc3Qgc2Vzc2lvbklkID0gZXZlbnQuc2Vzc2lvbl9pZCB8fCBldmVudC5zZXNzaW9uSWQgfHwgXCJcIjtcbiAgICAgIGNvbnN0IHByb21wdCA9IGV2ZW50LnByb21wdCB8fCBcIlwiO1xuXG4gICAgICBjb25zdCBtZXNzYWdlOiBNZXNzYWdlRGF0YSA9IHtcbiAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICBtZXNzYWdlSWQ6IGAke3Nlc3Npb25JZH0tbXNnLSR7bWVzc2FnZUNvdW50ZXJ9YCxcbiAgICAgICAgc291cmNlOiBcImNsYXVkZS1jb2RlXCIsXG4gICAgICAgIHJvbGU6IFwidXNlclwiLFxuICAgICAgICBjb250ZW50OiBwcm9tcHQsXG4gICAgICAgIHRpbWVzdGFtcDogZXZlbnQudGltZXN0YW1wIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGNsaWVudC5zeW5jTWVzc2FnZShtZXNzYWdlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGFmdGVyIGVhY2ggdG9vbCB1c2VcbiAgICAgKi9cbiAgICBQb3N0VG9vbFVzZTogYXN5bmMgKGV2ZW50OiBUb29sVXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghY29uZmlnLnN5bmNUb29sQ2FsbHMpIHJldHVybjtcblxuICAgICAgdG9vbENhbGxDb3VudGVyKys7XG4gICAgICBtZXNzYWdlQ291bnRlcisrO1xuICAgICAgY29uc3Qgc2Vzc2lvbklkID0gZXZlbnQuc2Vzc2lvbl9pZCB8fCBldmVudC5zZXNzaW9uSWQgfHwgXCJcIjtcbiAgICAgIGNvbnN0IHRvb2xOYW1lID0gZXZlbnQudG9vbF9uYW1lIHx8IGV2ZW50LnRvb2xOYW1lIHx8IFwidW5rbm93blwiO1xuXG4gICAgICBjb25zdCBtZXNzYWdlOiBNZXNzYWdlRGF0YSA9IHtcbiAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICBtZXNzYWdlSWQ6IGAke3Nlc3Npb25JZH0tdG9vbC0ke3Rvb2xDYWxsQ291bnRlcn1gLFxuICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIixcbiAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgIHRvb2xBcmdzOiBldmVudC5hcmdzLFxuICAgICAgICB0b29sUmVzdWx0OiBldmVudC5yZXN1bHQsXG4gICAgICAgIGR1cmF0aW9uTXM6IGV2ZW50LmR1cmF0aW9uTXMsXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgY2xpZW50LnN5bmNNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBDbGF1ZGUgc3RvcHMgcmVzcG9uZGluZ1xuICAgICAqL1xuICAgIFN0b3A6IGFzeW5jIChldmVudDogU3RvcEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uSWQgPSBldmVudC5zZXNzaW9uX2lkIHx8IGV2ZW50LnNlc3Npb25JZCB8fCBcIlwiO1xuICAgICAgY29uc3QgdG9rZW5Vc2FnZSA9IGV2ZW50LnRva2VuVXNhZ2UgfHwgeyBpbnB1dDogMCwgb3V0cHV0OiAwIH07XG5cbiAgICAgIC8vIE9ubHkgY3JlYXRlIG1lc3NhZ2UgaWYgd2UgaGF2ZSByZXNwb25zZSBjb250ZW50XG4gICAgICBpZiAoZXZlbnQucmVzcG9uc2UpIHtcbiAgICAgICAgbWVzc2FnZUNvdW50ZXIrKztcblxuICAgICAgICBjb25zdCBtZXNzYWdlOiBNZXNzYWdlRGF0YSA9IHtcbiAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgbWVzc2FnZUlkOiBgJHtzZXNzaW9uSWR9LW1zZy0ke21lc3NhZ2VDb3VudGVyfWAsXG4gICAgICAgICAgc291cmNlOiBcImNsYXVkZS1jb2RlXCIsXG4gICAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgICBjb250ZW50OiBldmVudC5yZXNwb25zZSxcbiAgICAgICAgICBtb2RlbDogZXZlbnQubW9kZWwsXG4gICAgICAgICAgdG9rZW5Db3VudDogdG9rZW5Vc2FnZS5pbnB1dCArIHRva2VuVXNhZ2Uub3V0cHV0LFxuICAgICAgICAgIGR1cmF0aW9uTXM6IGV2ZW50LmR1cmF0aW9uTXMsXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQgY2xpZW50LnN5bmNNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgc2Vzc2lvbiBzdGF0ZSB3aXRoIHRva2VuIHVzYWdlXG4gICAgICBpZiAodG9rZW5Vc2FnZS5pbnB1dCA+IDAgfHwgdG9rZW5Vc2FnZS5vdXRwdXQgPiAwKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGNsaWVudC5nZXRTZXNzaW9uU3RhdGUoc2Vzc2lvbklkKTtcbiAgICAgICAgY29uc3QgY3VycmVudFRva2VucyA9IGN1cnJlbnRTdGF0ZS50b2tlblVzYWdlIHx8IHsgaW5wdXQ6IDAsIG91dHB1dDogMCB9O1xuICAgICAgICBjbGllbnQudXBkYXRlU2Vzc2lvblN0YXRlKHNlc3Npb25JZCwge1xuICAgICAgICAgIHRva2VuVXNhZ2U6IHtcbiAgICAgICAgICAgIGlucHV0OiBjdXJyZW50VG9rZW5zLmlucHV0ICsgdG9rZW5Vc2FnZS5pbnB1dCxcbiAgICAgICAgICAgIG91dHB1dDogY3VycmVudFRva2Vucy5vdXRwdXQgKyB0b2tlblVzYWdlLm91dHB1dCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gc2Vzc2lvbiBlbmRzXG4gICAgICovXG4gICAgU2Vzc2lvbkVuZDogYXN5bmMgKGV2ZW50OiBTZXNzaW9uRW5kRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb25JZCA9IGV2ZW50LnNlc3Npb25faWQgfHwgZXZlbnQuc2Vzc2lvbklkIHx8IFwiXCI7XG4gICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBjbGllbnQuZ2V0U2Vzc2lvblN0YXRlKHNlc3Npb25JZCk7XG4gICAgICBjb25zdCBlbmRSZWFzb24gPSBldmVudC5yZWFzb24gfHwgZXZlbnQuZW5kUmVhc29uO1xuXG4gICAgICBjb25zdCBzZXNzaW9uOiBTZXNzaW9uRGF0YSA9IHtcbiAgICAgICAgLi4uY3VycmVudFN0YXRlLFxuICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgIHNvdXJjZTogXCJjbGF1ZGUtY29kZVwiLFxuICAgICAgICBjd2Q6IGV2ZW50LmN3ZCxcbiAgICAgICAgcHJvamVjdFBhdGg6IGV2ZW50LmN3ZCxcbiAgICAgICAgcHJvamVjdE5hbWU6IGV2ZW50LmN3ZCA/IHBhdGguYmFzZW5hbWUoZXZlbnQuY3dkKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZW5kUmVhc29uLFxuICAgICAgICBtZXNzYWdlQ291bnQ6IGV2ZW50Lm1lc3NhZ2VDb3VudCxcbiAgICAgICAgdG9vbENhbGxDb3VudDogZXZlbnQudG9vbENhbGxDb3VudCxcbiAgICAgICAgdG9rZW5Vc2FnZTogZXZlbnQudG90YWxUb2tlblVzYWdlLFxuICAgICAgICBjb3N0RXN0aW1hdGU6IGV2ZW50LmNvc3RFc3RpbWF0ZSxcbiAgICAgICAgZW5kZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgY2xpZW50LnN5bmNTZXNzaW9uKHNlc3Npb24pO1xuICAgICAgY2xpZW50LmNsZWFyU2Vzc2lvblN0YXRlKHNlc3Npb25JZCk7XG5cbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgW2NsYXVkZS1jb2RlLXN5bmNdIFNlc3Npb24gc3luY2VkOiAke2V2ZW50Lm1lc3NhZ2VDb3VudCB8fCAwfSBtZXNzYWdlcywgJHtldmVudC50b29sQ2FsbENvdW50IHx8IDB9IHRvb2wgY2FsbHNgXG4gICAgICApO1xuICAgIH0sXG4gIH07XG59XG5cbi8vIERlZmF1bHQgZXhwb3J0IGZvciBDbGF1ZGUgQ29kZSBwbHVnaW4gc3lzdGVtXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVQbHVnaW47XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-code-sync",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.14",
|
|
4
4
|
"description": "Sync your Claude Code sessions to OpenSync dashboard. Track coding sessions, analyze tool usage, and monitor token consumption across projects.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|