@sendly/cli 3.4.0 ā 3.5.1
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/commands/sms/batch.d.ts +31 -2
- package/dist/commands/sms/batch.js +305 -214
- package/dist/commands/status.js +119 -42
- package/dist/lib/api-client.d.ts +13 -0
- package/dist/lib/api-client.js +76 -1
- package/dist/lib/base-command.js +8 -2
- package/oclif.manifest.json +41 -14
- package/package.json +2 -4
|
@@ -1,34 +1,35 @@
|
|
|
1
1
|
import { Flags } from "@oclif/core";
|
|
2
|
-
import { readFileSync } from "fs";
|
|
2
|
+
import { readFileSync, existsSync } from "fs";
|
|
3
|
+
import { basename } from "path";
|
|
3
4
|
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
4
5
|
import { apiClient } from "../../lib/api-client.js";
|
|
5
6
|
import { success, error, spinner, colors, json, isJsonMode, } from "../../lib/output.js";
|
|
6
7
|
export default class SmsBatch extends AuthenticatedCommand {
|
|
7
|
-
static description = "Send batch SMS messages";
|
|
8
|
+
static description = "Send batch SMS messages (uploads CSV to cloud for audit trail)";
|
|
8
9
|
static examples = [
|
|
9
|
-
"<%= config.bin %> sms batch --file recipients.
|
|
10
|
-
'<%= config.bin %> sms batch --
|
|
11
|
-
'<%= config.bin %> sms batch --
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
"<%= config.bin %> sms batch --file recipients.csv",
|
|
11
|
+
'<%= config.bin %> sms batch --file phones.csv --text "Hello everyone!"',
|
|
12
|
+
'<%= config.bin %> sms batch --to +15551234567,+15559876543 --text "Hello!"',
|
|
13
|
+
"<%= config.bin %> sms batch --file recipients.csv --dry-run",
|
|
14
|
+
'<%= config.bin %> sms batch --file phones.csv --text "Code: 123" --type transactional',
|
|
15
|
+
"<%= config.bin %> sms batch --reuse abc123-def456",
|
|
16
|
+
"<%= config.bin %> sms batch --history",
|
|
16
17
|
];
|
|
17
18
|
static flags = {
|
|
18
19
|
...AuthenticatedCommand.baseFlags,
|
|
19
20
|
file: Flags.string({
|
|
20
21
|
char: "F",
|
|
21
|
-
description: "
|
|
22
|
-
exclusive: ["to"],
|
|
22
|
+
description: "CSV file with phone numbers (and optional message text)",
|
|
23
|
+
exclusive: ["to", "reuse", "history"],
|
|
23
24
|
}),
|
|
24
25
|
to: Flags.string({
|
|
25
26
|
char: "t",
|
|
26
27
|
description: "Comma-separated recipient phone numbers (E.164 format)",
|
|
27
|
-
exclusive: ["file"],
|
|
28
|
+
exclusive: ["file", "reuse", "history"],
|
|
28
29
|
}),
|
|
29
30
|
text: Flags.string({
|
|
30
31
|
char: "m",
|
|
31
|
-
description: "Message text (
|
|
32
|
+
description: "Message text (required with --to, optional with --file if CSV has text column)",
|
|
32
33
|
}),
|
|
33
34
|
from: Flags.string({
|
|
34
35
|
char: "f",
|
|
@@ -44,44 +45,118 @@ export default class SmsBatch extends AuthenticatedCommand {
|
|
|
44
45
|
description: "Preview batch without sending (validates access, shows cost and compliance breakdown)",
|
|
45
46
|
default: false,
|
|
46
47
|
}),
|
|
48
|
+
reuse: Flags.string({
|
|
49
|
+
description: "Re-use a previous batch upload by ID (see --history)",
|
|
50
|
+
exclusive: ["file", "to", "history"],
|
|
51
|
+
}),
|
|
52
|
+
history: Flags.boolean({
|
|
53
|
+
description: "Show recent batch upload history",
|
|
54
|
+
exclusive: ["file", "to", "reuse"],
|
|
55
|
+
default: false,
|
|
56
|
+
}),
|
|
47
57
|
};
|
|
48
58
|
async run() {
|
|
49
59
|
const { flags } = await this.parse(SmsBatch);
|
|
50
|
-
|
|
51
|
-
|
|
60
|
+
// Handle history subcommand
|
|
61
|
+
if (flags.history) {
|
|
62
|
+
return this.showHistory();
|
|
63
|
+
}
|
|
64
|
+
// Handle reuse subcommand
|
|
65
|
+
if (flags.reuse) {
|
|
66
|
+
return this.reuseBatch(flags.reuse, flags);
|
|
67
|
+
}
|
|
68
|
+
// Handle --to flag (inline recipients, no upload needed)
|
|
69
|
+
if (flags.to) {
|
|
70
|
+
return this.sendInlineRecipients(flags);
|
|
71
|
+
}
|
|
72
|
+
// Handle --file flag (upload to Supabase)
|
|
52
73
|
if (flags.file) {
|
|
53
|
-
|
|
74
|
+
return this.uploadAndSend(flags);
|
|
54
75
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
76
|
+
error("Either --file, --to, --reuse, or --history is required");
|
|
77
|
+
this.exit(1);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Show batch upload history
|
|
81
|
+
*/
|
|
82
|
+
async showHistory() {
|
|
83
|
+
const spin = spinner("Fetching batch history...").start();
|
|
84
|
+
try {
|
|
85
|
+
const response = await apiClient.get("/api/cli/batch/history", { limit: 15 });
|
|
86
|
+
spin.stop();
|
|
87
|
+
if (isJsonMode()) {
|
|
88
|
+
json(response);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (response.uploads.length === 0) {
|
|
92
|
+
console.log(colors.dim("\nNo batch uploads found.\n"));
|
|
93
|
+
console.log("Upload a CSV file with: sendly sms batch --file your.csv");
|
|
94
|
+
return;
|
|
59
95
|
}
|
|
60
|
-
|
|
96
|
+
console.log(colors.bold("\nš Recent Batch Uploads\n"));
|
|
97
|
+
console.log(colors.dim("ā".repeat(80)));
|
|
98
|
+
for (const upload of response.uploads) {
|
|
99
|
+
const date = new Date(upload.createdAt).toLocaleString();
|
|
100
|
+
const size = this.formatBytes(upload.size);
|
|
101
|
+
const source = upload.metadata?.source === "cli" ? "CLI" : "Web";
|
|
102
|
+
console.log(`${colors.info(upload.id.slice(0, 8))} ${upload.filename}`);
|
|
103
|
+
console.log(colors.dim(` ${date} | ${size} | ${upload.metadata?.validCount || 0} valid recipients | ${source}`));
|
|
104
|
+
}
|
|
105
|
+
console.log(colors.dim("ā".repeat(80)));
|
|
106
|
+
console.log(colors.dim("\nRe-use a batch: sendly sms batch --reuse <id>"));
|
|
61
107
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
108
|
+
catch (err) {
|
|
109
|
+
spin.stop();
|
|
110
|
+
throw err;
|
|
65
111
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Re-use a previous batch upload
|
|
115
|
+
*/
|
|
116
|
+
async reuseBatch(uploadId, flags) {
|
|
117
|
+
const spin = spinner("Fetching batch data...").start();
|
|
118
|
+
try {
|
|
119
|
+
const response = await apiClient.get(`/api/cli/batch/reuse/${uploadId}`);
|
|
120
|
+
spin.stop();
|
|
121
|
+
console.log(colors.success(`\nā Loaded batch: ${response.upload.filename}`));
|
|
122
|
+
console.log(colors.dim(` ${response.validation.validCount} valid recipients from ${response.validation.totalRows} rows`));
|
|
123
|
+
// Apply shared text if provided
|
|
124
|
+
let messages = response.recipients;
|
|
125
|
+
if (flags.text) {
|
|
126
|
+
messages = messages.map((r) => ({
|
|
127
|
+
to: r.to,
|
|
128
|
+
text: r.text || flags.text,
|
|
129
|
+
}));
|
|
130
|
+
}
|
|
131
|
+
// Validate all messages have text
|
|
132
|
+
const missingText = messages.filter((m) => !m.text?.trim());
|
|
133
|
+
if (missingText.length > 0) {
|
|
134
|
+
error(`${missingText.length} recipients missing message text. Use --text to provide a default.`);
|
|
135
|
+
this.exit(1);
|
|
136
|
+
}
|
|
137
|
+
// Proceed with preview or send
|
|
138
|
+
await this.previewOrSend(messages, flags, response.upload.id);
|
|
72
139
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
this.exit(1);
|
|
140
|
+
catch (err) {
|
|
141
|
+
spin.stop();
|
|
142
|
+
throw err;
|
|
77
143
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Send to inline recipients (--to flag)
|
|
147
|
+
* This path doesn't upload to Supabase since it's just a few numbers
|
|
148
|
+
*/
|
|
149
|
+
async sendInlineRecipients(flags) {
|
|
150
|
+
if (!flags.text) {
|
|
151
|
+
error("--text is required when using --to");
|
|
82
152
|
this.exit(1);
|
|
83
153
|
}
|
|
84
|
-
|
|
154
|
+
const phones = flags.to.split(",").map((p) => p.trim());
|
|
155
|
+
const messages = phones.map((phone) => ({
|
|
156
|
+
to: phone.startsWith("+") ? phone : `+${phone}`,
|
|
157
|
+
text: flags.text,
|
|
158
|
+
}));
|
|
159
|
+
// Validate phone numbers
|
|
85
160
|
for (const msg of messages) {
|
|
86
161
|
if (!/^\+[1-9]\d{1,14}$/.test(msg.to)) {
|
|
87
162
|
error(`Invalid phone number: ${msg.to}`, {
|
|
@@ -89,119 +164,98 @@ export default class SmsBatch extends AuthenticatedCommand {
|
|
|
89
164
|
});
|
|
90
165
|
this.exit(1);
|
|
91
166
|
}
|
|
92
|
-
if (!msg.text?.trim()) {
|
|
93
|
-
error(`Empty message text for ${msg.to}`, {
|
|
94
|
-
hint: "Use --text to provide a shared message for all recipients",
|
|
95
|
-
});
|
|
96
|
-
this.exit(1);
|
|
97
|
-
}
|
|
98
167
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
// Compliance check results
|
|
144
|
-
if (preview.compliance) {
|
|
145
|
-
console.log(colors.bold("\nš”ļø Compliance Check:\n"));
|
|
146
|
-
console.log(` Message Type: ${preview.compliance.messageType.toUpperCase()}`);
|
|
147
|
-
if (preview.compliance.shaftBlocked > 0) {
|
|
148
|
-
console.log(colors.error(` SHAFT Blocked: ${preview.compliance.shaftBlocked} messages`));
|
|
149
|
-
for (const msg of preview.compliance.shaftBlockedMessages.slice(0, 3)) {
|
|
150
|
-
console.log(colors.dim(` āā ${msg.to}: ${msg.category} (${msg.matchedTerms.join(", ")})`));
|
|
151
|
-
}
|
|
152
|
-
if (preview.compliance.shaftBlockedMessages.length > 3) {
|
|
153
|
-
console.log(colors.dim(` ... and ${preview.compliance.shaftBlockedMessages.length - 3} more`));
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
else {
|
|
157
|
-
console.log(colors.success(" SHAFT Check: ā All messages pass content filter"));
|
|
158
|
-
}
|
|
159
|
-
if (preview.compliance.messageType === "marketing") {
|
|
160
|
-
if (preview.compliance.quietHoursRescheduled > 0) {
|
|
161
|
-
console.log(colors.warning(` Quiet Hours: ${preview.compliance.quietHoursRescheduled} messages will be rescheduled`));
|
|
162
|
-
for (const msg of preview.compliance.quietHoursBlockedMessages.slice(0, 3)) {
|
|
163
|
-
const nextTime = msg.nextAllowedTime
|
|
164
|
-
? new Date(msg.nextAllowedTime).toLocaleString()
|
|
165
|
-
: "next available window";
|
|
166
|
-
console.log(colors.dim(` āā ${msg.to}: ${msg.recipientTimezone} ā ${nextTime}`));
|
|
167
|
-
}
|
|
168
|
-
if (preview.compliance.quietHoursBlockedMessages.length > 3) {
|
|
169
|
-
console.log(colors.dim(` ... and ${preview.compliance.quietHoursBlockedMessages.length - 3} more`));
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
console.log(colors.success(" Quiet Hours: ā All recipients within allowed hours"));
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
console.log(colors.dim(" Quiet Hours: Bypassed (transactional message)"));
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
// Warnings
|
|
181
|
-
if (preview.warnings.length > 0) {
|
|
182
|
-
console.log(colors.warning("\nā ļø Warnings:"));
|
|
183
|
-
for (const w of preview.warnings) {
|
|
184
|
-
console.log(` ⢠${w}`);
|
|
185
|
-
}
|
|
168
|
+
await this.previewOrSend(messages, flags);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Upload CSV to Supabase and send
|
|
172
|
+
*/
|
|
173
|
+
async uploadAndSend(flags) {
|
|
174
|
+
const filePath = flags.file;
|
|
175
|
+
// Check file exists
|
|
176
|
+
if (!existsSync(filePath)) {
|
|
177
|
+
error(`File not found: ${filePath}`);
|
|
178
|
+
this.exit(1);
|
|
179
|
+
}
|
|
180
|
+
// Validate file extension
|
|
181
|
+
if (!filePath.endsWith(".csv")) {
|
|
182
|
+
error("Only CSV files are supported", {
|
|
183
|
+
hint: "Convert your file to CSV format with columns: phone,message",
|
|
184
|
+
});
|
|
185
|
+
this.exit(1);
|
|
186
|
+
}
|
|
187
|
+
// Read file
|
|
188
|
+
const buffer = readFileSync(filePath);
|
|
189
|
+
const filename = basename(filePath);
|
|
190
|
+
// Check file size (5MB limit)
|
|
191
|
+
if (buffer.length > 5 * 1024 * 1024) {
|
|
192
|
+
error("File too large (max 5MB)", {
|
|
193
|
+
hint: "Split your CSV into smaller files",
|
|
194
|
+
});
|
|
195
|
+
this.exit(1);
|
|
196
|
+
}
|
|
197
|
+
const spin = spinner(`Uploading ${filename}...`).start();
|
|
198
|
+
try {
|
|
199
|
+
// Upload to Supabase via CLI endpoint
|
|
200
|
+
const response = await apiClient.uploadFile("/api/cli/batch/upload", { buffer, filename, mimetype: "text/csv" });
|
|
201
|
+
spin.stop();
|
|
202
|
+
// Show upload summary
|
|
203
|
+
console.log(colors.success(`\nā Uploaded: ${response.upload.filename}`));
|
|
204
|
+
console.log(colors.dim(` Upload ID: ${response.upload.id}`));
|
|
205
|
+
console.log(colors.dim(` ${response.validation.validCount} valid / ${response.validation.invalidCount} invalid / ${response.validation.duplicatesRemoved} duplicates removed`));
|
|
206
|
+
// Show validation errors if any
|
|
207
|
+
if (response.errors.length > 0) {
|
|
208
|
+
console.log(colors.warning(`\nā ļø Validation errors:`));
|
|
209
|
+
for (const err of response.errors.slice(0, 5)) {
|
|
210
|
+
console.log(colors.dim(` Row ${err.row}: ${err.phone} - ${err.error}`));
|
|
186
211
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
console.log(colors.error(`\nā Blocked Messages (${preview.blockedMessages.length} total):`));
|
|
190
|
-
for (const b of preview.blockedMessages.slice(0, 5)) {
|
|
191
|
-
console.log(` ${b.to}: ${b.reason}`);
|
|
192
|
-
}
|
|
193
|
-
if (preview.blockedMessages.length > 5) {
|
|
194
|
-
console.log(colors.dim(` ... and ${preview.blockedMessages.length - 5} more`));
|
|
195
|
-
}
|
|
212
|
+
if (response.hasMoreErrors) {
|
|
213
|
+
console.log(colors.dim(` ... and ${response.validation.invalidCount - 5} more errors`));
|
|
196
214
|
}
|
|
197
|
-
console.log("\n" + colors.dim("No messages were sent. Remove --dry-run to send."));
|
|
198
|
-
return;
|
|
199
215
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
216
|
+
if (response.recipients.length === 0) {
|
|
217
|
+
error("No valid recipients found in CSV");
|
|
218
|
+
this.exit(1);
|
|
219
|
+
}
|
|
220
|
+
// Apply shared text if provided
|
|
221
|
+
let messages = response.recipients;
|
|
222
|
+
if (flags.text) {
|
|
223
|
+
messages = messages.map((r) => ({
|
|
224
|
+
to: r.to,
|
|
225
|
+
text: r.text || flags.text,
|
|
226
|
+
}));
|
|
227
|
+
}
|
|
228
|
+
// Validate all messages have text
|
|
229
|
+
const missingText = messages.filter((m) => !m.text?.trim());
|
|
230
|
+
if (missingText.length > 0) {
|
|
231
|
+
error(`${missingText.length} recipients missing message text. Use --text to provide a default.`);
|
|
232
|
+
console.log(colors.dim("\nCSV should have columns: phone,message OR use --text flag"));
|
|
233
|
+
this.exit(1);
|
|
203
234
|
}
|
|
235
|
+
// Proceed with preview or send
|
|
236
|
+
await this.previewOrSend(messages, flags, response.upload.id);
|
|
204
237
|
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
spin.stop();
|
|
240
|
+
throw err;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Preview or send the batch
|
|
245
|
+
*/
|
|
246
|
+
async previewOrSend(messages, flags, uploadId) {
|
|
247
|
+
// Check batch size
|
|
248
|
+
if (messages.length > 1000) {
|
|
249
|
+
error("Batch size cannot exceed 1000 messages", {
|
|
250
|
+
hint: "Split your messages into smaller batches",
|
|
251
|
+
});
|
|
252
|
+
this.exit(1);
|
|
253
|
+
}
|
|
254
|
+
// Handle dry-run mode
|
|
255
|
+
if (flags["dry-run"]) {
|
|
256
|
+
return this.showPreview(messages, flags);
|
|
257
|
+
}
|
|
258
|
+
// Send the batch
|
|
205
259
|
const spin = spinner(`Sending ${messages.length} messages...`);
|
|
206
260
|
spin.start();
|
|
207
261
|
try {
|
|
@@ -209,6 +263,7 @@ export default class SmsBatch extends AuthenticatedCommand {
|
|
|
209
263
|
messages,
|
|
210
264
|
messageType: flags.type,
|
|
211
265
|
...(flags.from && { from: flags.from }),
|
|
266
|
+
...(uploadId && { uploadId }), // Link to file upload for audit trail
|
|
212
267
|
});
|
|
213
268
|
spin.stop();
|
|
214
269
|
if (isJsonMode()) {
|
|
@@ -262,84 +317,120 @@ export default class SmsBatch extends AuthenticatedCommand {
|
|
|
262
317
|
throw err;
|
|
263
318
|
}
|
|
264
319
|
}
|
|
265
|
-
|
|
320
|
+
/**
|
|
321
|
+
* Show batch preview (dry-run mode)
|
|
322
|
+
*/
|
|
323
|
+
async showPreview(messages, flags) {
|
|
324
|
+
const spin = spinner("Analyzing batch...").start();
|
|
266
325
|
try {
|
|
267
|
-
const
|
|
268
|
-
|
|
269
|
-
if (
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
326
|
+
const preview = await apiClient.post("/api/v1/messages/batch/preview", { messages, messageType: flags.type });
|
|
327
|
+
spin.stop();
|
|
328
|
+
if (isJsonMode()) {
|
|
329
|
+
json(preview);
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
// Show comprehensive preview
|
|
333
|
+
console.log(colors.bold("\nš Batch Preview (Dry Run)\n"));
|
|
334
|
+
// Summary table
|
|
335
|
+
console.log(colors.dim("ā".repeat(50)));
|
|
336
|
+
console.log(`Total messages: ${preview.total}`);
|
|
337
|
+
console.log(`Sendable: ${colors.success(String(preview.sendable))}`);
|
|
338
|
+
console.log(`Blocked: ${preview.blocked > 0 ? colors.error(String(preview.blocked)) : "0"}`);
|
|
339
|
+
console.log(`Duplicates removed: ${preview.duplicates}`);
|
|
340
|
+
console.log(colors.dim("ā".repeat(50)));
|
|
341
|
+
// Credits
|
|
342
|
+
console.log(`\nCredits needed: ${preview.creditsNeeded}`);
|
|
343
|
+
console.log(`Your balance: ${preview.creditBalance}`);
|
|
344
|
+
if (!preview.hasSufficientCredits) {
|
|
345
|
+
console.log(colors.error(`ā ļø Insufficient credits! Need ${preview.creditsNeeded - preview.creditBalance} more.`));
|
|
346
|
+
}
|
|
347
|
+
// Access info
|
|
348
|
+
console.log(`\nAPI Key type: ${preview.keyType.toUpperCase()}`);
|
|
349
|
+
console.log(`Write access: ${preview.hasWriteScope ? "ā" : "ā"}`);
|
|
350
|
+
console.log(`Domestic (US/CA): ${preview.messagingProfile.canSendDomestic ? "ā" : "ā"}`);
|
|
351
|
+
console.log(`International: ${preview.messagingProfile.canSendInternational ? "ā" : "ā"}`);
|
|
352
|
+
// Country breakdown
|
|
353
|
+
const countries = Object.entries(preview.byCountry);
|
|
354
|
+
if (countries.length > 0) {
|
|
355
|
+
console.log(colors.bold("\nš By Country:\n"));
|
|
356
|
+
for (const [country, data] of countries) {
|
|
357
|
+
const status = data.allowed ? colors.success("ā") : colors.error("ā");
|
|
358
|
+
console.log(` ${status} ${country}: ${data.count} msgs, ${data.credits} credits (${data.tier})`);
|
|
359
|
+
if (!data.allowed && data.blockedReason) {
|
|
360
|
+
console.log(colors.dim(` āā ${data.blockedReason}`));
|
|
361
|
+
}
|
|
279
362
|
}
|
|
280
|
-
error("Invalid JSON format", {
|
|
281
|
-
hint: "Expected array of {to, text} objects or {messages: [...]}",
|
|
282
|
-
});
|
|
283
|
-
this.exit(1);
|
|
284
363
|
}
|
|
285
|
-
//
|
|
286
|
-
if (
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
if (phone && (phone.startsWith("+") || /^\d/.test(phone))) {
|
|
310
|
-
messages.push({
|
|
311
|
-
to: phone.startsWith("+") ? phone : `+${phone}`,
|
|
312
|
-
text: parts.length >= 2
|
|
313
|
-
? parts.slice(1).join(",").trim().replace(/"/g, "") ||
|
|
314
|
-
undefined
|
|
315
|
-
: undefined,
|
|
316
|
-
});
|
|
364
|
+
// Compliance check results
|
|
365
|
+
if (preview.compliance) {
|
|
366
|
+
console.log(colors.bold("\nš”ļø Compliance Check:\n"));
|
|
367
|
+
console.log(` Message Type: ${preview.compliance.messageType.toUpperCase()}`);
|
|
368
|
+
if (preview.compliance.shaftBlocked > 0) {
|
|
369
|
+
console.log(colors.error(` SHAFT Blocked: ${preview.compliance.shaftBlocked} messages`));
|
|
370
|
+
for (const msg of preview.compliance.shaftBlockedMessages.slice(0, 3)) {
|
|
371
|
+
console.log(colors.dim(` āā ${msg.to}: ${msg.category} (${msg.matchedTerms.join(", ")})`));
|
|
372
|
+
}
|
|
373
|
+
if (preview.compliance.shaftBlockedMessages.length > 3) {
|
|
374
|
+
console.log(colors.dim(` ... and ${preview.compliance.shaftBlockedMessages.length - 3} more`));
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
console.log(colors.success(" SHAFT Check: ā All messages pass content filter"));
|
|
379
|
+
}
|
|
380
|
+
if (preview.compliance.messageType === "marketing") {
|
|
381
|
+
if (preview.compliance.quietHoursRescheduled > 0) {
|
|
382
|
+
console.log(colors.warning(` Quiet Hours: ${preview.compliance.quietHoursRescheduled} messages will be rescheduled`));
|
|
383
|
+
for (const msg of preview.compliance.quietHoursBlockedMessages.slice(0, 3)) {
|
|
384
|
+
const nextTime = msg.nextAllowedTime
|
|
385
|
+
? new Date(msg.nextAllowedTime).toLocaleString()
|
|
386
|
+
: "next available window";
|
|
387
|
+
console.log(colors.dim(` āā ${msg.to}: ${msg.recipientTimezone} ā ${nextTime}`));
|
|
317
388
|
}
|
|
389
|
+
if (preview.compliance.quietHoursBlockedMessages.length > 3) {
|
|
390
|
+
console.log(colors.dim(` ... and ${preview.compliance.quietHoursBlockedMessages.length - 3} more`));
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
console.log(colors.success(" Quiet Hours: ā All recipients within allowed hours"));
|
|
318
395
|
}
|
|
319
396
|
}
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
hint: "Use .json or .csv file",
|
|
324
|
-
});
|
|
325
|
-
this.exit(1);
|
|
326
|
-
}
|
|
327
|
-
catch (err) {
|
|
328
|
-
if (err.code === "ENOENT") {
|
|
329
|
-
error(`File not found: ${filePath}`);
|
|
397
|
+
else {
|
|
398
|
+
console.log(colors.dim(" Quiet Hours: Bypassed (transactional message)"));
|
|
399
|
+
}
|
|
330
400
|
}
|
|
331
|
-
|
|
332
|
-
|
|
401
|
+
// Warnings
|
|
402
|
+
if (preview.warnings.length > 0) {
|
|
403
|
+
console.log(colors.warning("\nā ļø Warnings:"));
|
|
404
|
+
for (const w of preview.warnings) {
|
|
405
|
+
console.log(` ⢠${w}`);
|
|
406
|
+
}
|
|
333
407
|
}
|
|
334
|
-
|
|
335
|
-
|
|
408
|
+
// Blocked messages (first 5)
|
|
409
|
+
if (preview.blockedMessages.length > 0) {
|
|
410
|
+
console.log(colors.error(`\nā Blocked Messages (${preview.blockedMessages.length} total):`));
|
|
411
|
+
for (const b of preview.blockedMessages.slice(0, 5)) {
|
|
412
|
+
console.log(` ${b.to}: ${b.reason}`);
|
|
413
|
+
}
|
|
414
|
+
if (preview.blockedMessages.length > 5) {
|
|
415
|
+
console.log(colors.dim(` ... and ${preview.blockedMessages.length - 5} more`));
|
|
416
|
+
}
|
|
336
417
|
}
|
|
337
|
-
|
|
418
|
+
console.log("\n" + colors.dim("No messages were sent. Remove --dry-run to send."));
|
|
419
|
+
}
|
|
420
|
+
catch (err) {
|
|
421
|
+
spin.stop();
|
|
422
|
+
throw err;
|
|
338
423
|
}
|
|
339
424
|
}
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
425
|
+
/**
|
|
426
|
+
* Format bytes to human readable string
|
|
427
|
+
*/
|
|
428
|
+
formatBytes(bytes) {
|
|
429
|
+
if (bytes < 1024)
|
|
430
|
+
return `${bytes} B`;
|
|
431
|
+
if (bytes < 1024 * 1024)
|
|
432
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
433
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
343
434
|
}
|
|
344
435
|
}
|
|
345
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbWFuZHMvc21zL2JhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLElBQUksQ0FBQztBQUNsQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLE9BQU8sRUFDUCxLQUFLLEVBQ0wsT0FBTyxFQUNQLE1BQU0sRUFDTixJQUFJLEVBQ0osVUFBVSxHQUNYLE1BQU0scUJBQXFCLENBQUM7QUFnRjdCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sUUFBUyxTQUFRLG9CQUFvQjtJQUN4RCxNQUFNLENBQUMsV0FBVyxHQUFHLHlCQUF5QixDQUFDO0lBRS9DLE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsb0RBQW9EO1FBQ3BELHFGQUFxRjtRQUNyRiw2RUFBNkU7UUFDN0UsbUVBQW1FO1FBQ25FLHlEQUF5RDtRQUN6RCxxRUFBcUU7UUFDckUsNEZBQTRGO0tBQzdGLENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTO1FBQ2pDLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2pCLElBQUksRUFBRSxHQUFHO1lBQ1QsV0FBVyxFQUFFLGlEQUFpRDtZQUM5RCxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUM7U0FDbEIsQ0FBQztRQUNGLEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2YsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsd0RBQXdEO1lBQ3JFLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQztTQUNwQixDQUFDO1FBQ0YsSUFBSSxFQUFFLEtB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QUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEQsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAgc3VjY2VzcyxcbiAgZXJyb3IsXG4gIHNwaW5uZXIsXG4gIGNvbG9ycyxcbiAganNvbixcbiAgaXNKc29uTW9kZSxcbn0gZnJvbSBcIi4uLy4uL2xpYi9vdXRwdXQuanNcIjtcblxuaW50ZXJmYWNlIEJhdGNoTWVzc2FnZSB7XG4gIHRvOiBzdHJpbmc7XG4gIHRleHQ/OiBzdHJpbmc7IC8vIE9wdGlvbmFsIC0gY2FuIGJlIHByb3ZpZGVkIHZpYSAtLXRleHQgZmxhZ1xufVxuXG5pbnRlcmZhY2UgQmF0Y2hSZXNwb25zZSB7XG4gIGJhdGNoSWQ6IHN0cmluZztcbiAgdG90YWw6IG51bWJlcjtcbiAgc2VudDogbnVtYmVyO1xuICBxdWV1ZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIGNyZWRpdHNVc2VkOiBudW1iZXI7XG4gIGNyZWRpdHNSZWZ1bmRlZDogbnVtYmVyO1xuICBzdGF0dXM6IHN0cmluZztcbiAgbWVzc2FnZXM/OiBBcnJheTx7XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICBpZDogc3RyaW5nO1xuICAgIHRvOiBzdHJpbmc7XG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgZXJyb3I/OiBzdHJpbmc7XG4gIH0+O1xufVxuXG5pbnRlcmZhY2UgQmF0Y2hQcmV2aWV3UmVzcG9uc2Uge1xuICB0b3RhbDogbnVtYmVyO1xuICBzZW5kYWJsZTogbnVtYmVyO1xuICBibG9ja2VkOiBudW1iZXI7XG4gIGR1cGxpY2F0ZXM6IG51bWJlcjtcbiAgY3JlZGl0c05lZWRlZDogbnVtYmVyO1xuICBjcmVkaXRCYWxhbmNlOiBudW1iZXI7XG4gIGhhc1N1ZmZpY2llbnRDcmVkaXRzOiBib29sZWFuO1xuICBrZXlUeXBlOiBcInRlc3RcIiB8IFwibGl2ZVwiO1xuICBrZXlTY29wZXM6IHN0cmluZ1tdO1xuICBoYXNXcml0ZVNjb3BlOiBib29sZWFuO1xuICBtZXNzYWdpbmdQcm9maWxlOiB7XG4gICAgaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgY2FuU2VuZERvbWVzdGljOiBib29sZWFuO1xuICAgIGNhblNlbmRJbnRlcm5hdGlvbmFsOiBib29sZWFuO1xuICAgIHZlcmlmaWNhdGlvblN0YXR1czogc3RyaW5nIHwgbnVsbDtcbiAgICB2ZXJpZmljYXRpb25UeXBlOiBzdHJpbmcgfCBudWxsO1xuICB9O1xuICBieUNvdW50cnk6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAge1xuICAgICAgY291bnQ6IG51bWJlcjtcbiAgICAgIGNyZWRpdHM6IG51bWJlcjtcbiAgICAgIHRpZXI6IHN0cmluZztcbiAgICAgIGFsbG93ZWQ6IGJvb2xlYW47XG4gICAgICBibG9ja2VkUmVhc29uPzogc3RyaW5nO1xuICAgIH1cbiAgPjtcbiAgYmxvY2tlZE1lc3NhZ2VzOiBBcnJheTx7XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICB0bzogc3RyaW5nO1xuICAgIHJlYXNvbjogc3RyaW5nO1xuICB9PjtcbiAgY29tcGxpYW5jZToge1xuICAgIG1lc3NhZ2VUeXBlOiBcIm1hcmtldGluZ1wiIHwgXCJ0cmFuc2FjdGlvbmFsXCI7XG4gICAgc2hhZnRCbG9ja2VkOiBudW1iZXI7XG4gICAgcXVpZXRIb3Vyc0Jsb2NrZWQ6IG51bWJlcjtcbiAgICBxdWlldEhvdXJzUmVzY2hlZHVsZWQ6IG51bWJlcjtcbiAgICBzaGFmdEJsb2NrZWRNZXNzYWdlczogQXJyYXk8e1xuICAgICAgaW5kZXg6IG51bWJlcjtcbiAgICAgIHRvOiBzdHJpbmc7XG4gICAgICBjYXRlZ29yeTogc3RyaW5nO1xuICAgICAgbWF0Y2hlZFRlcm1zOiBzdHJpbmdbXTtcbiAgICB9PjtcbiAgICBxdWlldEhvdXJzQmxvY2tlZE1lc3NhZ2VzOiBBcnJheTx7XG4gICAgICBpbmRleDogbnVtYmVyO1xuICAgICAgdG86IHN0cmluZztcbiAgICAgIHJlY2lwaWVudFRpbWV6b25lOiBzdHJpbmc7XG4gICAgICByZWNpcGllbnRMb2NhbFRpbWU6IHN0cmluZztcbiAgICAgIG5leHRBbGxvd2VkVGltZT86IHN0cmluZztcbiAgICB9PjtcbiAgfTtcbiAgd2FybmluZ3M6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTbXNCYXRjaCBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID0gXCJTZW5kIGJhdGNoIFNNUyBtZXNzYWdlc1wiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHNtcyBiYXRjaCAtLWZpbGUgcmVjaXBpZW50cy5qc29uXCIsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHNtcyBiYXRjaCAtLXRvICsxNTU1MTIzNDU2NywrMTU1NTk4NzY1NDMgLS10ZXh0IFwiSGVsbG8gZXZlcnlvbmUhXCInLFxuICAgICc8JT0gY29uZmlnLmJpbiAlPiBzbXMgYmF0Y2ggLS1maWxlIHBob25lcy5jc3YgLS10ZXh0IFwiWW91ciBvcmRlciBpcyByZWFkeSFcIicsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHNtcyBiYXRjaCAtLWZpbGUgcmVjaXBpZW50cy5jc3YgLS1mcm9tIFwiU2VuZGx5XCInLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gc21zIGJhdGNoIC0tZmlsZSBtZXNzYWdlcy5qc29uIC0tanNvblwiLFxuICAgICc8JT0gY29uZmlnLmJpbiAlPiBzbXMgYmF0Y2ggLS1maWxlIHBob25lcy5jc3YgLS10ZXh0IFwiSGlcIiAtLWRyeS1ydW4nLFxuICAgICc8JT0gY29uZmlnLmJpbiAlPiBzbXMgYmF0Y2ggLS1maWxlIHBob25lcy5jc3YgLS10ZXh0IFwiWW91ciBjb2RlOiAxMjNcIiAtLXR5cGUgdHJhbnNhY3Rpb25hbCcsXG4gIF07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgICBmaWxlOiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJGXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJKU09OIGZpbGUgd2l0aCBtZXNzYWdlcyBhcnJheSBbe3RvLCB0ZXh0fSwgLi4uXVwiLFxuICAgICAgZXhjbHVzaXZlOiBbXCJ0b1wiXSxcbiAgICB9KSxcbiAgICB0bzogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGNoYXI6IFwidFwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiQ29tbWEtc2VwYXJhdGVkIHJlY2lwaWVudCBwaG9uZSBudW1iZXJzIChFLjE2NCBmb3JtYXQpXCIsXG4gICAgICBleGNsdXNpdmU6IFtcImZpbGVcIl0sXG4gICAgfSksXG4gICAgdGV4dDogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGNoYXI6IFwibVwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiTWVzc2FnZSB0ZXh0ICh3b3JrcyB3aXRoIC0tdG8gb3IgLS1maWxlIGZvciBwaG9uZS1vbmx5IGxpc3RzKVwiLFxuICAgIH0pLFxuICAgIGZyb206IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcImZcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlNlbmRlciBJRCBvciBwaG9uZSBudW1iZXIgZm9yIGFsbCBtZXNzYWdlc1wiLFxuICAgIH0pLFxuICAgIHR5cGU6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJNZXNzYWdlIHR5cGU6IG1hcmtldGluZyAoZGVmYXVsdCkgb3IgdHJhbnNhY3Rpb25hbC4gVHJhbnNhY3Rpb25hbCBieXBhc3NlcyBxdWlldCBob3Vycy5cIixcbiAgICAgIG9wdGlvbnM6IFtcIm1hcmtldGluZ1wiLCBcInRyYW5zYWN0aW9uYWxcIl0sXG4gICAgICBkZWZhdWx0OiBcIm1hcmtldGluZ1wiLFxuICAgIH0pLFxuICAgIFwiZHJ5LXJ1blwiOiBGbGFncy5ib29sZWFuKHtcbiAgICAgIGNoYXI6IFwiZFwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUHJldmlldyBiYXRjaCB3aXRob3V0IHNlbmRpbmcgKHZhbGlkYXRlcyBhY2Nlc3MsIHNob3dzIGNvc3QgYW5kIGNvbXBsaWFuY2UgYnJlYWtkb3duKVwiLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgfSksXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZmxhZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoU21zQmF0Y2gpO1xuXG4gICAgbGV0IG1lc3NhZ2VzOiBCYXRjaE1lc3NhZ2VbXSA9IFtdO1xuXG4gICAgLy8gUGFyc2UgbWVzc2FnZXMgZnJvbSBmaWxlIG9yIGZsYWdzXG4gICAgaWYgKGZsYWdzLmZpbGUpIHtcbiAgICAgIG1lc3NhZ2VzID0gdGhpcy5wYXJzZU1lc3NhZ2VzRnJvbUZpbGUoZmxhZ3MuZmlsZSk7XG4gICAgfSBlbHNlIGlmIChmbGFncy50bykge1xuICAgICAgaWYgKCFmbGFncy50ZXh0KSB7XG4gICAgICAgIGVycm9yKFwiLS10ZXh0IGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgLS10b1wiKTtcbiAgICAgICAgdGhpcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgbWVzc2FnZXMgPSB0aGlzLnBhcnNlTWVzc2FnZXNGcm9tRmxhZ3MoZmxhZ3MudG8sIGZsYWdzLnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcihcIkVpdGhlciAtLWZpbGUgb3IgLS10byBpcyByZXF1aXJlZFwiKTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBzaGFyZWQgdGV4dCBmcm9tIC0tdGV4dCBmbGFnIHRvIG1lc3NhZ2VzIHdpdGhvdXQgdGV4dFxuICAgIGlmIChmbGFncy50ZXh0KSB7XG4gICAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLm1hcCgobXNnKSA9PiAoe1xuICAgICAgICB0bzogbXNnLnRvLFxuICAgICAgICB0ZXh0OiBtc2cudGV4dCB8fCBmbGFncy50ZXh0LFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG1lc3NhZ2VzXG4gICAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZXJyb3IoXCJObyBtZXNzYWdlcyB0byBzZW5kXCIpO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGlmIChtZXNzYWdlcy5sZW5ndGggPiAxMDAwKSB7XG4gICAgICBlcnJvcihcIkJhdGNoIHNpemUgY2Fubm90IGV4Y2VlZCAxMDAwIG1lc3NhZ2VzXCIsIHtcbiAgICAgICAgaGludDogXCJTcGxpdCB5b3VyIG1lc3NhZ2VzIGludG8gc21hbGxlciBiYXRjaGVzXCIsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBlYWNoIG1lc3NhZ2VcbiAgICBmb3IgKGNvbnN0IG1zZyBvZiBtZXNzYWdlcykge1xuICAgICAgaWYgKCEvXlxcK1sxLTldXFxkezEsMTR9JC8udGVzdChtc2cudG8pKSB7XG4gICAgICAgIGVycm9yKGBJbnZhbGlkIHBob25lIG51bWJlcjogJHttc2cudG99YCwge1xuICAgICAgICAgIGhpbnQ6IFwiVXNlIEUuMTY0IGZvcm1hdDogKzE1NTUxMjM0NTY3XCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBpZiAoIW1zZy50ZXh0Py50cmltKCkpIHtcbiAgICAgICAgZXJyb3IoYEVtcHR5IG1lc3NhZ2UgdGV4dCBmb3IgJHttc2cudG99YCwge1xuICAgICAgICAgIGhpbnQ6IFwiVXNlIC0tdGV4dCB0byBwcm92aWRlIGEgc2hhcmVkIG1lc3NhZ2UgZm9yIGFsbCByZWNpcGllbnRzXCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGRyeS1ydW4gbW9kZVxuICAgIGlmIChmbGFnc1tcImRyeS1ydW5cIl0pIHtcbiAgICAgIGNvbnN0IHNwaW4gPSBzcGlubmVyKFwiQW5hbHl6aW5nIGJhdGNoLi4uXCIpLnN0YXJ0KCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByZXZpZXcgPSBhd2FpdCBhcGlDbGllbnQucG9zdDxCYXRjaFByZXZpZXdSZXNwb25zZT4oXG4gICAgICAgICAgXCIvYXBpL3YxL21lc3NhZ2VzL2JhdGNoL3ByZXZpZXdcIixcbiAgICAgICAgICB7IG1lc3NhZ2VzLCB0ZXh0OiBmbGFncy50ZXh0LCBtZXNzYWdlVHlwZTogZmxhZ3MudHlwZSB9LFxuICAgICAgICApO1xuXG4gICAgICAgIHNwaW4uc3RvcCgpO1xuXG4gICAgICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgICAgICBqc29uKHByZXZpZXcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNob3cgY29tcHJlaGVuc2l2ZSBwcmV2aWV3XG4gICAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5ib2xkKFwiXFxu8J+TiiBCYXRjaCBQcmV2aWV3IChEcnkgUnVuKVxcblwiKSk7XG5cbiAgICAgICAgLy8gU3VtbWFyeSB0YWJsZVxuICAgICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwi4pSAXCIucmVwZWF0KDUwKSkpO1xuICAgICAgICBjb25zb2xlLmxvZyhgVG90YWwgbWVzc2FnZXM6ICAgICAke3ByZXZpZXcudG90YWx9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBTZW5kYWJsZTogICAgICAgICAgICR7Y29sb3JzLnN1Y2Nlc3MoU3RyaW5nKHByZXZpZXcuc2VuZGFibGUpKX1gLFxuICAgICAgICApO1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgQmxvY2tlZDogICAgICAgICAgICAke3ByZXZpZXcuYmxvY2tlZCA+IDAgPyBjb2xvcnMuZXJyb3IoU3RyaW5nKHByZXZpZXcuYmxvY2tlZCkpIDogXCIwXCJ9YCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5sb2coYER1cGxpY2F0ZXMgcmVtb3ZlZDogJHtwcmV2aWV3LmR1cGxpY2F0ZXN9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCLilIBcIi5yZXBlYXQoNTApKSk7XG5cbiAgICAgICAgLy8gQ3JlZGl0c1xuICAgICAgICBjb25zb2xlLmxvZyhgXFxuQ3JlZGl0cyBuZWVkZWQ6ICAgICAke3ByZXZpZXcuY3JlZGl0c05lZWRlZH1gKTtcbiAgICAgICAgY29uc29sZS5sb2coYFlvdXIgYmFsYW5jZTogICAgICAgJHtwcmV2aWV3LmNyZWRpdEJhbGFuY2V9YCk7XG4gICAgICAgIGlmICghcHJldmlldy5oYXNTdWZmaWNpZW50Q3JlZGl0cykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY29sb3JzLmVycm9yKFxuICAgICAgICAgICAgICBg4pqg77iPICBJbnN1ZmZpY2llbnQgY3JlZGl0cyEgTmVlZCAke3ByZXZpZXcuY3JlZGl0c05lZWRlZCAtIHByZXZpZXcuY3JlZGl0QmFsYW5jZX0gbW9yZS5gLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWNjZXNzIGluZm9cbiAgICAgICAgY29uc29sZS5sb2coYFxcbkFQSSBLZXkgdHlwZTogICAgICAgJHtwcmV2aWV3LmtleVR5cGUudG9VcHBlckNhc2UoKX1gKTtcbiAgICAgICAgY29uc29sZS5sb2coYFdyaXRlIGFjY2VzczogICAgICAgJHtwcmV2aWV3Lmhhc1dyaXRlU2NvcGUgPyBcIuKck1wiIDogXCLinJdcIn1gKTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYERvbWVzdGljIChVUy9DQSk6ICAgJHtwcmV2aWV3Lm1lc3NhZ2luZ1Byb2ZpbGUuY2FuU2VuZERvbWVzdGljID8gXCLinJNcIiA6IFwi4pyXXCJ9YCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYEludGVybmF0aW9uYWw6ICAgICAgJHtwcmV2aWV3Lm1lc3NhZ2luZ1Byb2ZpbGUuY2FuU2VuZEludGVybmF0aW9uYWwgPyBcIuKck1wiIDogXCLinJdcIn1gLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIENvdW50cnkgYnJlYWtkb3duXG4gICAgICAgIGNvbnN0IGNvdW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHByZXZpZXcuYnlDb3VudHJ5KTtcbiAgICAgICAgaWYgKGNvdW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY29sb3JzLmJvbGQoXCJcXG7wn5ONIEJ5IENvdW50cnk6XFxuXCIpKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtjb3VudHJ5LCBkYXRhXSBvZiBjb3VudHJpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGRhdGEuYWxsb3dlZFxuICAgICAgICAgICAgICA/IGNvbG9ycy5zdWNjZXNzKFwi4pyTXCIpXG4gICAgICAgICAgICAgIDogY29sb3JzLmVycm9yKFwi4pyXXCIpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGAgICR7c3RhdHVzfSAke2NvdW50cnl9OiAke2RhdGEuY291bnR9IG1zZ3MsICR7ZGF0YS5jcmVkaXRzfSBjcmVkaXRzICgke2RhdGEudGllcn0pYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWRhdGEuYWxsb3dlZCAmJiBkYXRhLmJsb2NrZWRSZWFzb24pIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShgICAgICDilJTilIAgJHtkYXRhLmJsb2NrZWRSZWFzb259YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXBsaWFuY2UgY2hlY2sgcmVzdWx0c1xuICAgICAgICBpZiAocHJldmlldy5jb21wbGlhbmNlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY29sb3JzLmJvbGQoXCJcXG7wn5uh77iPICBDb21wbGlhbmNlIENoZWNrOlxcblwiKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgICBNZXNzYWdlIFR5cGU6ICAgICAgJHtwcmV2aWV3LmNvbXBsaWFuY2UubWVzc2FnZVR5cGUudG9VcHBlckNhc2UoKX1gLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAocHJldmlldy5jb21wbGlhbmNlLnNoYWZ0QmxvY2tlZCA+IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjb2xvcnMuZXJyb3IoXG4gICAgICAgICAgICAgICAgYCAgU0hBRlQgQmxvY2tlZDogICAgICR7cHJldmlldy5jb21wbGlhbmNlLnNoYWZ0QmxvY2tlZH0gbWVzc2FnZXNgLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbXNnIG9mIHByZXZpZXcuY29tcGxpYW5jZS5zaGFmdEJsb2NrZWRNZXNzYWdlcy5zbGljZShcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgMyxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY29sb3JzLmRpbShcbiAgICAgICAgICAgICAgICAgIGAgICAgIOKUlOKUgCAke21zZy50b306ICR7bXNnLmNhdGVnb3J5fSAoJHttc2cubWF0Y2hlZFRlcm1zLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByZXZpZXcuY29tcGxpYW5jZS5zaGFmdEJsb2NrZWRNZXNzYWdlcy5sZW5ndGggPiAzKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIGNvbG9ycy5kaW0oXG4gICAgICAgICAgICAgICAgICBgICAgICAuLi4gYW5kICR7cHJldmlldy5jb21wbGlhbmNlLnNoYWZ0QmxvY2tlZE1lc3NhZ2VzLmxlbmd0aCAtIDN9IG1vcmVgLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjb2xvcnMuc3VjY2VzcyhcbiAgICAgICAgICAgICAgICBcIiAgU0hBRlQgQ2hlY2s6ICAgICAgIOKckyBBbGwgbWVzc2FnZXMgcGFzcyBjb250ZW50IGZpbHRlclwiLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJldmlldy5jb21wbGlhbmNlLm1lc3NhZ2VUeXBlID09PSBcIm1hcmtldGluZ1wiKSB7XG4gICAgICAgICAgICBpZiAocHJldmlldy5jb21wbGlhbmNlLnF1aWV0SG91cnNSZXNjaGVkdWxlZCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY29sb3JzLndhcm5pbmcoXG4gICAgICAgICAgICAgICAgICBgICBRdWlldCBIb3VyczogICAgICAgJHtwcmV2aWV3LmNvbXBsaWFuY2UucXVpZXRIb3Vyc1Jlc2NoZWR1bGVkfSBtZXNzYWdlcyB3aWxsIGJlIHJlc2NoZWR1bGVkYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1zZyBvZiBwcmV2aWV3LmNvbXBsaWFuY2UucXVpZXRIb3Vyc0Jsb2NrZWRNZXNzYWdlcy5zbGljZShcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIDMsXG4gICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGltZSA9IG1zZy5uZXh0QWxsb3dlZFRpbWVcbiAgICAgICAgICAgICAgICAgID8gbmV3IERhdGUobXNnLm5leHRBbGxvd2VkVGltZSkudG9Mb2NhbGVTdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgOiBcIm5leHQgYXZhaWxhYmxlIHdpbmRvd1wiO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgY29sb3JzLmRpbShcbiAgICAgICAgICAgICAgICAgICAgYCAgICAg4pSU4pSAICR7bXNnLnRvfTogJHttc2cucmVjaXBpZW50VGltZXpvbmV9IOKGkiAke25leHRUaW1lfWAsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHByZXZpZXcuY29tcGxpYW5jZS5xdWlldEhvdXJzQmxvY2tlZE1lc3NhZ2VzLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNvbG9ycy5kaW0oXG4gICAgICAgICAgICAgICAgICAgIGAgICAgIC4uLiBhbmQgJHtwcmV2aWV3LmNvbXBsaWFuY2UucXVpZXRIb3Vyc0Jsb2NrZWRNZXNzYWdlcy5sZW5ndGggLSAzfSBtb3JlYCxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY29sb3JzLnN1Y2Nlc3MoXG4gICAgICAgICAgICAgICAgICBcIiAgUXVpZXQgSG91cnM6ICAgICAgIOKckyBBbGwgcmVjaXBpZW50cyB3aXRoaW4gYWxsb3dlZCBob3Vyc1wiLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjb2xvcnMuZGltKFxuICAgICAgICAgICAgICAgIFwiICBRdWlldCBIb3VyczogICAgICAgQnlwYXNzZWQgKHRyYW5zYWN0aW9uYWwgbWVzc2FnZSlcIixcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2FybmluZ3NcbiAgICAgICAgaWYgKHByZXZpZXcud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy53YXJuaW5nKFwiXFxu4pqg77iPICBXYXJuaW5nczpcIikpO1xuICAgICAgICAgIGZvciAoY29uc3QgdyBvZiBwcmV2aWV3Lndhcm5pbmdzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAg4oCiICR7d31gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCbG9ja2VkIG1lc3NhZ2VzIChmaXJzdCA1KVxuICAgICAgICBpZiAocHJldmlldy5ibG9ja2VkTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY29sb3JzLmVycm9yKFxuICAgICAgICAgICAgICBgXFxu4p2MIEJsb2NrZWQgTWVzc2FnZXMgKCR7cHJldmlldy5ibG9ja2VkTWVzc2FnZXMubGVuZ3RofSB0b3RhbCk6YCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGIgb2YgcHJldmlldy5ibG9ja2VkTWVzc2FnZXMuc2xpY2UoMCwgNSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAke2IudG99OiAke2IucmVhc29ufWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJldmlldy5ibG9ja2VkTWVzc2FnZXMubGVuZ3RoID4gNSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNvbG9ycy5kaW0oXG4gICAgICAgICAgICAgICAgYCAgIC4uLiBhbmQgJHtwcmV2aWV3LmJsb2NrZWRNZXNzYWdlcy5sZW5ndGggLSA1fSBtb3JlYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgXCJcXG5cIiArIGNvbG9ycy5kaW0oXCJObyBtZXNzYWdlcyB3ZXJlIHNlbnQuIFJlbW92ZSAtLWRyeS1ydW4gdG8gc2VuZC5cIiksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzcGluLnN0b3AoKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNwaW4gPSBzcGlubmVyKGBTZW5kaW5nICR7bWVzc2FnZXMubGVuZ3RofSBtZXNzYWdlcy4uLmApO1xuICAgIHNwaW4uc3RhcnQoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUNsaWVudC5wb3N0PEJhdGNoUmVzcG9uc2U+KFxuICAgICAgICBcIi9hcGkvdjEvbWVzc2FnZXMvYmF0Y2hcIixcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2VzLFxuICAgICAgICAgIG1lc3NhZ2VUeXBlOiBmbGFncy50eXBlLFxuICAgICAgICAgIC4uLihmbGFncy5mcm9tICYmIHsgZnJvbTogZmxhZ3MuZnJvbSB9KSxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIHNwaW4uc3RvcCgpO1xuXG4gICAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICAgIGpzb24ocmVzcG9uc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIERldGVybWluZSBzdWNjZXNzIGxldmVsXG4gICAgICBjb25zdCBhbGxTdWNjZWVkZWQgPSByZXNwb25zZS5mYWlsZWQgPT09IDA7XG4gICAgICBjb25zdCBhbGxGYWlsZWQgPSByZXNwb25zZS5zZW50ID09PSAwICYmIHJlc3BvbnNlLmZhaWxlZCA+IDA7XG4gICAgICBjb25zdCBwYXJ0aWFsU3VjY2VzcyA9IHJlc3BvbnNlLnNlbnQgPiAwICYmIHJlc3BvbnNlLmZhaWxlZCA+IDA7XG5cbiAgICAgIGlmIChhbGxTdWNjZWVkZWQpIHtcbiAgICAgICAgc3VjY2VzcyhcIkJhdGNoIHNlbnQgc3VjY2Vzc2Z1bGx5XCIsIHtcbiAgICAgICAgICBcIkJhdGNoIElEXCI6IHJlc3BvbnNlLmJhdGNoSWQsXG4gICAgICAgICAgVG90YWw6IHJlc3BvbnNlLnRvdGFsLFxuICAgICAgICAgIFNlbnQ6IGNvbG9ycy5zdWNjZXNzKFN0cmluZyhyZXNwb25zZS5zZW50KSksXG4gICAgICAgICAgXCJDcmVkaXRzIFVzZWRcIjogcmVzcG9uc2UuY3JlZGl0c1VzZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChhbGxGYWlsZWQpIHtcbiAgICAgICAgZXJyb3IoXCJCYXRjaCBmYWlsZWRcIiwge1xuICAgICAgICAgIGhpbnQ6IGBBbGwgJHtyZXNwb25zZS5mYWlsZWR9IG1lc3NhZ2VzIGZhaWxlZCB0byBzZW5kYCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oYCAgQmF0Y2ggSUQ6ICR7cmVzcG9uc2UuYmF0Y2hJZH1gKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNvbG9ycy5kaW0oYCAgQ3JlZGl0cyBSZWZ1bmRlZDogJHtyZXNwb25zZS5jcmVkaXRzUmVmdW5kZWR9YCksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHBhcnRpYWxTdWNjZXNzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy53YXJuaW5nKFwiXFxu4pqg77iPICBCYXRjaCBjb21wbGV0ZWQgd2l0aCBlcnJvcnNcXG5cIikpO1xuICAgICAgICBjb25zb2xlLmxvZyhgICBCYXRjaCBJRDogICAgICAgICAke3Jlc3BvbnNlLmJhdGNoSWR9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgIFRvdGFsOiAgICAgICAgICAgICR7cmVzcG9uc2UudG90YWx9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGAgIFNlbnQ6ICAgICAgICAgICAgICR7Y29sb3JzLnN1Y2Nlc3MoU3RyaW5nKHJlc3BvbnNlLnNlbnQpKX1gLFxuICAgICAgICApO1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgICBGYWlsZWQ6ICAgICAgICAgICAke2NvbG9ycy5lcnJvcihTdHJpbmcocmVzcG9uc2UuZmFpbGVkKSl9YCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5sb2coYCAgQ3JlZGl0cyBVc2VkOiAgICAgJHtyZXNwb25zZS5jcmVkaXRzVXNlZH1gKTtcbiAgICAgICAgY29uc29sZS5sb2coYCAgQ3JlZGl0cyBSZWZ1bmRlZDogJHtyZXNwb25zZS5jcmVkaXRzUmVmdW5kZWR9YCk7XG5cbiAgICAgICAgLy8gU2hvdyBmYWlsZWQgbWVzc2FnZXMgaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmIChyZXNwb25zZS5tZXNzYWdlcykge1xuICAgICAgICAgIGNvbnN0IGZhaWxlZE1zZ3MgPSByZXNwb25zZS5tZXNzYWdlcy5maWx0ZXIoXG4gICAgICAgICAgICAobSkgPT4gbS5zdGF0dXMgPT09IFwiZmFpbGVkXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZmFpbGVkTXNncy5sZW5ndGggPiAwICYmIGZhaWxlZE1zZ3MubGVuZ3RoIDw9IDUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCJcXG4gIEZhaWxlZCBtZXNzYWdlczpcIikpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBtc2cgb2YgZmFpbGVkTXNncykge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjb2xvcnMuZGltKGAgICAgJHttc2cudG99OiAke21zZy5lcnJvciB8fCBcIlVua25vd24gZXJyb3JcIn1gKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGZhaWxlZE1zZ3MubGVuZ3RoID4gNSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNvbG9ycy5kaW0oXG4gICAgICAgICAgICAgICAgYFxcbiAgJHtmYWlsZWRNc2dzLmxlbmd0aH0gbWVzc2FnZXMgZmFpbGVkLiBVc2UgLS1qc29uIGZvciBkZXRhaWxzLmAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc3Bpbi5zdG9wKCk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZU1lc3NhZ2VzRnJvbUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IEJhdGNoTWVzc2FnZVtdIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhmaWxlUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAgICAgLy8gVHJ5IEpTT04gZmlyc3RcbiAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgIHJldHVybiBkYXRhLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICAgIHRvOiBpdGVtLnRvLFxuICAgICAgICAgICAgdGV4dDogaXRlbS50ZXh0LFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5tZXNzYWdlcyAmJiBBcnJheS5pc0FycmF5KGRhdGEubWVzc2FnZXMpKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGEubWVzc2FnZXM7XG4gICAgICAgIH1cbiAgICAgICAgZXJyb3IoXCJJbnZhbGlkIEpTT04gZm9ybWF0XCIsIHtcbiAgICAgICAgICBoaW50OiBcIkV4cGVjdGVkIGFycmF5IG9mIHt0bywgdGV4dH0gb2JqZWN0cyBvciB7bWVzc2FnZXM6IFsuLi5dfVwiLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICAvLyBUcnkgQ1NWXG4gICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoXCIuY3N2XCIpKSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gY29udGVudC50cmltKCkuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzOiBCYXRjaE1lc3NhZ2VbXSA9IFtdO1xuXG4gICAgICAgIC8vIEltcHJvdmVkIGhlYWRlciBkZXRlY3Rpb24gLSBjaGVjayBmb3IgY29tbW9uIGhlYWRlciBwYXR0ZXJuc1xuICAgICAgICBjb25zdCBoZWFkZXJQYXR0ZXJucyA9IFtcbiAgICAgICAgICBcInRvXCIsXG4gICAgICAgICAgXCJwaG9uZVwiLFxuICAgICAgICAgIFwibnVtYmVyXCIsXG4gICAgICAgICAgXCJyZWNpcGllbnRcIixcbiAgICAgICAgICBcIm1vYmlsZVwiLFxuICAgICAgICAgIFwiY2VsbFwiLFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBmaXJzdExpbmUgPSBsaW5lc1swXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBoYXNIZWFkZXIgPSBoZWFkZXJQYXR0ZXJucy5zb21lKChwKSA9PiBmaXJzdExpbmUuaW5jbHVkZXMocCkpO1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gaGFzSGVhZGVyID8gMSA6IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXS50cmltKCk7XG4gICAgICAgICAgaWYgKCFsaW5lKSBjb250aW51ZTsgLy8gU2tpcCBlbXB0eSBsaW5lc1xuXG4gICAgICAgICAgY29uc3QgcGFydHMgPSBsaW5lLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHBob25lID0gcGFydHNbMF0udHJpbSgpLnJlcGxhY2UoL1wiL2csIFwiXCIpO1xuICAgICAgICAgICAgLy8gT25seSBhZGQgaWYgcGhvbmUgbG9va3MgdmFsaWQgKHN0YXJ0cyB3aXRoICsgb3IgZGlnaXQpXG4gICAgICAgICAgICBpZiAocGhvbmUgJiYgKHBob25lLnN0YXJ0c1dpdGgoXCIrXCIpIHx8IC9eXFxkLy50ZXN0KHBob25lKSkpIHtcbiAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgdG86IHBob25lLnN0YXJ0c1dpdGgoXCIrXCIpID8gcGhvbmUgOiBgKyR7cGhvbmV9YCxcbiAgICAgICAgICAgICAgICB0ZXh0OlxuICAgICAgICAgICAgICAgICAgcGFydHMubGVuZ3RoID49IDJcbiAgICAgICAgICAgICAgICAgICAgPyBwYXJ0cy5zbGljZSgxKS5qb2luKFwiLFwiKS50cmltKCkucmVwbGFjZSgvXCIvZywgXCJcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZXM7XG4gICAgICB9XG5cbiAgICAgIGVycm9yKFwiVW5zdXBwb3J0ZWQgZmlsZSBmb3JtYXRcIiwge1xuICAgICAgICBoaW50OiBcIlVzZSAuanNvbiBvciAuY3N2IGZpbGVcIixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKChlcnIgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSBcIkVOT0VOVFwiKSB7XG4gICAgICAgIGVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpIHtcbiAgICAgICAgZXJyb3IoXCJJbnZhbGlkIEpTT04gaW4gZmlsZVwiLCB7IGhpbnQ6IGVyci5tZXNzYWdlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VNZXNzYWdlc0Zyb21GbGFncyh0bzogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpOiBCYXRjaE1lc3NhZ2VbXSB7XG4gICAgY29uc3QgcGhvbmVzID0gdG8uc3BsaXQoXCIsXCIpLm1hcCgocCkgPT4gcC50cmltKCkpO1xuICAgIHJldHVybiBwaG9uZXMubWFwKChwaG9uZSkgPT4gKHsgdG86IHBob25lLCB0ZXh0IH0pKTtcbiAgfVxufVxuIl19
|
|
436
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbWFuZHMvc21zL2JhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLE9BQU8sRUFDUCxLQUFLLEVBQ0wsT0FBTyxFQUNQLE1BQU0sRUFDTixJQUFJLEVBQ0osVUFBVSxHQUNYLE1BQU0scUJBQXFCLENBQUM7QUE2RzdCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sUUFBUyxTQUFRLG9CQUFvQjtJQUN4RCxNQUFNLENBQUMsV0FBVyxHQUNoQixnRUFBZ0UsQ0FBQztJQUVuRSxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLG1EQUFtRDtRQUNuRCx3RUFBd0U7UUFDeEUsNEVBQTRFO1FBQzVFLDZEQUE2RDtRQUM3RCx1RkFBdUY7UUFDdkYsbURBQW1EO1FBQ25ELHVDQUF1QztLQUN4QyxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztRQUNqQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNqQixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFBRSx5REFBeUQ7WUFDdEUsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUM7U0FDdEMsQ0FBQztRQUNGLEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2YsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsd0RBQXdEO1lBQ3JFLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDO1NBQ3hDLENBQUM7UUFDRixJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNqQixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFDVCxnRkFBZ0Y7U0FDbkYsQ0FBQztRQUNGLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2pCLElBQUksRUFBRSxHQUFHO1lBQ1QsV0FBVyxFQUFFLDRDQUE0QztTQUMxRCxDQUFDO1FBQ0YsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDakIsV0FBVyxFQUNULHlGQUF5RjtZQUMzRixPQUFPLEVBQUUsQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUFDO1lBQ3ZDLE9BQU8sRUFBRSxXQUFXO1NBQ3JCLENBQUM7UUFDRixTQUFTLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUN2QixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFDVCx1RkFBdUY7WUFDekYsT0FBTyxFQUFFLEtBQUs7U0FDZixDQUFDO1FBQ0YsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDbEIsV0FBVyxFQUFFLHNEQUFzRDtZQUNuRSxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQztTQUNyQyxDQUFDO1FBQ0YsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDckIsV0FBVyxFQUFFLGtDQUFrQztZQUMvQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQztZQUNsQyxPQUFPLEVBQUUsS0FBSztTQUNmLENBQUM7S0FDSCxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTdDLDRCQUE0QjtRQUM1QixJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM1QixDQUFDO1FBRUQsMEJBQTBCO1FBQzFCLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCx5REFBeUQ7UUFDekQsSUFBSSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDYixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBRUQsMENBQTBDO1FBQzFDLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFFRCxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFdBQVc7UUFDdkIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFMUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsR0FBRyxDQUNsQyx3QkFBd0IsRUFDeEIsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQ2QsQ0FBQztZQUVGLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVaLElBQUksVUFBVSxFQUFFLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNmLE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQztnQkFDdkQsT0FBTyxDQUFDLEdBQUcsQ0FBQywwREFBMEQsQ0FBQyxDQUFDO2dCQUN4RSxPQUFPO1lBQ1QsQ0FBQztZQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUM7WUFDeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXhDLEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3pELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMzQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUVqRSxPQUFPLENBQUMsR0FBRyxDQUNULEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQzVELENBQUM7Z0JBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FDVCxNQUFNLENBQUMsR0FBRyxDQUNSLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxNQUFNLENBQUMsUUFBUSxFQUFFLFVBQVUsSUFBSSxDQUFDLHVCQUF1QixNQUFNLEVBQUUsQ0FDMUYsQ0FDRixDQUFDO1lBQ0osQ0FBQztZQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxPQUFPLENBQUMsR0FBRyxDQUNULE1BQU0sQ0FBQyxHQUFHLENBQUMsaURBQWlELENBQUMsQ0FDOUQsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1osTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFVBQVUsQ0FDdEIsUUFBZ0IsRUFDaEIsS0FBMkU7UUFFM0UsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFdkQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsR0FBRyxDQUNsQyx3QkFBd0IsUUFBUSxFQUFFLENBQ25DLENBQUM7WUFFRixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFWixPQUFPLENBQUMsR0FBRyxDQUNULE1BQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FDaEUsQ0FBQztZQUNGLE9BQU8sQ0FBQyxHQUFHLENBQ1QsTUFBTSxDQUFDLEdBQUcsQ0FDUixLQUFLLFFBQVEsQ0FBQyxVQUFVLENBQUMsVUFBVSwwQkFBMEIsUUFBUSxDQUFDLFVBQVUsQ0FBQyxTQUFTLE9BQU8sQ0FDbEcsQ0FDRixDQUFDO1lBRUYsZ0NBQWdDO1lBQ2hDLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7WUFDbkMsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2YsUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQzlCLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtvQkFDUixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSTtpQkFDM0IsQ0FBQyxDQUFDLENBQUM7WUFDTixDQUFDO1lBRUQsa0NBQWtDO1lBQ2xDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzVELElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDM0IsS0FBSyxDQUNILEdBQUcsV0FBVyxDQUFDLE1BQU0sb0VBQW9FLENBQzFGLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNmLENBQUM7WUFFRCwrQkFBK0I7WUFDL0IsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUN0QixRQUErQyxFQUMvQyxLQUFLLEVBQ0wsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQ25CLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNaLE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxLQUFLLENBQUMsb0JBQW9CLENBQUMsS0FNbEM7UUFDQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2hCLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEVBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6RCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RDLEVBQUUsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFO1lBQy9DLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSztTQUNsQixDQUFDLENBQUMsQ0FBQztRQUVKLHlCQUF5QjtRQUN6QixLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RDLEtBQUssQ0FBQyx5QkFBeUIsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFO29CQUN2QyxJQUFJLEVBQUUsZ0NBQWdDO2lCQUN2QyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBTTNCO1FBQ0MsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUssQ0FBQztRQUU3QixvQkFBb0I7UUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzFCLEtBQUssQ0FBQyxtQkFBbUIsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsQ0FBQztRQUVELDBCQUEwQjtRQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQy9CLEtBQUssQ0FBQyw4QkFBOEIsRUFBRTtnQkFDcEMsSUFBSSxFQUFFLDZEQUE2RDthQUNwRSxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsQ0FBQztRQUVELFlBQVk7UUFDWixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXBDLDhCQUE4QjtRQUM5QixJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUNwQyxLQUFLLENBQUMsMEJBQTBCLEVBQUU7Z0JBQ2hDLElBQUksRUFBRSxtQ0FBbUM7YUFDMUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsYUFBYSxRQUFRLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXpELElBQUksQ0FBQztZQUNILHNDQUFzQztZQUN0QyxNQUFNLFFBQVEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxVQUFVLENBQ3pDLHVCQUF1QixFQUN2QixFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUMzQyxDQUFDO1lBRUYsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBRVosc0JBQXNCO1lBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5RCxPQUFPLENBQUMsR0FBRyxDQUNULE1BQU0sQ0FBQyxHQUFHLENBQ1IsS0FBSyxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsWUFBWSxRQUFRLENBQUMsVUFBVSxDQUFDLFlBQVksY0FBYyxRQUFRLENBQUMsVUFBVSxDQUFDLGlCQUFpQixxQkFBcUIsQ0FDeEosQ0FDRixDQUFDO1lBRUYsZ0NBQWdDO1lBQ2hDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hELEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQzlDLE9BQU8sQ0FBQyxHQUFHLENBQ1QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLEtBQUssTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FDN0QsQ0FBQztnQkFDSixDQUFDO2dCQUNELElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUMzQixPQUFPLENBQUMsR0FBRyxDQUNULE1BQU0sQ0FBQyxHQUFHLENBQ1IsY0FBYyxRQUFRLENBQUMsVUFBVSxDQUFDLFlBQVksR0FBRyxDQUFDLGNBQWMsQ0FDakUsQ0FDRixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixDQUFDO1lBRUQsZ0NBQWdDO1lBQ2hDLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7WUFDbkMsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2YsUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQzlCLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtvQkFDUixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSTtpQkFDM0IsQ0FBQyxDQUFDLENBQUM7WUFDTixDQUFDO1lBRUQsa0NBQWtDO1lBQ2xDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzVELElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDM0IsS0FBSyxDQUNILEdBQUcsV0FBVyxDQUFDLE1BQU0sb0VBQW9FLENBQzFGLENBQUM7Z0JBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FDVCxNQUFNLENBQUMsR0FBRyxDQUNSLDZEQUE2RCxDQUM5RCxDQUNGLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNmLENBQUM7WUFFRCwrQkFBK0I7WUFDL0IsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUN0QixRQUErQyxFQUMvQyxLQUFLLEVBQ0wsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQ25CLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNaLE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxhQUFhLENBQ3pCLFFBQTZDLEVBQzdDLEtBQTRELEVBQzVELFFBQWlCO1FBRWpCLG1CQUFtQjtRQUNuQixJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDM0IsS0FBSyxDQUFDLHdDQUF3QyxFQUFFO2dCQUM5QyxJQUFJLEVBQUUsMENBQTBDO2FBQ2pELENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixDQUFDO1FBRUQsc0JBQXNCO1FBQ3RCLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDckIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBRUQsaUJBQWlCO1FBQ2pCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxXQUFXLFFBQVEsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUViLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDLElBQUksQ0FDbkMsd0JBQXdCLEVBQ3hCO2dCQUNFLFFBQVE7Z0JBQ1IsV0FBVyxFQUFFLEtBQUssQ0FBQyxJQUFJO2dCQUN2QixHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZDLEdBQUcsQ0FBQyxRQUFRLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLHNDQUFzQzthQUN0RSxDQUNGLENBQUM7WUFFRixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFWixJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDZixPQUFPO1lBQ1QsQ0FBQztZQUVELDBCQUEwQjtZQUMxQixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztZQUMzQyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUM3RCxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUVoRSxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQixPQUFPLENBQUMseUJBQXlCLEVBQUU7b0JBQ2pDLFVBQVUsRUFBRSxRQUFRLENBQUMsT0FBTztvQkFDNUIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO29CQUNyQixJQUFJLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMzQyxjQUFjLEVBQUUsUUFBUSxDQUFDLFdBQVc7aUJBQ3JDLENBQUMsQ0FBQztZQUNMLENBQUM7aUJBQU0sSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDckIsS0FBSyxDQUFDLGNBQWMsRUFBRTtvQkFDcEIsSUFBSSxFQUFFLE9BQU8sUUFBUSxDQUFDLE1BQU0sMEJBQTBCO2lCQUN2RCxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDM0QsT0FBTyxDQUFDLEdBQUcsQ0FDVCxNQUFNLENBQUMsR0FBRyxDQUFDLHVCQUF1QixRQUFRLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FDOUQsQ0FBQztZQUNKLENBQUM7aUJBQU0sSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHFDQUFxQyxDQUFDLENBQUMsQ0FBQztnQkFDbkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3ZELE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRCxPQUFPLENBQUMsR0FBRyxDQUNULHVCQUF1QixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUMvRCxDQUFDO2dCQUNGLE9BQU8sQ0FBQyxHQUFHLENBQ1QsdUJBQXVCLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQy9ELENBQUM7Z0JBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7Z0JBQzNELE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO2dCQUUvRCxvQ0FBb0M7Z0JBQ3BDLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUN0QixNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FDekMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUM3QixDQUFDO29CQUNGLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQzt3QkFDcEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQzt3QkFDaEQsS0FBSyxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQzs0QkFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FDVCxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsS0FBSyxJQUFJLGVBQWUsRUFBRSxDQUFDLENBQzdELENBQUM7d0JBQ0osQ0FBQztvQkFDSCxDQUFDO3lCQUFNLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDakMsT0FBTyxDQUFDLEdBQUcsQ0FDVCxNQUFNLENBQUMsR0FBRyxDQUNSLE9BQU8sVUFBVSxDQUFDLE1BQU0sMkNBQTJDLENBQ3BFLENBQ0YsQ0FBQztvQkFDSixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDWixNQUFNLEdBQUcsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsV0FBVyxDQUN2QixRQUE2QyxFQUM3QyxLQUF3QjtRQUV4QixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVuRCxJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQ2xDLGdDQUFnQyxFQUNoQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUN0QyxDQUFDO1lBRUYsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBRVosSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO2dCQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2QsT0FBTztZQUNULENBQUM7WUFFRCw2QkFBNkI7WUFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQztZQUUzRCxnQkFBZ0I7WUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELE9BQU8sQ0FBQyxHQUFHLENBQ1QsdUJBQXVCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQ2xFLENBQUM7WUFDRixPQUFPLENBQUMsR0FBRyxDQUNULHVCQUF1QixPQUFPLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUMzRixDQUFDO1lBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDekQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXhDLFVBQVU7WUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztZQUM5RCxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQ1QsTUFBTSxDQUFDLEtBQUssQ0FDVixrQ0FBa0MsT0FBTyxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxRQUFRLENBQ3hGLENBQ0YsQ0FBQztZQUNKLENBQUM7WUFFRCxjQUFjO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3hFLE9BQU8sQ0FBQyxHQUFHLENBQ1QsdUJBQXVCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQzlFLENBQUM7WUFDRixPQUFPLENBQUMsR0FBRyxDQUNULHVCQUF1QixPQUFPLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQ25GLENBQUM7WUFFRixvQkFBb0I7WUFDcEIsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDcEQsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN6QixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxLQUFLLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3RFLE9BQU8sQ0FBQyxHQUFHLENBQ1QsS0FBSyxNQUFNLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxLQUFLLFVBQVUsSUFBSSxDQUFDLE9BQU8sYUFBYSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQ3JGLENBQUM7b0JBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO3dCQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUMzRCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBRUQsMkJBQTJCO1lBQzNCLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN2QixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDO2dCQUN2RCxPQUFPLENBQUMsR0FBRyxDQUNULHdCQUF3QixPQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUN2RSxDQUFDO2dCQUVGLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQ1QsTUFBTSxDQUFDLEtBQUssQ0FDVix3QkFBd0IsT0FBTyxDQUFDLFVBQVUsQ0FBQyxZQUFZLFdBQVcsQ0FDbkUsQ0FDRixDQUFDO29CQUNGLEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQzdELENBQUMsRUFDRCxDQUFDLENBQ0YsRUFBRSxDQUFDO3dCQUNGLE9BQU8sQ0FBQyxHQUFHLENBQ1QsTUFBTSxDQUFDLEdBQUcsQ0FDUixXQUFXLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLFFBQVEsS0FBSyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUN0RSxDQUNGLENBQUM7b0JBQ0osQ0FBQztvQkFDRCxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUN2RCxPQUFPLENBQUMsR0FBRyxDQUNULE1BQU0sQ0FBQyxHQUFHLENBQ1IsZ0JBQWdCLE9BQU8sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsT0FBTyxDQUMxRSxDQUNGLENBQUM7b0JBQ0osQ0FBQztnQkFDSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sT0FBTyxDQUFDLEdBQUcsQ0FDVCxNQUFNLENBQUMsT0FBTyxDQUNaLHlEQUF5RCxDQUMxRCxDQUNGLENBQUM7Z0JBQ0osQ0FBQztnQkFFRCxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxLQUFLLFdBQVcsRUFBRSxDQUFDO29CQUNuRCxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQ2pELE9BQU8sQ0FBQyxHQUFHLENBQ1QsTUFBTSxDQUFDLE9BQU8sQ0FDWix3QkFBd0IsT0FBTyxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsK0JBQStCLENBQ2hHLENBQ0YsQ0FBQzt3QkFDRixLQUFLLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUNsRSxDQUFDLEVBQ0QsQ0FBQyxDQUNGLEVBQUUsQ0FBQzs0QkFDRixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsZUFBZTtnQ0FDbEMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxjQUFjLEVBQUU7Z0NBQ2hELENBQUMsQ0FBQyx1QkFBdUIsQ0FBQzs0QkFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FDVCxNQUFNLENBQUMsR0FBRyxDQUNSLFdBQVcsR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsaUJBQWlCLE1BQU0sUUFBUSxFQUFFLENBQzVELENBQ0YsQ0FBQzt3QkFDSixDQUFDO3dCQUNELElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7NEJBQzVELE9BQU8sQ0FBQyxHQUFHLENBQ1QsTUFBTSxDQUFDLEdBQUcsQ0FDUixnQkFBZ0IsT0FBTyxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxPQUFPLENBQy9FLENBQ0YsQ0FBQzt3QkFDSixDQUFDO29CQUNILENBQUM7eUJBQU0sQ0FBQzt3QkFDTixPQUFPLENBQUMsR0FBRyxDQUNULE1BQU0sQ0FBQyxPQUFPLENBQ1osNERBQTRELENBQzdELENBQ0YsQ0FBQztvQkFDSixDQUFDO2dCQUNILENBQUM7cUJBQU0sQ0FBQztvQkFDTixPQUFPLENBQUMsR0FBRyxDQUNULE1BQU0sQ0FBQyxHQUFHLENBQUMsdURBQXVELENBQUMsQ0FDcEUsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUVELFdBQVc7WUFDWCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDakMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzNCLENBQUM7WUFDSCxDQUFDO1lBRUQsNkJBQTZCO1lBQzdCLElBQUksT0FBTyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQ1QsTUFBTSxDQUFDLEtBQUssQ0FDVix5QkFBeUIsT0FBTyxDQUFDLGVBQWUsQ0FBQyxNQUFNLFVBQVUsQ0FDbEUsQ0FDRixDQUFDO2dCQUNGLEtBQUssTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ3BELE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUN6QyxDQUFDO2dCQUNELElBQUksT0FBTyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQ1QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLE9BQU8sQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQ3BFLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLENBQUMsR0FBRyxDQUNULElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGtEQUFrRCxDQUFDLENBQ3RFLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNaLE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLFdBQVcsQ0FBQyxLQUFhO1FBQy9CLElBQUksS0FBSyxHQUFHLElBQUk7WUFBRSxPQUFPLEdBQUcsS0FBSyxJQUFJLENBQUM7UUFDdEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUk7WUFBRSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDbEUsT0FBTyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMsIGV4aXN0c1N5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGJhc2VuYW1lIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAgc3VjY2VzcyxcbiAgZXJyb3IsXG4gIHNwaW5uZXIsXG4gIGNvbG9ycyxcbiAganNvbixcbiAgaXNKc29uTW9kZSxcbn0gZnJvbSBcIi4uLy4uL2xpYi9vdXRwdXQuanNcIjtcblxuaW50ZXJmYWNlIEJhdGNoVXBsb2FkUmVzcG9uc2Uge1xuICB1cGxvYWQ6IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgc2l6ZTogbnVtYmVyO1xuICAgIGNyZWF0ZWRBdDogc3RyaW5nO1xuICB9O1xuICB2YWxpZGF0aW9uOiB7XG4gICAgdG90YWxSb3dzOiBudW1iZXI7XG4gICAgdmFsaWRDb3VudDogbnVtYmVyO1xuICAgIGludmFsaWRDb3VudDogbnVtYmVyO1xuICAgIGR1cGxpY2F0ZXNSZW1vdmVkOiBudW1iZXI7XG4gICAgaGFzSGVhZGVyOiBib29sZWFuO1xuICB9O1xuICByZWNpcGllbnRzOiBBcnJheTx7IHRvOiBzdHJpbmc7IHRleHQ/OiBzdHJpbmcgfT47XG4gIGVycm9yczogQXJyYXk8eyByb3c6IG51bWJlcjsgcGhvbmU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PjtcbiAgaGFzTW9yZUVycm9yczogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEJhdGNoSGlzdG9yeVJlc3BvbnNlIHtcbiAgdXBsb2FkczogQXJyYXk8e1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZmlsZW5hbWU6IHN0cmluZztcbiAgICBzaXplOiBudW1iZXI7XG4gICAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gICAgbWV0YWRhdGE6IHtcbiAgICAgIHRvdGFsUm93czogbnVtYmVyO1xuICAgICAgdmFsaWRDb3VudDogbnVtYmVyO1xuICAgICAgaW52YWxpZENvdW50OiBudW1iZXI7XG4gICAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgfTtcbiAgfT47XG59XG5cbmludGVyZmFjZSBCYXRjaFJlc3BvbnNlIHtcbiAgYmF0Y2hJZDogc3RyaW5nO1xuICB0b3RhbDogbnVtYmVyO1xuICBzZW50OiBudW1iZXI7XG4gIHF1ZXVlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgY3JlZGl0c1VzZWQ6IG51bWJlcjtcbiAgY3JlZGl0c1JlZnVuZGVkOiBudW1iZXI7XG4gIHN0YXR1czogc3RyaW5nO1xuICBtZXNzYWdlcz86IEFycmF5PHtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdG86IHN0cmluZztcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBlcnJvcj86IHN0cmluZztcbiAgfT47XG59XG5cbmludGVyZmFjZSBCYXRjaFByZXZpZXdSZXNwb25zZSB7XG4gIHRvdGFsOiBudW1iZXI7XG4gIHNlbmRhYmxlOiBudW1iZXI7XG4gIGJsb2NrZWQ6IG51bWJlcjtcbiAgZHVwbGljYXRlczogbnVtYmVyO1xuICBjcmVkaXRzTmVlZGVkOiBudW1iZXI7XG4gIGNyZWRpdEJhbGFuY2U6IG51bWJlcjtcbiAgaGFzU3VmZmljaWVudENyZWRpdHM6IGJvb2xlYW47XG4gIGtleVR5cGU6IFwidGVzdFwiIHwgXCJsaXZlXCI7XG4gIGtleVNjb3Blczogc3RyaW5nW107XG4gIGhhc1dyaXRlU2NvcGU6IGJvb2xlYW47XG4gIG1lc3NhZ2luZ1Byb2ZpbGU6IHtcbiAgICBpZDogc3RyaW5nIHwgbnVsbDtcbiAgICBjYW5TZW5kRG9tZXN0aWM6IGJvb2xlYW47XG4gICAgY2FuU2VuZEludGVybmF0aW9uYWw6IGJvb2xlYW47XG4gICAgdmVyaWZpY2F0aW9uU3RhdHVzOiBzdHJpbmcgfCBudWxsO1xuICAgIHZlcmlmaWNhdGlvblR5cGU6IHN0cmluZyB8IG51bGw7XG4gIH07XG4gIGJ5Q291bnRyeTogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB7XG4gICAgICBjb3VudDogbnVtYmVyO1xuICAgICAgY3JlZGl0czogbnVtYmVyO1xuICAgICAgdGllcjogc3RyaW5nO1xuICAgICAgYWxsb3dlZDogYm9vbGVhbjtcbiAgICAgIGJsb2NrZWRSZWFzb24/OiBzdHJpbmc7XG4gICAgfVxuICA+O1xuICBibG9ja2VkTWVzc2FnZXM6IEFycmF5PHtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIHRvOiBzdHJpbmc7XG4gICAgcmVhc29uOiBzdHJpbmc7XG4gIH0+O1xuICBjb21wbGlhbmNlOiB7XG4gICAgbWVzc2FnZVR5cGU6IFwibWFya2V0aW5nXCIgfCBcInRyYW5zYWN0aW9uYWxcIjtcbiAgICBzaGFmdEJsb2NrZWQ6IG51bWJlcjtcbiAgICBxdWlldEhvdXJzQmxvY2tlZDogbnVtYmVyO1xuICAgIHF1aWV0SG91cnNSZXNjaGVkdWxlZDogbnVtYmVyO1xuICAgIHNoYWZ0QmxvY2tlZE1lc3NhZ2VzOiBBcnJheTx7XG4gICAgICBpbmRleDogbnVtYmVyO1xuICAgICAgdG86IHN0cmluZztcbiAgICAgIGNhdGVnb3J5OiBzdHJpbmc7XG4gICAgICBtYXRjaGVkVGVybXM6IHN0cmluZ1tdO1xuICAgIH0+O1xuICAgIHF1aWV0SG91cnNCbG9ja2VkTWVzc2FnZXM6IEFycmF5PHtcbiAgICAgIGluZGV4OiBudW1iZXI7XG4gICAgICB0bzogc3RyaW5nO1xuICAgICAgcmVjaXBpZW50VGltZXpvbmU6IHN0cmluZztcbiAgICAgIHJlY2lwaWVudExvY2FsVGltZTogc3RyaW5nO1xuICAgICAgbmV4dEFsbG93ZWRUaW1lPzogc3RyaW5nO1xuICAgIH0+O1xuICB9O1xuICB3YXJuaW5nczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNtc0JhdGNoIGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPVxuICAgIFwiU2VuZCBiYXRjaCBTTVMgbWVzc2FnZXMgKHVwbG9hZHMgQ1NWIHRvIGNsb3VkIGZvciBhdWRpdCB0cmFpbClcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBzbXMgYmF0Y2ggLS1maWxlIHJlY2lwaWVudHMuY3N2XCIsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHNtcyBiYXRjaCAtLWZpbGUgcGhvbmVzLmNzdiAtLXRleHQgXCJIZWxsbyBldmVyeW9uZSFcIicsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHNtcyBiYXRjaCAtLXRvICsxNTU1MTIzNDU2NywrMTU1NTk4NzY1NDMgLS10ZXh0IFwiSGVsbG8hXCInLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gc21zIGJhdGNoIC0tZmlsZSByZWNpcGllbnRzLmNzdiAtLWRyeS1ydW5cIixcbiAgICAnPCU9IGNvbmZpZy5iaW4gJT4gc21zIGJhdGNoIC0tZmlsZSBwaG9uZXMuY3N2IC0tdGV4dCBcIkNvZGU6IDEyM1wiIC0tdHlwZSB0cmFuc2FjdGlvbmFsJyxcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHNtcyBiYXRjaCAtLXJldXNlIGFiYzEyMy1kZWY0NTZcIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHNtcyBiYXRjaCAtLWhpc3RvcnlcIixcbiAgXTtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uQXV0aGVudGljYXRlZENvbW1hbmQuYmFzZUZsYWdzLFxuICAgIGZpbGU6IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcIkZcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkNTViBmaWxlIHdpdGggcGhvbmUgbnVtYmVycyAoYW5kIG9wdGlvbmFsIG1lc3NhZ2UgdGV4dClcIixcbiAgICAgIGV4Y2x1c2l2ZTogW1widG9cIiwgXCJyZXVzZVwiLCBcImhpc3RvcnlcIl0sXG4gICAgfSksXG4gICAgdG86IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcInRcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkNvbW1hLXNlcGFyYXRlZCByZWNpcGllbnQgcGhvbmUgbnVtYmVycyAoRS4xNjQgZm9ybWF0KVwiLFxuICAgICAgZXhjbHVzaXZlOiBbXCJmaWxlXCIsIFwicmV1c2VcIiwgXCJoaXN0b3J5XCJdLFxuICAgIH0pLFxuICAgIHRleHQ6IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcIm1cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIk1lc3NhZ2UgdGV4dCAocmVxdWlyZWQgd2l0aCAtLXRvLCBvcHRpb25hbCB3aXRoIC0tZmlsZSBpZiBDU1YgaGFzIHRleHQgY29sdW1uKVwiLFxuICAgIH0pLFxuICAgIGZyb206IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcImZcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlNlbmRlciBJRCBvciBwaG9uZSBudW1iZXIgZm9yIGFsbCBtZXNzYWdlc1wiLFxuICAgIH0pLFxuICAgIHR5cGU6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJNZXNzYWdlIHR5cGU6IG1hcmtldGluZyAoZGVmYXVsdCkgb3IgdHJhbnNhY3Rpb25hbC4gVHJhbnNhY3Rpb25hbCBieXBhc3NlcyBxdWlldCBob3Vycy5cIixcbiAgICAgIG9wdGlvbnM6IFtcIm1hcmtldGluZ1wiLCBcInRyYW5zYWN0aW9uYWxcIl0sXG4gICAgICBkZWZhdWx0OiBcIm1hcmtldGluZ1wiLFxuICAgIH0pLFxuICAgIFwiZHJ5LXJ1blwiOiBGbGFncy5ib29sZWFuKHtcbiAgICAgIGNoYXI6IFwiZFwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUHJldmlldyBiYXRjaCB3aXRob3V0IHNlbmRpbmcgKHZhbGlkYXRlcyBhY2Nlc3MsIHNob3dzIGNvc3QgYW5kIGNvbXBsaWFuY2UgYnJlYWtkb3duKVwiLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgfSksXG4gICAgcmV1c2U6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJSZS11c2UgYSBwcmV2aW91cyBiYXRjaCB1cGxvYWQgYnkgSUQgKHNlZSAtLWhpc3RvcnkpXCIsXG4gICAgICBleGNsdXNpdmU6IFtcImZpbGVcIiwgXCJ0b1wiLCBcImhpc3RvcnlcIl0sXG4gICAgfSksXG4gICAgaGlzdG9yeTogRmxhZ3MuYm9vbGVhbih7XG4gICAgICBkZXNjcmlwdGlvbjogXCJTaG93IHJlY2VudCBiYXRjaCB1cGxvYWQgaGlzdG9yeVwiLFxuICAgICAgZXhjbHVzaXZlOiBbXCJmaWxlXCIsIFwidG9cIiwgXCJyZXVzZVwiXSxcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIH0pLFxuICB9O1xuXG4gIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGZsYWdzIH0gPSBhd2FpdCB0aGlzLnBhcnNlKFNtc0JhdGNoKTtcblxuICAgIC8vIEhhbmRsZSBoaXN0b3J5IHN1YmNvbW1hbmRcbiAgICBpZiAoZmxhZ3MuaGlzdG9yeSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2hvd0hpc3RvcnkoKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcmV1c2Ugc3ViY29tbWFuZFxuICAgIGlmIChmbGFncy5yZXVzZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmV1c2VCYXRjaChmbGFncy5yZXVzZSwgZmxhZ3MpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSAtLXRvIGZsYWcgKGlubGluZSByZWNpcGllbnRzLCBubyB1cGxvYWQgbmVlZGVkKVxuICAgIGlmIChmbGFncy50bykge1xuICAgICAgcmV0dXJuIHRoaXMuc2VuZElubGluZVJlY2lwaWVudHMoZmxhZ3MpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSAtLWZpbGUgZmxhZyAodXBsb2FkIHRvIFN1cGFiYXNlKVxuICAgIGlmIChmbGFncy5maWxlKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGxvYWRBbmRTZW5kKGZsYWdzKTtcbiAgICB9XG5cbiAgICBlcnJvcihcIkVpdGhlciAtLWZpbGUsIC0tdG8sIC0tcmV1c2UsIG9yIC0taGlzdG9yeSBpcyByZXF1aXJlZFwiKTtcbiAgICB0aGlzLmV4aXQoMSk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBiYXRjaCB1cGxvYWQgaGlzdG9yeVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaG93SGlzdG9yeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzcGluID0gc3Bpbm5lcihcIkZldGNoaW5nIGJhdGNoIGhpc3RvcnkuLi5cIikuc3RhcnQoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUNsaWVudC5nZXQ8QmF0Y2hIaXN0b3J5UmVzcG9uc2U+KFxuICAgICAgICBcIi9hcGkvY2xpL2JhdGNoL2hpc3RvcnlcIixcbiAgICAgICAgeyBsaW1pdDogMTUgfSxcbiAgICAgICk7XG5cbiAgICAgIHNwaW4uc3RvcCgpO1xuXG4gICAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICAgIGpzb24ocmVzcG9uc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNwb25zZS51cGxvYWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiXFxuTm8gYmF0Y2ggdXBsb2FkcyBmb3VuZC5cXG5cIikpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIlVwbG9hZCBhIENTViBmaWxlIHdpdGg6IHNlbmRseSBzbXMgYmF0Y2ggLS1maWxlIHlvdXIuY3N2XCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5ib2xkKFwiXFxu8J+TgSBSZWNlbnQgQmF0Y2ggVXBsb2Fkc1xcblwiKSk7XG4gICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwi4pSAXCIucmVwZWF0KDgwKSkpO1xuXG4gICAgICBmb3IgKGNvbnN0IHVwbG9hZCBvZiByZXNwb25zZS51cGxvYWRzKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh1cGxvYWQuY3JlYXRlZEF0KS50b0xvY2FsZVN0cmluZygpO1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5mb3JtYXRCeXRlcyh1cGxvYWQuc2l6ZSk7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHVwbG9hZC5tZXRhZGF0YT8uc291cmNlID09PSBcImNsaVwiID8gXCJDTElcIiA6IFwiV2ViXCI7XG5cbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYCR7Y29sb3JzLmluZm8odXBsb2FkLmlkLnNsaWNlKDAsIDgpKX0gICR7dXBsb2FkLmZpbGVuYW1lfWAsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNvbG9ycy5kaW0oXG4gICAgICAgICAgICBgICAgJHtkYXRlfSB8ICR7c2l6ZX0gfCAke3VwbG9hZC5tZXRhZGF0YT8udmFsaWRDb3VudCB8fCAwfSB2YWxpZCByZWNpcGllbnRzIHwgJHtzb3VyY2V9YCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwi4pSAXCIucmVwZWF0KDgwKSkpO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNvbG9ycy5kaW0oXCJcXG5SZS11c2UgYSBiYXRjaDogc2VuZGx5IHNtcyBiYXRjaCAtLXJldXNlIDxpZD5cIiksXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc3Bpbi5zdG9wKCk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlLXVzZSBhIHByZXZpb3VzIGJhdGNoIHVwbG9hZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXVzZUJhdGNoKFxuICAgIHVwbG9hZElkOiBzdHJpbmcsXG4gICAgZmxhZ3M6IHsgdGV4dD86IHN0cmluZzsgZnJvbT86IHN0cmluZzsgdHlwZT86IHN0cmluZzsgXCJkcnktcnVuXCI/OiBib29sZWFuIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNwaW4gPSBzcGlubmVyKFwiRmV0Y2hpbmcgYmF0Y2ggZGF0YS4uLlwiKS5zdGFydCgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpQ2xpZW50LmdldDxCYXRjaFVwbG9hZFJlc3BvbnNlPihcbiAgICAgICAgYC9hcGkvY2xpL2JhdGNoL3JldXNlLyR7dXBsb2FkSWR9YCxcbiAgICAgICk7XG5cbiAgICAgIHNwaW4uc3RvcCgpO1xuXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY29sb3JzLnN1Y2Nlc3MoYFxcbuKckyBMb2FkZWQgYmF0Y2g6ICR7cmVzcG9uc2UudXBsb2FkLmZpbGVuYW1lfWApLFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjb2xvcnMuZGltKFxuICAgICAgICAgIGAgICR7cmVzcG9uc2UudmFsaWRhdGlvbi52YWxpZENvdW50fSB2YWxpZCByZWNpcGllbnRzIGZyb20gJHtyZXNwb25zZS52YWxpZGF0aW9uLnRvdGFsUm93c30gcm93c2AsXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgICAvLyBBcHBseSBzaGFyZWQgdGV4dCBpZiBwcm92aWRlZFxuICAgICAgbGV0IG1lc3NhZ2VzID0gcmVzcG9uc2UucmVjaXBpZW50cztcbiAgICAgIGlmIChmbGFncy50ZXh0KSB7XG4gICAgICAgIG1lc3NhZ2VzID0gbWVzc2FnZXMubWFwKChyKSA9PiAoe1xuICAgICAgICAgIHRvOiByLnRvLFxuICAgICAgICAgIHRleHQ6IHIudGV4dCB8fCBmbGFncy50ZXh0LFxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGFsbCBtZXNzYWdlcyBoYXZlIHRleHRcbiAgICAgIGNvbnN0IG1pc3NpbmdUZXh0ID0gbWVzc2FnZXMuZmlsdGVyKChtKSA9PiAhbS50ZXh0Py50cmltKCkpO1xuICAgICAgaWYgKG1pc3NpbmdUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXJyb3IoXG4gICAgICAgICAgYCR7bWlzc2luZ1RleHQubGVuZ3RofSByZWNpcGllbnRzIG1pc3NpbmcgbWVzc2FnZSB0ZXh0LiBVc2UgLS10ZXh0IHRvIHByb3ZpZGUgYSBkZWZhdWx0LmAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJvY2VlZCB3aXRoIHByZXZpZXcgb3Igc2VuZFxuICAgICAgYXdhaXQgdGhpcy5wcmV2aWV3T3JTZW5kKFxuICAgICAgICBtZXNzYWdlcyBhcyBBcnJheTx7IHRvOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9PixcbiAgICAgICAgZmxhZ3MsXG4gICAgICAgIHJlc3BvbnNlLnVwbG9hZC5pZCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzcGluLnN0b3AoKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZCB0byBpbmxpbmUgcmVjaXBpZW50cyAoLS10byBmbGFnKVxuICAgKiBUaGlzIHBhdGggZG9lc24ndCB1cGxvYWQgdG8gU3VwYWJhc2Ugc2luY2UgaXQncyBqdXN0IGEgZmV3IG51bWJlcnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZElubGluZVJlY2lwaWVudHMoZmxhZ3M6IHtcbiAgICB0bz86IHN0cmluZztcbiAgICB0ZXh0Pzogc3RyaW5nO1xuICAgIGZyb20/OiBzdHJpbmc7XG4gICAgdHlwZT86IHN0cmluZztcbiAgICBcImRyeS1ydW5cIj86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWZsYWdzLnRleHQpIHtcbiAgICAgIGVycm9yKFwiLS10ZXh0IGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgLS10b1wiKTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwaG9uZXMgPSBmbGFncy50byEuc3BsaXQoXCIsXCIpLm1hcCgocCkgPT4gcC50cmltKCkpO1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gcGhvbmVzLm1hcCgocGhvbmUpID0+ICh7XG4gICAgICB0bzogcGhvbmUuc3RhcnRzV2l0aChcIitcIikgPyBwaG9uZSA6IGArJHtwaG9uZX1gLFxuICAgICAgdGV4dDogZmxhZ3MudGV4dCEsXG4gICAgfSkpO1xuXG4gICAgLy8gVmFsaWRhdGUgcGhvbmUgbnVtYmVyc1xuICAgIGZvciAoY29uc3QgbXNnIG9mIG1lc3NhZ2VzKSB7XG4gICAgICBpZiAoIS9eXFwrWzEtOV1cXGR7MSwxNH0kLy50ZXN0KG1zZy50bykpIHtcbiAgICAgICAgZXJyb3IoYEludmFsaWQgcGhvbmUgbnVtYmVyOiAke21zZy50b31gLCB7XG4gICAgICAgICAgaGludDogXCJVc2UgRS4xNjQgZm9ybWF0OiArMTU1NTEyMzQ1NjdcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnByZXZpZXdPclNlbmQobWVzc2FnZXMsIGZsYWdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWQgQ1NWIHRvIFN1cGFiYXNlIGFuZCBzZW5kXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHVwbG9hZEFuZFNlbmQoZmxhZ3M6IHtcbiAgICBmaWxlPzogc3RyaW5nO1xuICAgIHRleHQ/OiBzdHJpbmc7XG4gICAgZnJvbT86IHN0cmluZztcbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIFwiZHJ5LXJ1blwiPzogYm9vbGVhbjtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gZmxhZ3MuZmlsZSE7XG5cbiAgICAvLyBDaGVjayBmaWxlIGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgIGVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBmaWxlIGV4dGVuc2lvblxuICAgIGlmICghZmlsZVBhdGguZW5kc1dpdGgoXCIuY3N2XCIpKSB7XG4gICAgICBlcnJvcihcIk9ubHkgQ1NWIGZpbGVzIGFyZSBzdXBwb3J0ZWRcIiwge1xuICAgICAgICBoaW50OiBcIkNvbnZlcnQgeW91ciBmaWxlIHRvIENTViBmb3JtYXQgd2l0aCBjb2x1bW5zOiBwaG9uZSxtZXNzYWdlXCIsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBSZWFkIGZpbGVcbiAgICBjb25zdCBidWZmZXIgPSByZWFkRmlsZVN5bmMoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gYmFzZW5hbWUoZmlsZVBhdGgpO1xuXG4gICAgLy8gQ2hlY2sgZmlsZSBzaXplICg1TUIgbGltaXQpXG4gICAgaWYgKGJ1ZmZlci5sZW5ndGggPiA1ICogMTAyNCAqIDEwMjQpIHtcbiAgICAgIGVycm9yKFwiRmlsZSB0b28gbGFyZ2UgKG1heCA1TUIpXCIsIHtcbiAgICAgICAgaGludDogXCJTcGxpdCB5b3VyIENTViBpbnRvIHNtYWxsZXIgZmlsZXNcIixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHNwaW4gPSBzcGlubmVyKGBVcGxvYWRpbmcgJHtmaWxlbmFtZX0uLi5gKS5zdGFydCgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVwbG9hZCB0byBTdXBhYmFzZSB2aWEgQ0xJIGVuZHBvaW50XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUNsaWVudC51cGxvYWRGaWxlPEJhdGNoVXBsb2FkUmVzcG9uc2U+KFxuICAgICAgICBcIi9hcGkvY2xpL2JhdGNoL3VwbG9hZFwiLFxuICAgICAgICB7IGJ1ZmZlciwgZmlsZW5hbWUsIG1pbWV0eXBlOiBcInRleHQvY3N2XCIgfSxcbiAgICAgICk7XG5cbiAgICAgIHNwaW4uc3RvcCgpO1xuXG4gICAgICAvLyBTaG93IHVwbG9hZCBzdW1tYXJ5XG4gICAgICBjb25zb2xlLmxvZyhjb2xvcnMuc3VjY2VzcyhgXFxu4pyTIFVwbG9hZGVkOiAke3Jlc3BvbnNlLnVwbG9hZC5maWxlbmFtZX1gKSk7XG4gICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKGAgIFVwbG9hZCBJRDogJHtyZXNwb25zZS51cGxvYWQuaWR9YCkpO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNvbG9ycy5kaW0oXG4gICAgICAgICAgYCAgJHtyZXNwb25zZS52YWxpZGF0aW9uLnZhbGlkQ291bnR9IHZhbGlkIC8gJHtyZXNwb25zZS52YWxpZGF0aW9uLmludmFsaWRDb3VudH0gaW52YWxpZCAvICR7cmVzcG9uc2UudmFsaWRhdGlvbi5kdXBsaWNhdGVzUmVtb3ZlZH0gZHVwbGljYXRlcyByZW1vdmVkYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAgIC8vIFNob3cgdmFsaWRhdGlvbiBlcnJvcnMgaWYgYW55XG4gICAgICBpZiAocmVzcG9uc2UuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coY29sb3JzLndhcm5pbmcoYFxcbuKaoO+4jyAgVmFsaWRhdGlvbiBlcnJvcnM6YCkpO1xuICAgICAgICBmb3IgKGNvbnN0IGVyciBvZiByZXNwb25zZS5lcnJvcnMuc2xpY2UoMCwgNSkpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNvbG9ycy5kaW0oYCAgIFJvdyAke2Vyci5yb3d9OiAke2Vyci5waG9uZX0gLSAke2Vyci5lcnJvcn1gKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNwb25zZS5oYXNNb3JlRXJyb3JzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjb2xvcnMuZGltKFxuICAgICAgICAgICAgICBgICAgLi4uIGFuZCAke3Jlc3BvbnNlLnZhbGlkYXRpb24uaW52YWxpZENvdW50IC0gNX0gbW9yZSBlcnJvcnNgLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNwb25zZS5yZWNpcGllbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBlcnJvcihcIk5vIHZhbGlkIHJlY2lwaWVudHMgZm91bmQgaW4gQ1NWXCIpO1xuICAgICAgICB0aGlzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IHNoYXJlZCB0ZXh0IGlmIHByb3ZpZGVkXG4gICAgICBsZXQgbWVzc2FnZXMgPSByZXNwb25zZS5yZWNpcGllbnRzO1xuICAgICAgaWYgKGZsYWdzLnRleHQpIHtcbiAgICAgICAgbWVzc2FnZXMgPSBtZXNzYWdlcy5tYXAoKHIpID0+ICh7XG4gICAgICAgICAgdG86IHIudG8sXG4gICAgICAgICAgdGV4dDogci50ZXh0IHx8IGZsYWdzLnRleHQsXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgYWxsIG1lc3NhZ2VzIGhhdmUgdGV4dFxuICAgICAgY29uc3QgbWlzc2luZ1RleHQgPSBtZXNzYWdlcy5maWx0ZXIoKG0pID0+ICFtLnRleHQ/LnRyaW0oKSk7XG4gICAgICBpZiAobWlzc2luZ1RleHQubGVuZ3RoID4gMCkge1xuICAgICAgICBlcnJvcihcbiAgICAgICAgICBgJHttaXNzaW5nVGV4dC5sZW5ndGh9IHJlY2lwaWVudHMgbWlzc2luZyBtZXNzYWdlIHRleHQuIFVzZSAtLXRleHQgdG8gcHJvdmlkZSBhIGRlZmF1bHQuYCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY29sb3JzLmRpbShcbiAgICAgICAgICAgIFwiXFxuQ1NWIHNob3VsZCBoYXZlIGNvbHVtbnM6IHBob25lLG1lc3NhZ2UgT1IgdXNlIC0tdGV4dCBmbGFnXCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZWVkIHdpdGggcHJldmlldyBvciBzZW5kXG4gICAgICBhd2FpdCB0aGlzLnByZXZpZXdPclNlbmQoXG4gICAgICAgIG1lc3NhZ2VzIGFzIEFycmF5PHsgdG86IHN0cmluZzsgdGV4dDogc3RyaW5nIH0+LFxuICAgICAgICBmbGFncyxcbiAgICAgICAgcmVzcG9uc2UudXBsb2FkLmlkLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNwaW4uc3RvcCgpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmV2aWV3IG9yIHNlbmQgdGhlIGJhdGNoXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZXZpZXdPclNlbmQoXG4gICAgbWVzc2FnZXM6IEFycmF5PHsgdG86IHN0cmluZzsgdGV4dDogc3RyaW5nIH0+LFxuICAgIGZsYWdzOiB7IGZyb20/OiBzdHJpbmc7IHR5cGU/OiBzdHJpbmc7IFwiZHJ5LXJ1blwiPzogYm9vbGVhbiB9LFxuICAgIHVwbG9hZElkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBiYXRjaCBzaXplXG4gICAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA+IDEwMDApIHtcbiAgICAgIGVycm9yKFwiQmF0Y2ggc2l6ZSBjYW5ub3QgZXhjZWVkIDEwMDAgbWVzc2FnZXNcIiwge1xuICAgICAgICBoaW50OiBcIlNwbGl0IHlvdXIgbWVzc2FnZXMgaW50byBzbWFsbGVyIGJhdGNoZXNcIixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBkcnktcnVuIG1vZGVcbiAgICBpZiAoZmxhZ3NbXCJkcnktcnVuXCJdKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaG93UHJldmlldyhtZXNzYWdlcywgZmxhZ3MpO1xuICAgIH1cblxuICAgIC8vIFNlbmQgdGhlIGJhdGNoXG4gICAgY29uc3Qgc3BpbiA9IHNwaW5uZXIoYFNlbmRpbmcgJHttZXNzYWdlcy5sZW5ndGh9IG1lc3NhZ2VzLi4uYCk7XG4gICAgc3Bpbi5zdGFydCgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpQ2xpZW50LnBvc3Q8QmF0Y2hSZXNwb25zZT4oXG4gICAgICAgIFwiL2FwaS92MS9tZXNzYWdlcy9iYXRjaFwiLFxuICAgICAgICB7XG4gICAgICAgICAgbWVzc2FnZXMsXG4gICAgICAgICAgbWVzc2FnZVR5cGU6IGZsYWdzLnR5cGUsXG4gICAgICAgICAgLi4uKGZsYWdzLmZyb20gJiYgeyBmcm9tOiBmbGFncy5mcm9tIH0pLFxuICAgICAgICAgIC4uLih1cGxvYWRJZCAmJiB7IHVwbG9hZElkIH0pLCAvLyBMaW5rIHRvIGZpbGUgdXBsb2FkIGZvciBhdWRpdCB0cmFpbFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgc3Bpbi5zdG9wKCk7XG5cbiAgICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgICAganNvbihyZXNwb25zZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRGV0ZXJtaW5lIHN1Y2Nlc3MgbGV2ZWxcbiAgICAgIGNvbnN0IGFsbFN1Y2NlZWRlZCA9IHJlc3BvbnNlLmZhaWxlZCA9PT0gMDtcbiAgICAgIGNvbnN0IGFsbEZhaWxlZCA9IHJlc3BvbnNlLnNlbnQgPT09IDAgJiYgcmVzcG9uc2UuZmFpbGVkID4gMDtcbiAgICAgIGNvbnN0IHBhcnRpYWxTdWNjZXNzID0gcmVzcG9uc2Uuc2VudCA+IDAgJiYgcmVzcG9uc2UuZmFpbGVkID4gMDtcblxuICAgICAgaWYgKGFsbFN1Y2NlZWRlZCkge1xuICAgICAgICBzdWNjZXNzKFwiQmF0Y2ggc2VudCBzdWNjZXNzZnVsbHlcIiwge1xuICAgICAgICAgIFwiQmF0Y2ggSURcIjogcmVzcG9uc2UuYmF0Y2hJZCxcbiAgICAgICAgICBUb3RhbDogcmVzcG9uc2UudG90YWwsXG4gICAgICAgICAgU2VudDogY29sb3JzLnN1Y2Nlc3MoU3RyaW5nKHJlc3BvbnNlLnNlbnQpKSxcbiAgICAgICAgICBcIkNyZWRpdHMgVXNlZFwiOiByZXNwb25zZS5jcmVkaXRzVXNlZCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGFsbEZhaWxlZCkge1xuICAgICAgICBlcnJvcihcIkJhdGNoIGZhaWxlZFwiLCB7XG4gICAgICAgICAgaGludDogYEFsbCAke3Jlc3BvbnNlLmZhaWxlZH0gbWVzc2FnZXMgZmFpbGVkIHRvIHNlbmRgLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShgICBCYXRjaCBJRDogJHtyZXNwb25zZS5iYXRjaElkfWApKTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY29sb3JzLmRpbShgICBDcmVkaXRzIFJlZnVuZGVkOiAke3Jlc3BvbnNlLmNyZWRpdHNSZWZ1bmRlZH1gKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAocGFydGlhbFN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc29sZS5sb2coY29sb3JzLndhcm5pbmcoXCJcXG7imqDvuI8gIEJhdGNoIGNvbXBsZXRlZCB3aXRoIGVycm9yc1xcblwiKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgIEJhdGNoIElEOiAgICAgICAgICR7cmVzcG9uc2UuYmF0Y2hJZH1gKTtcbiAgICAgICAgY29uc29sZS5sb2coYCAgVG90YWw6ICAgICAgICAgICAgJHtyZXNwb25zZS50b3RhbH1gKTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYCAgU2VudDogICAgICAgICAgICAgJHtjb2xvcnMuc3VjY2VzcyhTdHJpbmcocmVzcG9uc2Uuc2VudCkpfWAsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGAgIEZhaWxlZDogICAgICAgICAgICR7Y29sb3JzLmVycm9yKFN0cmluZyhyZXNwb25zZS5mYWlsZWQpKX1gLFxuICAgICAgICApO1xuICAgICAgICBjb25zb2xlLmxvZyhgICBDcmVkaXRzIFVzZWQ6ICAgICAke3Jlc3BvbnNlLmNyZWRpdHNVc2VkfWApO1xuICAgICAgICBjb25zb2xlLmxvZyhgICBDcmVkaXRzIFJlZnVuZGVkOiAke3Jlc3BvbnNlLmNyZWRpdHNSZWZ1bmRlZH1gKTtcblxuICAgICAgICAvLyBTaG93IGZhaWxlZCBtZXNzYWdlcyBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKHJlc3BvbnNlLm1lc3NhZ2VzKSB7XG4gICAgICAgICAgY29uc3QgZmFpbGVkTXNncyA9IHJlc3BvbnNlLm1lc3NhZ2VzLmZpbHRlcihcbiAgICAgICAgICAgIChtKSA9PiBtLnN0YXR1cyA9PT0gXCJmYWlsZWRcIixcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChmYWlsZWRNc2dzLmxlbmd0aCA+IDAgJiYgZmFpbGVkTXNncy5sZW5ndGggPD0gNSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIlxcbiAgRmFpbGVkIG1lc3NhZ2VzOlwiKSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG1zZyBvZiBmYWlsZWRNc2dzKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIGNvbG9ycy5kaW0oYCAgICAke21zZy50b306ICR7bXNnLmVycm9yIHx8IFwiVW5rbm93biBlcnJvclwifWApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZmFpbGVkTXNncy5sZW5ndGggPiA1KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgY29sb3JzLmRpbShcbiAgICAgICAgICAgICAgICBgXFxuICAke2ZhaWxlZE1zZ3MubGVuZ3RofSBtZXNzYWdlcyBmYWlsZWQuIFVzZSAtLWpzb24gZm9yIGRldGFpbHMuYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzcGluLnN0b3AoKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBiYXRjaCBwcmV2aWV3IChkcnktcnVuIG1vZGUpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNob3dQcmV2aWV3KFxuICAgIG1lc3NhZ2VzOiBBcnJheTx7IHRvOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9PixcbiAgICBmbGFnczogeyB0eXBlPzogc3RyaW5nIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNwaW4gPSBzcGlubmVyKFwiQW5hbHl6aW5nIGJhdGNoLi4uXCIpLnN0YXJ0KCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJldmlldyA9IGF3YWl0IGFwaUNsaWVudC5wb3N0PEJhdGNoUHJldmlld1Jlc3BvbnNlPihcbiAgICAgICAgXCIvYXBpL3YxL21lc3NhZ2VzL2JhdGNoL3ByZXZpZXdcIixcbiAgICAgICAgeyBtZXNzYWdlcywgbWVzc2FnZVR5cGU6IGZsYWdzLnR5cGUgfSxcbiAgICAgICk7XG5cbiAgICAgIHNwaW4uc3RvcCgpO1xuXG4gICAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICAgIGpzb24ocHJldmlldyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU2hvdyBjb21wcmVoZW5zaXZlIHByZXZpZXdcbiAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5ib2xkKFwiXFxu8J+TiiBCYXRjaCBQcmV2aWV3IChEcnkgUnVuKVxcblwiKSk7XG5cbiAgICAgIC8vIFN1bW1hcnkgdGFibGVcbiAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCLilIBcIi5yZXBlYXQoNTApKSk7XG4gICAgICBjb25zb2xlLmxvZyhgVG90YWwgbWVzc2FnZXM6ICAgICAke3ByZXZpZXcudG90YWx9YCk7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFNlbmRhYmxlOiAgICAgICAgICAgJHtjb2xvcnMuc3VjY2VzcyhTdHJpbmcocHJldmlldy5zZW5kYWJsZSkpfWAsXG4gICAgICApO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBCbG9ja2VkOiAgICAgICAgICAgICR7cHJldmlldy5ibG9ja2VkID4gMCA/IGNvbG9ycy5lcnJvcihTdHJpbmcocHJldmlldy5ibG9ja2VkKSkgOiBcIjBcIn1gLFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKGBEdXBsaWNhdGVzIHJlbW92ZWQ6ICR7cHJldmlldy5kdXBsaWNhdGVzfWApO1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIuKUgFwiLnJlcGVhdCg1MCkpKTtcblxuICAgICAgLy8gQ3JlZGl0c1xuICAgICAgY29uc29sZS5sb2coYFxcbkNyZWRpdHMgbmVlZGVkOiAgICAgJHtwcmV2aWV3LmNyZWRpdHNOZWVkZWR9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgWW91ciBiYWxhbmNlOiAgICAgICAke3ByZXZpZXcuY3JlZGl0QmFsYW5jZX1gKTtcbiAgICAgIGlmICghcHJldmlldy5oYXNTdWZmaWNpZW50Q3JlZGl0cykge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjb2xvcnMuZXJyb3IoXG4gICAgICAgICAgICBg4pqg77iPICBJbnN1ZmZpY2llbnQgY3JlZGl0cyEgTmVlZCAke3ByZXZpZXcuY3JlZGl0c05lZWRlZCAtIHByZXZpZXcuY3JlZGl0QmFsYW5jZX0gbW9yZS5gLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFjY2VzcyBpbmZvXG4gICAgICBjb25zb2xlLmxvZyhgXFxuQVBJIEtleSB0eXBlOiAgICAgICAke3ByZXZpZXcua2V5VHlwZS50b1VwcGVyQ2FzZSgpfWApO1xuICAgICAgY29uc29sZS5sb2coYFdyaXRlIGFjY2VzczogICAgICAgJHtwcmV2aWV3Lmhhc1dyaXRlU2NvcGUgPyBcIuKck1wiIDogXCLinJdcIn1gKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgRG9tZXN0aWMgKFVTL0NBKTogICAke3ByZXZpZXcubWVzc2FnaW5nUHJvZmlsZS5jYW5TZW5kRG9tZXN0aWMgPyBcIuKck1wiIDogXCLinJdcIn1gLFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgSW50ZXJuYXRpb25hbDogICAgICAke3ByZXZpZXcubWVzc2FnaW5nUHJvZmlsZS5jYW5TZW5kSW50ZXJuYXRpb25hbCA/IFwi4pyTXCIgOiBcIuKcl1wifWAsXG4gICAgICApO1xuXG4gICAgICAvLyBDb3VudHJ5IGJyZWFrZG93blxuICAgICAgY29uc3QgY291bnRyaWVzID0gT2JqZWN0LmVudHJpZXMocHJldmlldy5ieUNvdW50cnkpO1xuICAgICAgaWYgKGNvdW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5ib2xkKFwiXFxu8J+TjSBCeSBDb3VudHJ5OlxcblwiKSk7XG4gICAgICAgIGZvciAoY29uc3QgW2NvdW50cnksIGRhdGFdIG9mIGNvdW50cmllcykge1xuICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGRhdGEuYWxsb3dlZCA/IGNvbG9ycy5zdWNjZXNzKFwi4pyTXCIpIDogY29sb3JzLmVycm9yKFwi4pyXXCIpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYCAgJHtzdGF0dXN9ICR7Y291bnRyeX06ICR7ZGF0YS5jb3VudH0gbXNncywgJHtkYXRhLmNyZWRpdHN9IGNyZWRpdHMgKCR7ZGF0YS50aWVyfSlgLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFkYXRhLmFsbG93ZWQgJiYgZGF0YS5ibG9ja2VkUmVhc29uKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKGAgICAgIOKUlOKUgCAke2RhdGEuYmxvY2tlZFJlYXNvbn1gKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENvbXBsaWFuY2UgY2hlY2sgcmVzdWx0c1xuICAgICAgaWYgKHByZXZpZXcuY29tcGxpYW5jZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhjb2xvcnMuYm9sZChcIlxcbvCfm6HvuI8gIENvbXBsaWFuY2UgQ2hlY2s6XFxuXCIpKTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYCAgTWVzc2FnZSBUeXBlOiAgICAgICR7cHJldmlldy5jb21wbGlhbmNlLm1lc3NhZ2VUeXBlLnRvVXBwZXJDYXNlKCl9YCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocHJldmlldy5jb21wbGlhbmNlLnNoYWZ0QmxvY2tlZCA+IDApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNvbG9ycy5lcnJvcihcbiAgICAgICAgICAgICAgYCAgU0hBRlQgQmxvY2tlZDogICAgICR7cHJldmlldy5jb21wbGlhbmNlLnNoYWZ0QmxvY2tlZH0gbWVzc2FnZXNgLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGZvciAoY29uc3QgbXNnIG9mIHByZXZpZXcuY29tcGxpYW5jZS5zaGFmdEJsb2NrZWRNZXNzYWdlcy5zbGljZShcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAzLFxuICAgICAgICAgICkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjb2xvcnMuZGltKFxuICAgICAgICAgICAgICAgIGAgICAgIOKUlOKUgCAke21zZy50b306ICR7bXNnLmNhdGVnb3J5fSAoJHttc2cubWF0Y2hlZFRlcm1zLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcmV2aWV3LmNvbXBsaWFuY2Uuc2hhZnRCbG9ja2VkTWVzc2FnZXMubGVuZ3RoID4gMykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNvbG9ycy5kaW0oXG4gICAgICAgICAgICAgICAgYCAgICAgLi4uIGFuZCAke3ByZXZpZXcuY29tcGxpYW5jZS5zaGFmdEJsb2NrZWRNZXNzYWdlcy5sZW5ndGggLSAzfSBtb3JlYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY29sb3JzLnN1Y2Nlc3MoXG4gICAgICAgICAgICAgIFwiICBTSEFGVCBDaGVjazogICAgICAg4pyTIEFsbCBtZXNzYWdlcyBwYXNzIGNvbnRlbnQgZmlsdGVyXCIsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJldmlldy5jb21wbGlhbmNlLm1lc3NhZ2VUeXBlID09PSBcIm1hcmtldGluZ1wiKSB7XG4gICAgICAgICAgaWYgKHByZXZpZXcuY29tcGxpYW5jZS5xdWlldEhvdXJzUmVzY2hlZHVsZWQgPiAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgY29sb3JzLndhcm5pbmcoXG4gICAgICAgICAgICAgICAgYCAgUXVpZXQgSG91cnM6ICAgICAgICR7cHJldmlldy5jb21wbGlhbmNlLnF1aWV0SG91cnNSZXNjaGVkdWxlZH0gbWVzc2FnZXMgd2lsbCBiZSByZXNjaGVkdWxlZGAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZm9yIChjb25zdCBtc2cgb2YgcHJldmlldy5jb21wbGlhbmNlLnF1aWV0SG91cnNCbG9ja2VkTWVzc2FnZXMuc2xpY2UoXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgIDMsXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5leHRUaW1lID0gbXNnLm5leHRBbGxvd2VkVGltZVxuICAgICAgICAgICAgICAgID8gbmV3IERhdGUobXNnLm5leHRBbGxvd2VkVGltZSkudG9Mb2NhbGVTdHJpbmcoKVxuICAgICAgICAgICAgICAgIDogXCJuZXh0IGF2YWlsYWJsZSB3aW5kb3dcIjtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY29sb3JzLmRpbShcbiAgICAgICAgICAgICAgICAgIGAgICAgIOKUlOKUgCAke21zZy50b306ICR7bXNnLnJlY2lwaWVudFRpbWV6b25lfSDihpIgJHtuZXh0VGltZX1gLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJldmlldy5jb21wbGlhbmNlLnF1aWV0SG91cnNCbG9ja2VkTWVzc2FnZXMubGVuZ3RoID4gMykge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjb2xvcnMuZGltKFxuICAgICAgICAgICAgICAgICAgYCAgICAgLi4uIGFuZCAke3ByZXZpZXcuY29tcGxpYW5jZS5xdWlldEhvdXJzQmxvY2tlZE1lc3NhZ2VzLmxlbmd0aCAtIDN9IG1vcmVgLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjb2xvcnMuc3VjY2VzcyhcbiAgICAgICAgICAgICAgICBcIiAgUXVpZXQgSG91cnM6ICAgICAgIOKckyBBbGwgcmVjaXBpZW50cyB3aXRoaW4gYWxsb3dlZCBob3Vyc1wiLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjb2xvcnMuZGltKFwiICBRdWlldCBIb3VyczogICAgICAgQnlwYXNzZWQgKHRyYW5zYWN0aW9uYWwgbWVzc2FnZSlcIiksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBXYXJuaW5nc1xuICAgICAgaWYgKHByZXZpZXcud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjb2xvcnMud2FybmluZyhcIlxcbuKaoO+4jyAgV2FybmluZ3M6XCIpKTtcbiAgICAgICAgZm9yIChjb25zdCB3IG9mIHByZXZpZXcud2FybmluZ3MpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAg4oCiICR7d31gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCbG9ja2VkIG1lc3NhZ2VzIChmaXJzdCA1KVxuICAgICAgaWYgKHByZXZpZXcuYmxvY2tlZE1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY29sb3JzLmVycm9yKFxuICAgICAgICAgICAgYFxcbuKdjCBCbG9ja2VkIE1lc3NhZ2VzICgke3ByZXZpZXcuYmxvY2tlZE1lc3NhZ2VzLmxlbmd0aH0gdG90YWwpOmAsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCBiIG9mIHByZXZpZXcuYmxvY2tlZE1lc3NhZ2VzLnNsaWNlKDAsIDUpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgICR7Yi50b306ICR7Yi5yZWFzb259YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXZpZXcuYmxvY2tlZE1lc3NhZ2VzLmxlbmd0aCA+IDUpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNvbG9ycy5kaW0oYCAgIC4uLiBhbmQgJHtwcmV2aWV3LmJsb2NrZWRNZXNzYWdlcy5sZW5ndGggLSA1fSBtb3JlYCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgXCJcXG5cIiArIGNvbG9ycy5kaW0oXCJObyBtZXNzYWdlcyB3ZXJlIHNlbnQuIFJlbW92ZSAtLWRyeS1ydW4gdG8gc2VuZC5cIiksXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc3Bpbi5zdG9wKCk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBieXRlcyB0byBodW1hbiByZWFkYWJsZSBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0Qnl0ZXMoYnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGJ5dGVzIDwgMTAyNCkgcmV0dXJuIGAke2J5dGVzfSBCYDtcbiAgICBpZiAoYnl0ZXMgPCAxMDI0ICogMTAyNCkgcmV0dXJuIGAkeyhieXRlcyAvIDEwMjQpLnRvRml4ZWQoMSl9IEtCYDtcbiAgICByZXR1cm4gYCR7KGJ5dGVzIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgxKX0gTUJgO1xuICB9XG59XG4iXX0=
|