@decohere/create 0.0.1-dev.37 → 0.0.1-dev.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/commonjs/src/models/compose.model.js +5 -1
- package/commonjs/src/webapi/features/database.feature.js +82 -19
- package/commonjs/src/webapi/features/postman.feature.js +30 -329
- package/commonjs/src/webapi/postman/hello-openapi.js +175 -0
- package/commonjs/src/webapi/postman/local-view.js +184 -0
- package/commonjs/src/webapi/postman/openapi-to-postman.js +202 -0
- package/es6/src/models/compose.model.js +5 -1
- package/es6/src/webapi/features/database.feature.js +82 -19
- package/es6/src/webapi/features/postman.feature.js +25 -329
- package/es6/src/webapi/postman/hello-openapi.js +168 -0
- package/es6/src/webapi/postman/local-view.js +169 -0
- package/es6/src/webapi/postman/openapi-to-postman.js +179 -0
- package/package.json +4 -3
- package/types/src/models/compose.model.d.ts +2 -0
- package/types/src/webapi/features/postman.feature.d.ts +4 -0
- package/types/src/webapi/postman/hello-openapi.d.ts +19 -0
- package/types/src/webapi/postman/local-view.d.ts +17 -0
- package/types/src/webapi/postman/openapi-to-postman.d.ts +62 -0
|
@@ -3,6 +3,9 @@ import { existsSync, readFileSync } from "node:fs";
|
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { pick } from "../../domain/prompt.js";
|
|
5
5
|
import { WELL_KNOWN_FILES } from "../../models/const.js";
|
|
6
|
+
import { buildHelloOpenApiDocument } from "../postman/hello-openapi.js";
|
|
7
|
+
import { buildEnvironmentYaml, buildLocalViewFilesFromCollection } from "../postman/local-view.js";
|
|
8
|
+
import { applyPostmanAuthOverlay, openApiToPostmanCollection } from "../postman/openapi-to-postman.js";
|
|
6
9
|
import * as auth0Cli from "./auth0-cli.js";
|
|
7
10
|
/** Postman OAuth callback URLs (popup + "Authorize using browser"). */ const POSTMAN_CALLBACKS = [
|
|
8
11
|
"https://oauth.pstmn.io/v1/callback",
|
|
@@ -17,6 +20,7 @@ import * as auth0Cli from "./auth0-cli.js";
|
|
|
17
20
|
"update:Hello",
|
|
18
21
|
"delete:Hello"
|
|
19
22
|
].join(" ");
|
|
23
|
+
const COLLECTION_DESCRIPTION = "Open the project root in Postman Local View (not the postman/ folder). " + "Select the Local environment, then Authorization → Get New Access Token (PKCE). " + "Routes are generated from OpenAPI; Auth0 overlay is hand-authored.";
|
|
20
24
|
async function getOptions(_workspace, cliOptions) {
|
|
21
25
|
if (cliOptions.postmanProvider != null) return {};
|
|
22
26
|
const choices = [
|
|
@@ -93,333 +97,17 @@ async function getOptions(_workspace, cliOptions) {
|
|
|
93
97
|
workspaceId
|
|
94
98
|
};
|
|
95
99
|
}
|
|
96
|
-
/**
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
key: "grant_type",
|
|
102
|
-
value: "authorization_code_with_pkce",
|
|
103
|
-
type: "string"
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
key: "authUrl",
|
|
107
|
-
value: "https://{{auth0Domain}}/authorize?audience={{auth0Audience}}",
|
|
108
|
-
type: "string"
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
key: "accessTokenUrl",
|
|
112
|
-
value: "https://{{auth0Domain}}/oauth/token",
|
|
113
|
-
type: "string"
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
key: "clientId",
|
|
117
|
-
value: "{{auth0ClientId}}",
|
|
118
|
-
type: "string"
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
key: "scope",
|
|
122
|
-
value: POSTMAN_SCOPES,
|
|
123
|
-
type: "string"
|
|
124
|
-
},
|
|
125
|
-
{
|
|
126
|
-
key: "redirect_uri",
|
|
127
|
-
value: POSTMAN_CALLBACKS[0],
|
|
128
|
-
type: "string"
|
|
129
|
-
},
|
|
130
|
-
{
|
|
131
|
-
key: "useBrowser",
|
|
132
|
-
value: "true",
|
|
133
|
-
type: "boolean"
|
|
134
|
-
},
|
|
135
|
-
{
|
|
136
|
-
key: "addTokenTo",
|
|
137
|
-
value: "header",
|
|
138
|
-
type: "string"
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
key: "challengeAlgorithm",
|
|
142
|
-
value: "S256",
|
|
143
|
-
type: "string"
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
key: "client_authentication",
|
|
147
|
-
value: "body",
|
|
148
|
-
type: "string"
|
|
149
|
-
},
|
|
150
|
-
{
|
|
151
|
-
key: "clientSecret",
|
|
152
|
-
value: "",
|
|
153
|
-
type: "string"
|
|
154
|
-
},
|
|
155
|
-
{
|
|
156
|
-
key: "tokenName",
|
|
157
|
-
value: `${projectName} Access Token`,
|
|
158
|
-
type: "string"
|
|
159
|
-
}
|
|
160
|
-
]
|
|
161
|
-
} : undefined;
|
|
162
|
-
const helloUrl = (path, raw)=>({
|
|
163
|
-
raw: `{{baseUrl}}${raw}`,
|
|
164
|
-
host: [
|
|
165
|
-
"{{baseUrl}}"
|
|
166
|
-
],
|
|
167
|
-
path: path.split("/").filter(Boolean)
|
|
168
|
-
});
|
|
169
|
-
return {
|
|
170
|
-
info: {
|
|
171
|
-
_postman_id: randomUUID(),
|
|
172
|
-
name: `${projectName} WebAPI`,
|
|
173
|
-
schema: "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
|
|
174
|
-
description: "Open the project root in Postman Local View (not the postman/ folder). " + "Select the Local environment, then Authorization → Get New Access Token (PKCE)."
|
|
175
|
-
},
|
|
176
|
-
...authObj ? {
|
|
177
|
-
auth: authObj
|
|
178
|
-
} : {},
|
|
179
|
-
item: [
|
|
180
|
-
{
|
|
181
|
-
name: "Hello",
|
|
182
|
-
item: [
|
|
183
|
-
{
|
|
184
|
-
name: "List (anonymous)",
|
|
185
|
-
request: {
|
|
186
|
-
auth: {
|
|
187
|
-
type: "noauth"
|
|
188
|
-
},
|
|
189
|
-
method: "GET",
|
|
190
|
-
url: helloUrl("hello", "/hello")
|
|
191
|
-
}
|
|
192
|
-
},
|
|
193
|
-
{
|
|
194
|
-
name: "Get by id",
|
|
195
|
-
request: {
|
|
196
|
-
method: "GET",
|
|
197
|
-
url: helloUrl("hello/:id", "/hello/:id")
|
|
198
|
-
}
|
|
199
|
-
},
|
|
200
|
-
{
|
|
201
|
-
name: "Create",
|
|
202
|
-
request: {
|
|
203
|
-
method: "POST",
|
|
204
|
-
header: [
|
|
205
|
-
{
|
|
206
|
-
key: "Content-Type",
|
|
207
|
-
value: "application/json"
|
|
208
|
-
}
|
|
209
|
-
],
|
|
210
|
-
body: {
|
|
211
|
-
mode: "raw",
|
|
212
|
-
raw: '{\n "message": "hello"\n}\n'
|
|
213
|
-
},
|
|
214
|
-
url: helloUrl("hello", "/hello")
|
|
215
|
-
}
|
|
216
|
-
},
|
|
217
|
-
{
|
|
218
|
-
name: "Update",
|
|
219
|
-
request: {
|
|
220
|
-
method: "PUT",
|
|
221
|
-
header: [
|
|
222
|
-
{
|
|
223
|
-
key: "Content-Type",
|
|
224
|
-
value: "application/json"
|
|
225
|
-
}
|
|
226
|
-
],
|
|
227
|
-
body: {
|
|
228
|
-
mode: "raw",
|
|
229
|
-
raw: '{\n "message": "updated"\n}\n'
|
|
230
|
-
},
|
|
231
|
-
url: helloUrl("hello/:id", "/hello/:id")
|
|
232
|
-
}
|
|
233
|
-
},
|
|
234
|
-
{
|
|
235
|
-
name: "Delete",
|
|
236
|
-
request: {
|
|
237
|
-
method: "DELETE",
|
|
238
|
-
url: helloUrl("hello/:id", "/hello/:id")
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
]
|
|
242
|
-
}
|
|
243
|
-
]
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
function yamlQuote(value) {
|
|
247
|
-
if (/[:#{}[\],&*?|<>=!%@`]/.test(value) || value.includes("\n") || value === "") {
|
|
248
|
-
return JSON.stringify(value);
|
|
249
|
-
}
|
|
250
|
-
return value;
|
|
251
|
-
}
|
|
252
|
-
/** Local View / Native Git environment (YAML). */ function buildEnvironmentYaml(name, auth) {
|
|
253
|
-
const values = [
|
|
254
|
-
{
|
|
255
|
-
key: "baseUrl",
|
|
256
|
-
value: "http://localhost:3000"
|
|
257
|
-
}
|
|
258
|
-
];
|
|
259
|
-
if (auth?.auth0Domain) {
|
|
260
|
-
values.push({
|
|
261
|
-
key: "auth0Domain",
|
|
262
|
-
value: auth.auth0Domain
|
|
263
|
-
}, {
|
|
264
|
-
key: "auth0Audience",
|
|
265
|
-
value: auth.auth0Audience ?? ""
|
|
266
|
-
}, {
|
|
267
|
-
key: "auth0ClientId",
|
|
268
|
-
value: auth.auth0ClientId ?? ""
|
|
269
|
-
}, {
|
|
270
|
-
key: "authUrl",
|
|
271
|
-
value: `https://${auth.auth0Domain}/authorize?audience=${auth.auth0Audience ?? ""}`
|
|
272
|
-
}, {
|
|
273
|
-
key: "accessTokenUrl",
|
|
274
|
-
value: `https://${auth.auth0Domain}/oauth/token`
|
|
275
|
-
}, {
|
|
276
|
-
key: "callbackUrl",
|
|
277
|
-
value: POSTMAN_CALLBACKS[0]
|
|
278
|
-
}, {
|
|
279
|
-
key: "scope",
|
|
280
|
-
value: POSTMAN_SCOPES
|
|
281
|
-
});
|
|
282
|
-
}
|
|
283
|
-
const lines = [
|
|
284
|
-
`name: ${yamlQuote(name)}`,
|
|
285
|
-
"values:"
|
|
286
|
-
];
|
|
287
|
-
for (const v of values){
|
|
288
|
-
lines.push(` - key: ${v.key}`);
|
|
289
|
-
lines.push(` value: ${yamlQuote(v.value)}`);
|
|
290
|
-
lines.push(" enabled: true");
|
|
100
|
+
/** Build Postman collection: OpenAPI routes + Auth0 auth overlay. */ export async function buildHybridPostmanCollection(projectName, auth) {
|
|
101
|
+
const openapi = buildHelloOpenApiDocument(projectName);
|
|
102
|
+
const base = await openApiToPostmanCollection(openapi);
|
|
103
|
+
if (base.info._postman_id == null) {
|
|
104
|
+
base.info._postman_id = randomUUID();
|
|
291
105
|
}
|
|
292
|
-
return
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
const files = [];
|
|
297
|
-
// Postman Local View stores OAuth under auth[].credentials (not the v2.1 oauth2 array).
|
|
298
|
-
// Use concrete https URLs — empty Auth URL yields "Invalid protocol for auth URL".
|
|
299
|
-
const authBlock = auth?.auth0Domain ? [
|
|
300
|
-
"auth:",
|
|
301
|
-
` - id: ${randomUUID()}`,
|
|
302
|
-
" type: oauth2",
|
|
303
|
-
" name: OAuth 2.0",
|
|
304
|
-
" credentials:",
|
|
305
|
-
" addTokenTo: header",
|
|
306
|
-
" grant_type: authorization_code_with_pkce",
|
|
307
|
-
` authUrl: https://${auth.auth0Domain}/authorize?audience=${auth.auth0Audience ?? ""}`,
|
|
308
|
-
` accessTokenUrl: https://${auth.auth0Domain}/oauth/token`,
|
|
309
|
-
` clientId: ${yamlQuote(auth.auth0ClientId ?? "")}`,
|
|
310
|
-
` scope: ${yamlQuote(POSTMAN_SCOPES)}`,
|
|
311
|
-
` redirect_uri: ${POSTMAN_CALLBACKS[0]}`,
|
|
312
|
-
" useBrowser: true",
|
|
313
|
-
" challengeAlgorithm: S256",
|
|
314
|
-
// SPA public client: Auth0 token endpoint rejects Basic auth (feacft Unauthorized).
|
|
315
|
-
" client_authentication: body",
|
|
316
|
-
' clientSecret: ""',
|
|
317
|
-
` tokenName: ${yamlQuote(`${projectName} Access Token`)}`,
|
|
318
|
-
""
|
|
319
|
-
].join("\n") : "";
|
|
320
|
-
files.push({
|
|
321
|
-
filePath: `${collectionDir}/.resources/definition.yaml`,
|
|
322
|
-
content: [
|
|
323
|
-
"$kind: collection",
|
|
324
|
-
`name: ${yamlQuote(`${projectName} WebAPI`)}`,
|
|
325
|
-
"schemaVersion: '3.0'",
|
|
326
|
-
"description: >-",
|
|
327
|
-
" Open this project root in Postman Local View (Files → Open folder).",
|
|
328
|
-
" Select the Local environment, then Authorization → Get New Access Token (PKCE).",
|
|
329
|
-
authBlock
|
|
330
|
-
].filter((l)=>l !== undefined).join("\n").replace(/\n+$/, "\n")
|
|
106
|
+
return applyPostmanAuthOverlay(base, projectName, auth, {
|
|
107
|
+
callbacks: POSTMAN_CALLBACKS,
|
|
108
|
+
scopes: POSTMAN_SCOPES,
|
|
109
|
+
description: COLLECTION_DESCRIPTION
|
|
331
110
|
});
|
|
332
|
-
files.push({
|
|
333
|
-
filePath: `${collectionDir}/Hello/.resources/definition.yaml`,
|
|
334
|
-
content: [
|
|
335
|
-
"$kind: folder",
|
|
336
|
-
"name: Hello",
|
|
337
|
-
"order: 1000",
|
|
338
|
-
""
|
|
339
|
-
].join("\n")
|
|
340
|
-
});
|
|
341
|
-
const requests = [
|
|
342
|
-
{
|
|
343
|
-
file: "List (anonymous).request.yaml",
|
|
344
|
-
yaml: [
|
|
345
|
-
"$kind: http-request",
|
|
346
|
-
"name: List (anonymous)",
|
|
347
|
-
"method: GET",
|
|
348
|
-
'url: "{{baseUrl}}/hello"',
|
|
349
|
-
"auth:",
|
|
350
|
-
" type: noauth",
|
|
351
|
-
"order: 1000",
|
|
352
|
-
""
|
|
353
|
-
].join("\n")
|
|
354
|
-
},
|
|
355
|
-
{
|
|
356
|
-
file: "Get by id.request.yaml",
|
|
357
|
-
yaml: [
|
|
358
|
-
"$kind: http-request",
|
|
359
|
-
"name: Get by id",
|
|
360
|
-
"method: GET",
|
|
361
|
-
'url: "{{baseUrl}}/hello/:id"',
|
|
362
|
-
"order: 2000",
|
|
363
|
-
""
|
|
364
|
-
].join("\n")
|
|
365
|
-
},
|
|
366
|
-
{
|
|
367
|
-
file: "Create.request.yaml",
|
|
368
|
-
yaml: [
|
|
369
|
-
"$kind: http-request",
|
|
370
|
-
"name: Create",
|
|
371
|
-
"method: POST",
|
|
372
|
-
'url: "{{baseUrl}}/hello"',
|
|
373
|
-
"headers:",
|
|
374
|
-
" Content-Type: application/json",
|
|
375
|
-
"body:",
|
|
376
|
-
" type: json",
|
|
377
|
-
" content: |-",
|
|
378
|
-
" {",
|
|
379
|
-
' "message": "hello"',
|
|
380
|
-
" }",
|
|
381
|
-
"order: 3000",
|
|
382
|
-
""
|
|
383
|
-
].join("\n")
|
|
384
|
-
},
|
|
385
|
-
{
|
|
386
|
-
file: "Update.request.yaml",
|
|
387
|
-
yaml: [
|
|
388
|
-
"$kind: http-request",
|
|
389
|
-
"name: Update",
|
|
390
|
-
"method: PUT",
|
|
391
|
-
'url: "{{baseUrl}}/hello/:id"',
|
|
392
|
-
"headers:",
|
|
393
|
-
" Content-Type: application/json",
|
|
394
|
-
"body:",
|
|
395
|
-
" type: json",
|
|
396
|
-
" content: |-",
|
|
397
|
-
" {",
|
|
398
|
-
' "message": "updated"',
|
|
399
|
-
" }",
|
|
400
|
-
"order: 4000",
|
|
401
|
-
""
|
|
402
|
-
].join("\n")
|
|
403
|
-
},
|
|
404
|
-
{
|
|
405
|
-
file: "Delete.request.yaml",
|
|
406
|
-
yaml: [
|
|
407
|
-
"$kind: http-request",
|
|
408
|
-
"name: Delete",
|
|
409
|
-
"method: DELETE",
|
|
410
|
-
'url: "{{baseUrl}}/hello/:id"',
|
|
411
|
-
"order: 5000",
|
|
412
|
-
""
|
|
413
|
-
].join("\n")
|
|
414
|
-
}
|
|
415
|
-
];
|
|
416
|
-
for (const r of requests){
|
|
417
|
-
files.push({
|
|
418
|
-
filePath: `${collectionDir}/Hello/${r.file}`,
|
|
419
|
-
content: r.yaml
|
|
420
|
-
});
|
|
421
|
-
}
|
|
422
|
-
return files;
|
|
423
111
|
}
|
|
424
112
|
/** Read a previously scaffolded auth0ClientId so re-scaffold never blanks it. */ function readExistingSpaClientId(targetDir, projectName) {
|
|
425
113
|
const envPath = join(targetDir, "postman/environments", `${projectName}-Local.environment.yaml`);
|
|
@@ -468,8 +156,15 @@ async function scaffold(workspace, options) {
|
|
|
468
156
|
} : undefined;
|
|
469
157
|
const projectName = workspace.name;
|
|
470
158
|
const envName = `${projectName} Local`;
|
|
471
|
-
const
|
|
472
|
-
const
|
|
159
|
+
const collection = await buildHybridPostmanCollection(projectName, auth0Env);
|
|
160
|
+
const localFiles = buildLocalViewFilesFromCollection(collection, projectName, auth0Env, {
|
|
161
|
+
callbacks: POSTMAN_CALLBACKS,
|
|
162
|
+
scopes: POSTMAN_SCOPES
|
|
163
|
+
});
|
|
164
|
+
const envYaml = buildEnvironmentYaml(envName, auth0Env, {
|
|
165
|
+
callbacks: POSTMAN_CALLBACKS,
|
|
166
|
+
scopes: POSTMAN_SCOPES
|
|
167
|
+
});
|
|
473
168
|
workspace.addFile({
|
|
474
169
|
files: ()=>[
|
|
475
170
|
{
|
|
@@ -479,6 +174,7 @@ async function scaffold(workspace, options) {
|
|
|
479
174
|
"# Postman fills workspace.id when you connect Local View.",
|
|
480
175
|
"#",
|
|
481
176
|
"# All resources under postman/ are registered automatically.",
|
|
177
|
+
"# Route requests are generated from OpenAPI; Auth0 overlay is hand-authored.",
|
|
482
178
|
""
|
|
483
179
|
].join("\n")
|
|
484
180
|
},
|
|
@@ -490,7 +186,6 @@ async function scaffold(workspace, options) {
|
|
|
490
186
|
]
|
|
491
187
|
});
|
|
492
188
|
if (options.postmanProvider === "api" && options.apiKey) {
|
|
493
|
-
const collection = buildCollectionJson(projectName, auth0Env);
|
|
494
189
|
const headers = {
|
|
495
190
|
"X-Api-Key": options.apiKey,
|
|
496
191
|
"Content-Type": "application/json"
|
|
@@ -552,6 +247,7 @@ export const PostmanFeature = {
|
|
|
552
247
|
getOptions,
|
|
553
248
|
scaffold
|
|
554
249
|
};
|
|
250
|
+
export { buildHelloOpenApiDocument } from "../postman/hello-openapi.js";
|
|
555
251
|
export { POSTMAN_CALLBACKS, POSTMAN_SCOPES };
|
|
556
252
|
|
|
557
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL3Bvc3RtYW4uZmVhdHVyZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHBpY2sgfSBmcm9tIFwiLi4vLi4vZG9tYWluL3Byb21wdC5qc1wiO1xuaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlU2NhZmZvbGQgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3Byb2plY3QubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgRmVhdHVyZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zY2FmZm9sZC5zZXJ2aWNlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEF1dGhDb25maWdNb2RlbCB9IGZyb20gXCIuLi9tb2RlbHMvYXV0aC1jb25maWcubW9kZWwuanNcIjtcbmltcG9ydCAqIGFzIGF1dGgwQ2xpIGZyb20gXCIuL2F1dGgwLWNsaS5qc1wiO1xuXG4vKiogUG9zdG1hbiBPQXV0aCBjYWxsYmFjayBVUkxzIChwb3B1cCArIFwiQXV0aG9yaXplIHVzaW5nIGJyb3dzZXJcIikuICovXG5jb25zdCBQT1NUTUFOX0NBTExCQUNLUyA9IFtcblx0XCJodHRwczovL29hdXRoLnBzdG1uLmlvL3YxL2NhbGxiYWNrXCIsXG5cdFwiaHR0cHM6Ly9vYXV0aC5wc3Rtbi5pby92MS9icm93c2VyLWNhbGxiYWNrXCIsXG5dIGFzIGNvbnN0O1xuXG4vKiogU2NvcGVzIHJlcXVlc3RlZCBmb3IgQXV0aDAgYWNjZXNzIHRva2VucyAoT0lEQyArIEhlbGxvIENBU0wgcGVybWlzc2lvbnMpLiAqL1xuY29uc3QgUE9TVE1BTl9TQ09QRVMgPSBbXG5cdFwib3BlbmlkXCIsXG5cdFwicHJvZmlsZVwiLFxuXHRcImVtYWlsXCIsXG5cdFwicmVhZDpIZWxsb1wiLFxuXHRcImNyZWF0ZTpIZWxsb1wiLFxuXHRcInVwZGF0ZTpIZWxsb1wiLFxuXHRcImRlbGV0ZTpIZWxsb1wiLFxuXS5qb2luKFwiIFwiKTtcblxuZXhwb3J0IHR5cGUgUG9zdG1hbk9wdGlvbnMgPSB7XG5cdHBvc3RtYW5Qcm92aWRlcj86IFwiYXBpXCIgfCBcImxvY2FsXCIgfCBcIm5vbmVcIjtcblx0YXBpS2V5Pzogc3RyaW5nO1xuXHR3b3Jrc3BhY2VJZD86IHN0cmluZztcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE9wdGlvbnMoXG5cdF93b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRjbGlPcHRpb25zOiBQYXJ0aWFsPFBvc3RtYW5PcHRpb25zPixcbik6IFByb21pc2U8UGFydGlhbDxQb3N0bWFuT3B0aW9ucz4+IHtcblx0aWYgKGNsaU9wdGlvbnMucG9zdG1hblByb3ZpZGVyICE9IG51bGwpIHJldHVybiB7fTtcblxuXHRjb25zdCBjaG9pY2VzID0gW1xuXHRcdHsgbGFiZWw6IFwibm9uZVwiIGFzIGNvbnN0LCBkZXNjcmlwdGlvbjogXCJza2lwXCIgfSxcblx0XHR7XG5cdFx0XHRsYWJlbDogXCJsb2NhbFwiIGFzIGNvbnN0LFxuXHRcdFx0ZGVzY3JpcHRpb246IFwiTG9jYWwgVmlldyAvIE5hdGl2ZSBHaXQgZmlsZXMgKG5vIEFQSSBrZXkpXCIsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogXCJhcGlcIiBhcyBjb25zdCxcblx0XHRcdGRlc2NyaXB0aW9uOiBcImFsc28gdXBsb2FkIHRvIFBvc3RtYW4uY29tIChuZWVkcyBBUEkga2V5KVwiLFxuXHRcdH0sXG5cdF07XG5cdGNvbnN0IHNlbGVjdGVkID0gYXdhaXQgcGljayhcblx0XHRcIlxcbiAgUG9zdG1hbjogXCIsXG5cdFx0Y2hvaWNlcyxcblx0XHQoYykgPT4gYCR7Yy5sYWJlbH0g4oCUICR7Yy5kZXNjcmlwdGlvbn1gLFxuXHQpO1xuXHRjb25zdCBwcm92aWRlciA9IHNlbGVjdGVkPy5sYWJlbCA/PyBcIm5vbmVcIjtcblxuXHRpZiAocHJvdmlkZXIgPT09IFwibm9uZVwiKSByZXR1cm4geyBwb3N0bWFuUHJvdmlkZXI6IFwibm9uZVwiIH07XG5cdGlmIChwcm92aWRlciA9PT0gXCJsb2NhbFwiKSByZXR1cm4geyBwb3N0bWFuUHJvdmlkZXI6IFwibG9jYWxcIiB9O1xuXG5cdGNvbnN0IGFwaUtleSA9XG5cdFx0cHJvY2Vzcy5lbnYuUE9TVE1BTl9BUElfS0VZID8/XG5cdFx0KGF3YWl0IGltcG9ydChcIi4uLy4uL2RvbWFpbi9wcm9tcHQuanNcIikudGhlbigobSkgPT5cblx0XHRcdG0uYXNrKFwiXFxuICBQb3N0bWFuIEFQSSBrZXkgKGFwcC5nZXRwb3N0bWFuLmNvbS9zZXR0aW5ncy9tZS9hcGkta2V5cyk6IFwiKSxcblx0XHQpKTtcblxuXHRjb25zdCBoZWFkZXJzID0geyBcIlgtQXBpLUtleVwiOiBhcGlLZXksIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH07XG5cdGNvbnN0IHdzUmVzID0gYXdhaXQgZmV0Y2goXCJodHRwczovL2FwaS5nZXRwb3N0bWFuLmNvbS93b3Jrc3BhY2VzXCIsIHsgaGVhZGVycyB9KTtcblxuXHRpZiAoIXdzUmVzLm9rKSB7XG5cdFx0Y29uc29sZS5lcnJvcihcIlxcbiAgUG9zdG1hbiBBUEkga2V5IGludmFsaWQg4oCUIGZhbGxpbmcgYmFjayB0byBsb2NhbCBmaWxlcy5cIik7XG5cdFx0cmV0dXJuIHsgcG9zdG1hblByb3ZpZGVyOiBcImxvY2FsXCIgfTtcblx0fVxuXG5cdGNvbnN0IHsgd29ya3NwYWNlcyB9ID0gKGF3YWl0IHdzUmVzLmpzb24oKSkgYXMge1xuXHRcdHdvcmtzcGFjZXM6IEFycmF5PHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmcgfT47XG5cdH07XG5cblx0dHlwZSBXc0Nob2ljZSA9IHsgbGFiZWw6IHN0cmluZzsgaWQ6IHN0cmluZyB8IG51bGwgfTtcblx0Y29uc3Qgd3NDaG9pY2VzOiBXc0Nob2ljZVtdID0gW1xuXHRcdHsgbGFiZWw6IFwiPG5ldyB3b3Jrc3BhY2U+XCIsIGlkOiBudWxsIH0sXG5cdFx0Li4ud29ya3NwYWNlcy5tYXAoKHcpID0+ICh7IGxhYmVsOiBgJHt3Lm5hbWV9ICgke3cudHlwZX0pYCwgaWQ6IHcuaWQgfSkpLFxuXHRdO1xuXG5cdGNvbnN0IHdzUGlja2VkID0gYXdhaXQgcGljayhcIlxcbiAgUG9zdG1hbiB3b3Jrc3BhY2U6IFwiLCB3c0Nob2ljZXMsIChjKSA9PiBjLmxhYmVsKTtcblxuXHRsZXQgd29ya3NwYWNlSWQ6IHN0cmluZztcblx0aWYgKCF3c1BpY2tlZCB8fCB3c1BpY2tlZC5pZCA9PT0gbnVsbCkge1xuXHRcdGNvbnN0IHsgYXNrIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi8uLi9kb21haW4vcHJvbXB0LmpzXCIpO1xuXHRcdGNvbnN0IHdzTmFtZSA9IGF3YWl0IGFzayhgICBXb3Jrc3BhY2UgbmFtZTogYCk7XG5cdFx0Y29uc3QgY3JlYXRlUmVzID0gYXdhaXQgZmV0Y2goXCJodHRwczovL2FwaS5nZXRwb3N0bWFuLmNvbS93b3Jrc3BhY2VzXCIsIHtcblx0XHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0XHRoZWFkZXJzLFxuXHRcdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoeyB3b3Jrc3BhY2U6IHsgbmFtZTogd3NOYW1lLCB0eXBlOiBcInBlcnNvbmFsXCIgfSB9KSxcblx0XHR9KTtcblx0XHRjb25zdCB7IHdvcmtzcGFjZTogd3MgfSA9IChhd2FpdCBjcmVhdGVSZXMuanNvbigpKSBhcyB7IHdvcmtzcGFjZTogeyBpZDogc3RyaW5nIH0gfTtcblx0XHR3b3Jrc3BhY2VJZCA9IHdzLmlkO1xuXHRcdGNvbnNvbGUubG9nKGAgIOKckyBXb3Jrc3BhY2UgY3JlYXRlZDogJHt3c05hbWV9YCk7XG5cdH0gZWxzZSB7XG5cdFx0d29ya3NwYWNlSWQgPSB3c1BpY2tlZC5pZDtcblx0fVxuXG5cdHJldHVybiB7IHBvc3RtYW5Qcm92aWRlcjogXCJhcGlcIiwgYXBpS2V5LCB3b3Jrc3BhY2VJZCB9O1xufVxuXG50eXBlIEF1dGgwRW52ID0ge1xuXHRhdXRoMERvbWFpbj86IHN0cmluZztcblx0YXV0aDBBdWRpZW5jZT86IHN0cmluZztcblx0YXV0aDBDbGllbnRJZD86IHN0cmluZztcbn07XG5cbi8qKiB2Mi4xIEpTT04g4oCUIHVzZWQgZm9yIFBvc3RtYW4uY29tIEFQSSB1cGxvYWQgb25seS4gKi9cbmZ1bmN0aW9uIGJ1aWxkQ29sbGVjdGlvbkpzb24ocHJvamVjdE5hbWU6IHN0cmluZywgYXV0aD86IEF1dGgwRW52KTogdW5rbm93biB7XG5cdGNvbnN0IGF1dGhPYmogPSBhdXRoPy5hdXRoMERvbWFpblxuXHRcdD8ge1xuXHRcdFx0XHR0eXBlOiBcIm9hdXRoMlwiLFxuXHRcdFx0XHRvYXV0aDI6IFtcblx0XHRcdFx0XHR7IGtleTogXCJncmFudF90eXBlXCIsIHZhbHVlOiBcImF1dGhvcml6YXRpb25fY29kZV93aXRoX3BrY2VcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGtleTogXCJhdXRoVXJsXCIsXG5cdFx0XHRcdFx0XHR2YWx1ZTogXCJodHRwczovL3t7YXV0aDBEb21haW59fS9hdXRob3JpemU/YXVkaWVuY2U9e3thdXRoMEF1ZGllbmNlfX1cIixcblx0XHRcdFx0XHRcdHR5cGU6IFwic3RyaW5nXCIsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRrZXk6IFwiYWNjZXNzVG9rZW5VcmxcIixcblx0XHRcdFx0XHRcdHZhbHVlOiBcImh0dHBzOi8ve3thdXRoMERvbWFpbn19L29hdXRoL3Rva2VuXCIsXG5cdFx0XHRcdFx0XHR0eXBlOiBcInN0cmluZ1wiLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0eyBrZXk6IFwiY2xpZW50SWRcIiwgdmFsdWU6IFwie3thdXRoMENsaWVudElkfX1cIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRcdHsga2V5OiBcInNjb3BlXCIsIHZhbHVlOiBQT1NUTUFOX1NDT1BFUywgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRcdHsga2V5OiBcInJlZGlyZWN0X3VyaVwiLCB2YWx1ZTogUE9TVE1BTl9DQUxMQkFDS1NbMF0sIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0XHR7IGtleTogXCJ1c2VCcm93c2VyXCIsIHZhbHVlOiBcInRydWVcIiwgdHlwZTogXCJib29sZWFuXCIgfSxcblx0XHRcdFx0XHR7IGtleTogXCJhZGRUb2tlblRvXCIsIHZhbHVlOiBcImhlYWRlclwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG5cdFx0XHRcdFx0eyBrZXk6IFwiY2hhbGxlbmdlQWxnb3JpdGhtXCIsIHZhbHVlOiBcIlMyNTZcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRcdHsga2V5OiBcImNsaWVudF9hdXRoZW50aWNhdGlvblwiLCB2YWx1ZTogXCJib2R5XCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0XHR7IGtleTogXCJjbGllbnRTZWNyZXRcIiwgdmFsdWU6IFwiXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0XHR7IGtleTogXCJ0b2tlbk5hbWVcIiwgdmFsdWU6IGAke3Byb2plY3ROYW1lfSBBY2Nlc3MgVG9rZW5gLCB0eXBlOiBcInN0cmluZ1wiIH0sXG5cdFx0XHRcdF0sXG5cdFx0XHR9XG5cdFx0OiB1bmRlZmluZWQ7XG5cblx0Y29uc3QgaGVsbG9VcmwgPSAocGF0aDogc3RyaW5nLCByYXc6IHN0cmluZykgPT4gKHtcblx0XHRyYXc6IGB7e2Jhc2VVcmx9fSR7cmF3fWAsXG5cdFx0aG9zdDogW1wie3tiYXNlVXJsfX1cIl0sXG5cdFx0cGF0aDogcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pLFxuXHR9KTtcblxuXHRyZXR1cm4ge1xuXHRcdGluZm86IHtcblx0XHRcdF9wb3N0bWFuX2lkOiByYW5kb21VVUlEKCksXG5cdFx0XHRuYW1lOiBgJHtwcm9qZWN0TmFtZX0gV2ViQVBJYCxcblx0XHRcdHNjaGVtYTogXCJodHRwczovL3NjaGVtYS5nZXRwb3N0bWFuLmNvbS9qc29uL2NvbGxlY3Rpb24vdjIuMS4wL2NvbGxlY3Rpb24uanNvblwiLFxuXHRcdFx0ZGVzY3JpcHRpb246XG5cdFx0XHRcdFwiT3BlbiB0aGUgcHJvamVjdCByb290IGluIFBvc3RtYW4gTG9jYWwgVmlldyAobm90IHRoZSBwb3N0bWFuLyBmb2xkZXIpLiBcIiArXG5cdFx0XHRcdFwiU2VsZWN0IHRoZSBMb2NhbCBlbnZpcm9ubWVudCwgdGhlbiBBdXRob3JpemF0aW9uIOKGkiBHZXQgTmV3IEFjY2VzcyBUb2tlbiAoUEtDRSkuXCIsXG5cdFx0fSxcblx0XHQuLi4oYXV0aE9iaiA/IHsgYXV0aDogYXV0aE9iaiB9IDoge30pLFxuXHRcdGl0ZW06IFtcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJIZWxsb1wiLFxuXHRcdFx0XHRpdGVtOiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogXCJMaXN0IChhbm9ueW1vdXMpXCIsXG5cdFx0XHRcdFx0XHRyZXF1ZXN0OiB7XG5cdFx0XHRcdFx0XHRcdGF1dGg6IHsgdHlwZTogXCJub2F1dGhcIiB9LFxuXHRcdFx0XHRcdFx0XHRtZXRob2Q6IFwiR0VUXCIsXG5cdFx0XHRcdFx0XHRcdHVybDogaGVsbG9VcmwoXCJoZWxsb1wiLCBcIi9oZWxsb1wiKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIkdldCBieSBpZFwiLFxuXHRcdFx0XHRcdFx0cmVxdWVzdDoge1xuXHRcdFx0XHRcdFx0XHRtZXRob2Q6IFwiR0VUXCIsXG5cdFx0XHRcdFx0XHRcdHVybDogaGVsbG9VcmwoXCJoZWxsby86aWRcIiwgXCIvaGVsbG8vOmlkXCIpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwiQ3JlYXRlXCIsXG5cdFx0XHRcdFx0XHRyZXF1ZXN0OiB7XG5cdFx0XHRcdFx0XHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0XHRcdFx0XHRcdGhlYWRlcjogW3sga2V5OiBcIkNvbnRlbnQtVHlwZVwiLCB2YWx1ZTogXCJhcHBsaWNhdGlvbi9qc29uXCIgfV0sXG5cdFx0XHRcdFx0XHRcdGJvZHk6IHtcblx0XHRcdFx0XHRcdFx0XHRtb2RlOiBcInJhd1wiLFxuXHRcdFx0XHRcdFx0XHRcdHJhdzogJ3tcXG4gIFwibWVzc2FnZVwiOiBcImhlbGxvXCJcXG59XFxuJyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0dXJsOiBoZWxsb1VybChcImhlbGxvXCIsIFwiL2hlbGxvXCIpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwiVXBkYXRlXCIsXG5cdFx0XHRcdFx0XHRyZXF1ZXN0OiB7XG5cdFx0XHRcdFx0XHRcdG1ldGhvZDogXCJQVVRcIixcblx0XHRcdFx0XHRcdFx0aGVhZGVyOiBbeyBrZXk6IFwiQ29udGVudC1UeXBlXCIsIHZhbHVlOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9XSxcblx0XHRcdFx0XHRcdFx0Ym9keToge1xuXHRcdFx0XHRcdFx0XHRcdG1vZGU6IFwicmF3XCIsXG5cdFx0XHRcdFx0XHRcdFx0cmF3OiAne1xcbiAgXCJtZXNzYWdlXCI6IFwidXBkYXRlZFwiXFxufVxcbicsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHVybDogaGVsbG9VcmwoXCJoZWxsby86aWRcIiwgXCIvaGVsbG8vOmlkXCIpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwiRGVsZXRlXCIsXG5cdFx0XHRcdFx0XHRyZXF1ZXN0OiB7XG5cdFx0XHRcdFx0XHRcdG1ldGhvZDogXCJERUxFVEVcIixcblx0XHRcdFx0XHRcdFx0dXJsOiBoZWxsb1VybChcImhlbGxvLzppZFwiLCBcIi9oZWxsby86aWRcIiksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdF0sXG5cdFx0XHR9LFxuXHRcdF0sXG5cdH07XG59XG5cbmZ1bmN0aW9uIHlhbWxRdW90ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcblx0aWYgKC9bOiN7fVtcXF0sJio/fDw+PSElQGBdLy50ZXN0KHZhbHVlKSB8fCB2YWx1ZS5pbmNsdWRlcyhcIlxcblwiKSB8fCB2YWx1ZSA9PT0gXCJcIikge1xuXHRcdHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG5cdH1cblx0cmV0dXJuIHZhbHVlO1xufVxuXG4vKiogTG9jYWwgVmlldyAvIE5hdGl2ZSBHaXQgZW52aXJvbm1lbnQgKFlBTUwpLiAqL1xuZnVuY3Rpb24gYnVpbGRFbnZpcm9ubWVudFlhbWwobmFtZTogc3RyaW5nLCBhdXRoPzogQXV0aDBFbnYpOiBzdHJpbmcge1xuXHRjb25zdCB2YWx1ZXM6IEFycmF5PHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4gPSBbXG5cdFx0eyBrZXk6IFwiYmFzZVVybFwiLCB2YWx1ZTogXCJodHRwOi8vbG9jYWxob3N0OjMwMDBcIiB9LFxuXHRdO1xuXHRpZiAoYXV0aD8uYXV0aDBEb21haW4pIHtcblx0XHR2YWx1ZXMucHVzaChcblx0XHRcdHsga2V5OiBcImF1dGgwRG9tYWluXCIsIHZhbHVlOiBhdXRoLmF1dGgwRG9tYWluIH0sXG5cdFx0XHR7IGtleTogXCJhdXRoMEF1ZGllbmNlXCIsIHZhbHVlOiBhdXRoLmF1dGgwQXVkaWVuY2UgPz8gXCJcIiB9LFxuXHRcdFx0eyBrZXk6IFwiYXV0aDBDbGllbnRJZFwiLCB2YWx1ZTogYXV0aC5hdXRoMENsaWVudElkID8/IFwiXCIgfSxcblx0XHRcdHtcblx0XHRcdFx0a2V5OiBcImF1dGhVcmxcIixcblx0XHRcdFx0dmFsdWU6IGBodHRwczovLyR7YXV0aC5hdXRoMERvbWFpbn0vYXV0aG9yaXplP2F1ZGllbmNlPSR7YXV0aC5hdXRoMEF1ZGllbmNlID8/IFwiXCJ9YCxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGtleTogXCJhY2Nlc3NUb2tlblVybFwiLFxuXHRcdFx0XHR2YWx1ZTogYGh0dHBzOi8vJHthdXRoLmF1dGgwRG9tYWlufS9vYXV0aC90b2tlbmAsXG5cdFx0XHR9LFxuXHRcdFx0eyBrZXk6IFwiY2FsbGJhY2tVcmxcIiwgdmFsdWU6IFBPU1RNQU5fQ0FMTEJBQ0tTWzBdIH0sXG5cdFx0XHR7IGtleTogXCJzY29wZVwiLCB2YWx1ZTogUE9TVE1BTl9TQ09QRVMgfSxcblx0XHQpO1xuXHR9XG5cblx0Y29uc3QgbGluZXMgPSBbYG5hbWU6ICR7eWFtbFF1b3RlKG5hbWUpfWAsIFwidmFsdWVzOlwiXTtcblx0Zm9yIChjb25zdCB2IG9mIHZhbHVlcykge1xuXHRcdGxpbmVzLnB1c2goYCAgLSBrZXk6ICR7di5rZXl9YCk7XG5cdFx0bGluZXMucHVzaChgICAgIHZhbHVlOiAke3lhbWxRdW90ZSh2LnZhbHVlKX1gKTtcblx0XHRsaW5lcy5wdXNoKFwiICAgIGVuYWJsZWQ6IHRydWVcIik7XG5cdH1cblx0cmV0dXJuIGAke2xpbmVzLmpvaW4oXCJcXG5cIil9XFxuYDtcbn1cblxuLyoqIExvY2FsIFZpZXcgLyBOYXRpdmUgR2l0IGNvbGxlY3Rpb24gKHYzIG11bHRpLWZpbGUgWUFNTCkuICovXG5mdW5jdGlvbiBidWlsZExvY2FsVmlld0ZpbGVzKFxuXHRwcm9qZWN0TmFtZTogc3RyaW5nLFxuXHRhdXRoPzogQXV0aDBFbnYsXG4pOiBBcnJheTx7IGZpbGVQYXRoOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB9PiB7XG5cdGNvbnN0IGNvbGxlY3Rpb25EaXIgPSBgcG9zdG1hbi9jb2xsZWN0aW9ucy8ke3Byb2plY3ROYW1lfSBXZWJBUElgO1xuXHRjb25zdCBmaWxlczogQXJyYXk8eyBmaWxlUGF0aDogc3RyaW5nOyBjb250ZW50OiBzdHJpbmcgfT4gPSBbXTtcblxuXHQvLyBQb3N0bWFuIExvY2FsIFZpZXcgc3RvcmVzIE9BdXRoIHVuZGVyIGF1dGhbXS5jcmVkZW50aWFscyAobm90IHRoZSB2Mi4xIG9hdXRoMiBhcnJheSkuXG5cdC8vIFVzZSBjb25jcmV0ZSBodHRwcyBVUkxzIOKAlCBlbXB0eSBBdXRoIFVSTCB5aWVsZHMgXCJJbnZhbGlkIHByb3RvY29sIGZvciBhdXRoIFVSTFwiLlxuXHRjb25zdCBhdXRoQmxvY2sgPSBhdXRoPy5hdXRoMERvbWFpblxuXHRcdD8gW1xuXHRcdFx0XHRcImF1dGg6XCIsXG5cdFx0XHRcdGAgIC0gaWQ6ICR7cmFuZG9tVVVJRCgpfWAsXG5cdFx0XHRcdFwiICAgIHR5cGU6IG9hdXRoMlwiLFxuXHRcdFx0XHRcIiAgICBuYW1lOiBPQXV0aCAyLjBcIixcblx0XHRcdFx0XCIgICAgY3JlZGVudGlhbHM6XCIsXG5cdFx0XHRcdFwiICAgICAgYWRkVG9rZW5UbzogaGVhZGVyXCIsXG5cdFx0XHRcdFwiICAgICAgZ3JhbnRfdHlwZTogYXV0aG9yaXphdGlvbl9jb2RlX3dpdGhfcGtjZVwiLFxuXHRcdFx0XHRgICAgICAgYXV0aFVybDogaHR0cHM6Ly8ke2F1dGguYXV0aDBEb21haW59L2F1dGhvcml6ZT9hdWRpZW5jZT0ke2F1dGguYXV0aDBBdWRpZW5jZSA/PyBcIlwifWAsXG5cdFx0XHRcdGAgICAgICBhY2Nlc3NUb2tlblVybDogaHR0cHM6Ly8ke2F1dGguYXV0aDBEb21haW59L29hdXRoL3Rva2VuYCxcblx0XHRcdFx0YCAgICAgIGNsaWVudElkOiAke3lhbWxRdW90ZShhdXRoLmF1dGgwQ2xpZW50SWQgPz8gXCJcIil9YCxcblx0XHRcdFx0YCAgICAgIHNjb3BlOiAke3lhbWxRdW90ZShQT1NUTUFOX1NDT1BFUyl9YCxcblx0XHRcdFx0YCAgICAgIHJlZGlyZWN0X3VyaTogJHtQT1NUTUFOX0NBTExCQUNLU1swXX1gLFxuXHRcdFx0XHRcIiAgICAgIHVzZUJyb3dzZXI6IHRydWVcIixcblx0XHRcdFx0XCIgICAgICBjaGFsbGVuZ2VBbGdvcml0aG06IFMyNTZcIixcblx0XHRcdFx0Ly8gU1BBIHB1YmxpYyBjbGllbnQ6IEF1dGgwIHRva2VuIGVuZHBvaW50IHJlamVjdHMgQmFzaWMgYXV0aCAoZmVhY2Z0IFVuYXV0aG9yaXplZCkuXG5cdFx0XHRcdFwiICAgICAgY2xpZW50X2F1dGhlbnRpY2F0aW9uOiBib2R5XCIsXG5cdFx0XHRcdCcgICAgICBjbGllbnRTZWNyZXQ6IFwiXCInLFxuXHRcdFx0XHRgICAgICAgdG9rZW5OYW1lOiAke3lhbWxRdW90ZShgJHtwcm9qZWN0TmFtZX0gQWNjZXNzIFRva2VuYCl9YCxcblx0XHRcdFx0XCJcIixcblx0XHRcdF0uam9pbihcIlxcblwiKVxuXHRcdDogXCJcIjtcblxuXHRmaWxlcy5wdXNoKHtcblx0XHRmaWxlUGF0aDogYCR7Y29sbGVjdGlvbkRpcn0vLnJlc291cmNlcy9kZWZpbml0aW9uLnlhbWxgLFxuXHRcdGNvbnRlbnQ6IFtcblx0XHRcdFwiJGtpbmQ6IGNvbGxlY3Rpb25cIixcblx0XHRcdGBuYW1lOiAke3lhbWxRdW90ZShgJHtwcm9qZWN0TmFtZX0gV2ViQVBJYCl9YCxcblx0XHRcdFwic2NoZW1hVmVyc2lvbjogJzMuMCdcIixcblx0XHRcdFwiZGVzY3JpcHRpb246ID4tXCIsXG5cdFx0XHRcIiAgT3BlbiB0aGlzIHByb2plY3Qgcm9vdCBpbiBQb3N0bWFuIExvY2FsIFZpZXcgKEZpbGVzIOKGkiBPcGVuIGZvbGRlcikuXCIsXG5cdFx0XHRcIiAgU2VsZWN0IHRoZSBMb2NhbCBlbnZpcm9ubWVudCwgdGhlbiBBdXRob3JpemF0aW9uIOKGkiBHZXQgTmV3IEFjY2VzcyBUb2tlbiAoUEtDRSkuXCIsXG5cdFx0XHRhdXRoQmxvY2ssXG5cdFx0XVxuXHRcdFx0LmZpbHRlcigobCkgPT4gbCAhPT0gdW5kZWZpbmVkKVxuXHRcdFx0LmpvaW4oXCJcXG5cIilcblx0XHRcdC5yZXBsYWNlKC9cXG4rJC8sIFwiXFxuXCIpLFxuXHR9KTtcblxuXHRmaWxlcy5wdXNoKHtcblx0XHRmaWxlUGF0aDogYCR7Y29sbGVjdGlvbkRpcn0vSGVsbG8vLnJlc291cmNlcy9kZWZpbml0aW9uLnlhbWxgLFxuXHRcdGNvbnRlbnQ6IFtcIiRraW5kOiBmb2xkZXJcIiwgXCJuYW1lOiBIZWxsb1wiLCBcIm9yZGVyOiAxMDAwXCIsIFwiXCJdLmpvaW4oXCJcXG5cIiksXG5cdH0pO1xuXG5cdGNvbnN0IHJlcXVlc3RzOiBBcnJheTx7XG5cdFx0ZmlsZTogc3RyaW5nO1xuXHRcdHlhbWw6IHN0cmluZztcblx0fT4gPSBbXG5cdFx0e1xuXHRcdFx0ZmlsZTogXCJMaXN0IChhbm9ueW1vdXMpLnJlcXVlc3QueWFtbFwiLFxuXHRcdFx0eWFtbDogW1xuXHRcdFx0XHRcIiRraW5kOiBodHRwLXJlcXVlc3RcIixcblx0XHRcdFx0XCJuYW1lOiBMaXN0IChhbm9ueW1vdXMpXCIsXG5cdFx0XHRcdFwibWV0aG9kOiBHRVRcIixcblx0XHRcdFx0J3VybDogXCJ7e2Jhc2VVcmx9fS9oZWxsb1wiJyxcblx0XHRcdFx0XCJhdXRoOlwiLFxuXHRcdFx0XHRcIiAgdHlwZTogbm9hdXRoXCIsXG5cdFx0XHRcdFwib3JkZXI6IDEwMDBcIixcblx0XHRcdFx0XCJcIixcblx0XHRcdF0uam9pbihcIlxcblwiKSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGZpbGU6IFwiR2V0IGJ5IGlkLnJlcXVlc3QueWFtbFwiLFxuXHRcdFx0eWFtbDogW1xuXHRcdFx0XHRcIiRraW5kOiBodHRwLXJlcXVlc3RcIixcblx0XHRcdFx0XCJuYW1lOiBHZXQgYnkgaWRcIixcblx0XHRcdFx0XCJtZXRob2Q6IEdFVFwiLFxuXHRcdFx0XHQndXJsOiBcInt7YmFzZVVybH19L2hlbGxvLzppZFwiJyxcblx0XHRcdFx0XCJvcmRlcjogMjAwMFwiLFxuXHRcdFx0XHRcIlwiLFxuXHRcdFx0XS5qb2luKFwiXFxuXCIpLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0ZmlsZTogXCJDcmVhdGUucmVxdWVzdC55YW1sXCIsXG5cdFx0XHR5YW1sOiBbXG5cdFx0XHRcdFwiJGtpbmQ6IGh0dHAtcmVxdWVzdFwiLFxuXHRcdFx0XHRcIm5hbWU6IENyZWF0ZVwiLFxuXHRcdFx0XHRcIm1ldGhvZDogUE9TVFwiLFxuXHRcdFx0XHQndXJsOiBcInt7YmFzZVVybH19L2hlbGxvXCInLFxuXHRcdFx0XHRcImhlYWRlcnM6XCIsXG5cdFx0XHRcdFwiICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cIixcblx0XHRcdFx0XCJib2R5OlwiLFxuXHRcdFx0XHRcIiAgdHlwZToganNvblwiLFxuXHRcdFx0XHRcIiAgY29udGVudDogfC1cIixcblx0XHRcdFx0XCIgICAge1wiLFxuXHRcdFx0XHQnICAgICAgXCJtZXNzYWdlXCI6IFwiaGVsbG9cIicsXG5cdFx0XHRcdFwiICAgIH1cIixcblx0XHRcdFx0XCJvcmRlcjogMzAwMFwiLFxuXHRcdFx0XHRcIlwiLFxuXHRcdFx0XS5qb2luKFwiXFxuXCIpLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0ZmlsZTogXCJVcGRhdGUucmVxdWVzdC55YW1sXCIsXG5cdFx0XHR5YW1sOiBbXG5cdFx0XHRcdFwiJGtpbmQ6IGh0dHAtcmVxdWVzdFwiLFxuXHRcdFx0XHRcIm5hbWU6IFVwZGF0ZVwiLFxuXHRcdFx0XHRcIm1ldGhvZDogUFVUXCIsXG5cdFx0XHRcdCd1cmw6IFwie3tiYXNlVXJsfX0vaGVsbG8vOmlkXCInLFxuXHRcdFx0XHRcImhlYWRlcnM6XCIsXG5cdFx0XHRcdFwiICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cIixcblx0XHRcdFx0XCJib2R5OlwiLFxuXHRcdFx0XHRcIiAgdHlwZToganNvblwiLFxuXHRcdFx0XHRcIiAgY29udGVudDogfC1cIixcblx0XHRcdFx0XCIgICAge1wiLFxuXHRcdFx0XHQnICAgICAgXCJtZXNzYWdlXCI6IFwidXBkYXRlZFwiJyxcblx0XHRcdFx0XCIgICAgfVwiLFxuXHRcdFx0XHRcIm9yZGVyOiA0MDAwXCIsXG5cdFx0XHRcdFwiXCIsXG5cdFx0XHRdLmpvaW4oXCJcXG5cIiksXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRmaWxlOiBcIkRlbGV0ZS5yZXF1ZXN0LnlhbWxcIixcblx0XHRcdHlhbWw6IFtcblx0XHRcdFx0XCIka2luZDogaHR0cC1yZXF1ZXN0XCIsXG5cdFx0XHRcdFwibmFtZTogRGVsZXRlXCIsXG5cdFx0XHRcdFwibWV0aG9kOiBERUxFVEVcIixcblx0XHRcdFx0J3VybDogXCJ7e2Jhc2VVcmx9fS9oZWxsby86aWRcIicsXG5cdFx0XHRcdFwib3JkZXI6IDUwMDBcIixcblx0XHRcdFx0XCJcIixcblx0XHRcdF0uam9pbihcIlxcblwiKSxcblx0XHR9LFxuXHRdO1xuXG5cdGZvciAoY29uc3QgciBvZiByZXF1ZXN0cykge1xuXHRcdGZpbGVzLnB1c2goe1xuXHRcdFx0ZmlsZVBhdGg6IGAke2NvbGxlY3Rpb25EaXJ9L0hlbGxvLyR7ci5maWxlfWAsXG5cdFx0XHRjb250ZW50OiByLnlhbWwsXG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gZmlsZXM7XG59XG5cbi8qKiBSZWFkIGEgcHJldmlvdXNseSBzY2FmZm9sZGVkIGF1dGgwQ2xpZW50SWQgc28gcmUtc2NhZmZvbGQgbmV2ZXIgYmxhbmtzIGl0LiAqL1xuZnVuY3Rpb24gcmVhZEV4aXN0aW5nU3BhQ2xpZW50SWQodGFyZ2V0RGlyOiBzdHJpbmcsIHByb2plY3ROYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCBlbnZQYXRoID0gam9pbihcblx0XHR0YXJnZXREaXIsXG5cdFx0XCJwb3N0bWFuL2Vudmlyb25tZW50c1wiLFxuXHRcdGAke3Byb2plY3ROYW1lfS1Mb2NhbC5lbnZpcm9ubWVudC55YW1sYCxcblx0KTtcblx0aWYgKCFleGlzdHNTeW5jKGVudlBhdGgpKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRjb25zdCB0ZXh0ID0gcmVhZEZpbGVTeW5jKGVudlBhdGgsIFwidXRmOFwiKTtcblx0Y29uc3QgbWF0Y2ggPSB0ZXh0Lm1hdGNoKC9rZXk6XFxzKmF1dGgwQ2xpZW50SWRcXHMqXFxuXFxzKnZhbHVlOlxccypbXCInXT8oW15cIidcXG5dKykvKTtcblx0Y29uc3QgdmFsdWUgPSBtYXRjaD8uWzFdPy50cmltKCk7XG5cdHJldHVybiB2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPiAwID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgUG9zdG1hbiBTUEEgY2xpZW50IGlkLiBOZXZlciByZXR1cm5zIGVtcHR5IOKAlCBwcmVzZXJ2ZXMgYW4gZXhpc3RpbmdcbiAqIGVudiB2YWx1ZSBvbiBBdXRoMCBmYWlsdXJlLCBvdGhlcndpc2UgdGhyb3dzIHNvIHdlIGRvIG5vdCB3cml0ZSBhIGJsYW5rIGVudi5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVNwYUNsaWVudElkKHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQpOiBzdHJpbmcge1xuXHRjb25zdCBhcHBOYW1lID0gYCR7d29ya3NwYWNlLm5hbWV9IFBvc3RtYW5gO1xuXHR0cnkge1xuXHRcdGNvbnN0IGFwcCA9IGF1dGgwQ2xpLmVuc3VyZVNwYUFwcChhcHBOYW1lLCBbLi4uUE9TVE1BTl9DQUxMQkFDS1NdKTtcblx0XHRjb25zb2xlLmxvZyhcblx0XHRcdGFwcC5yZXVzZWRcblx0XHRcdFx0PyBgICDinJMgUmV1c2luZyBBdXRoMCBTUEEgYXBwIGZvciBQb3N0bWFuIFBLQ0UgKCR7YXBwLmNsaWVudF9pZH0pYFxuXHRcdFx0XHQ6IGAgIOKckyBBdXRoMCBTUEEgYXBwIGNyZWF0ZWQgZm9yIFBvc3RtYW4gUEtDRSAoJHthcHAuY2xpZW50X2lkfSlgLFxuXHRcdCk7XG5cdFx0dHJ5IHtcblx0XHRcdGF1dGgwQ2xpLmVuYWJsZUNvbm5lY3Rpb25Gb3JDbGllbnQoYXV0aDBDbGkuREJfQ09OTkVDVElPTl9OQU1FLCBhcHAuY2xpZW50X2lkKTtcblx0XHRcdGNvbnNvbGUubG9nKGAgIOKckyBFbmFibGVkICR7YXV0aDBDbGkuREJfQ09OTkVDVElPTl9OQU1FfSBvbiBQb3N0bWFuIFNQQWApO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcblx0XHRcdFx0YCAg4pyXIEZhaWxlZCB0byBlbmFibGUgREIgY29ubmVjdGlvbiBvbiBTUEE6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycn1gLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIGFwcC5jbGllbnRfaWQ7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGNvbnN0IGV4aXN0aW5nID0gcmVhZEV4aXN0aW5nU3BhQ2xpZW50SWQod29ya3NwYWNlLnRhcmdldERpciwgd29ya3NwYWNlLm5hbWUpO1xuXHRcdGlmIChleGlzdGluZykge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcblx0XHRcdFx0YCAg4pyXIEZhaWxlZCB0byBlbnN1cmUgQXV0aDAgU1BBIGFwcCAoJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogZXJyfSlgLFxuXHRcdFx0KTtcblx0XHRcdGNvbnNvbGUubG9nKGAgIOKckyBLZWVwaW5nIGV4aXN0aW5nIGF1dGgwQ2xpZW50SWQgZnJvbSBQb3N0bWFuIGVudmlyb25tZW50ICgke2V4aXN0aW5nfSlgKTtcblx0XHRcdHJldHVybiBleGlzdGluZztcblx0XHR9XG5cdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0YEZhaWxlZCB0byBlbnN1cmUgQXV0aDAgU1BBIGFwcCBmb3IgUG9zdG1hbiDigJQgYXV0aDBDbGllbnRJZCB3b3VsZCBiZSBlbXB0eTogJHtcblx0XHRcdFx0ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVyclxuXHRcdFx0fWAsXG5cdFx0KTtcblx0fVxufVxuXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZCh3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLCBvcHRpb25zOiBQb3N0bWFuT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuXHRpZiAob3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgPT09IFwibm9uZVwiIHx8IG9wdGlvbnMucG9zdG1hblByb3ZpZGVyID09IG51bGwpIHJldHVybjtcblxuXHRjb25zdCBhdXRoQ29uZmlnTW9kZWwgPSB3b3Jrc3BhY2UuZ2V0TW9kZWw8QXV0aENvbmZpZ01vZGVsPihXRUxMX0tOT1dOX0ZJTEVTLkFVVEhfQ09ORklHKTtcblx0Y29uc3QgYXV0aENmZyA9IGF1dGhDb25maWdNb2RlbD8uY29uZmlnO1xuXG5cdGNvbnN0IHNwYUNsaWVudElkID0gYXV0aENmZz8uaXNzdWVyQmFzZVVybCA/IHJlc29sdmVTcGFDbGllbnRJZCh3b3Jrc3BhY2UpIDogdW5kZWZpbmVkO1xuXG5cdGNvbnN0IGF1dGgwRW52OiBBdXRoMEVudiB8IHVuZGVmaW5lZCA9IGF1dGhDZmc/Lmlzc3VlckJhc2VVcmxcblx0XHQ/IHtcblx0XHRcdFx0YXV0aDBEb21haW46IGF1dGhDZmcuaXNzdWVyQmFzZVVybC5yZXBsYWNlKC9eaHR0cHM/OlxcL1xcLy8sIFwiXCIpLFxuXHRcdFx0XHRhdXRoMEF1ZGllbmNlOiBhdXRoQ2ZnLmF1ZGllbmNlLFxuXHRcdFx0XHRhdXRoMENsaWVudElkOiBzcGFDbGllbnRJZCxcblx0XHRcdH1cblx0XHQ6IHVuZGVmaW5lZDtcblxuXHRjb25zdCBwcm9qZWN0TmFtZSA9IHdvcmtzcGFjZS5uYW1lO1xuXHRjb25zdCBlbnZOYW1lID0gYCR7cHJvamVjdE5hbWV9IExvY2FsYDtcblx0Y29uc3QgbG9jYWxGaWxlcyA9IGJ1aWxkTG9jYWxWaWV3RmlsZXMocHJvamVjdE5hbWUsIGF1dGgwRW52KTtcblx0Y29uc3QgZW52WWFtbCA9IGJ1aWxkRW52aXJvbm1lbnRZYW1sKGVudk5hbWUsIGF1dGgwRW52KTtcblxuXHR3b3Jrc3BhY2UuYWRkRmlsZSh7XG5cdFx0ZmlsZXM6ICgpID0+IFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiLnBvc3RtYW4vcmVzb3VyY2VzLnlhbWxcIixcblx0XHRcdFx0Y29udGVudDogW1xuXHRcdFx0XHRcdFwiIyBPcGVuIHRoaXMgcHJvamVjdCByb290IGluIFBvc3RtYW4gKEZpbGVzIOKGkiBPcGVuIGZvbGRlciksIG5vdCB0aGUgcG9zdG1hbi8gc3ViZm9sZGVyLlwiLFxuXHRcdFx0XHRcdFwiIyBQb3N0bWFuIGZpbGxzIHdvcmtzcGFjZS5pZCB3aGVuIHlvdSBjb25uZWN0IExvY2FsIFZpZXcuXCIsXG5cdFx0XHRcdFx0XCIjXCIsXG5cdFx0XHRcdFx0XCIjIEFsbCByZXNvdXJjZXMgdW5kZXIgcG9zdG1hbi8gYXJlIHJlZ2lzdGVyZWQgYXV0b21hdGljYWxseS5cIixcblx0XHRcdFx0XHRcIlwiLFxuXHRcdFx0XHRdLmpvaW4oXCJcXG5cIiksXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogYHBvc3RtYW4vZW52aXJvbm1lbnRzLyR7cHJvamVjdE5hbWV9LUxvY2FsLmVudmlyb25tZW50LnlhbWxgLFxuXHRcdFx0XHRjb250ZW50OiBlbnZZYW1sLFxuXHRcdFx0fSxcblx0XHRcdC4uLmxvY2FsRmlsZXMsXG5cdFx0XSxcblx0fSk7XG5cblx0aWYgKG9wdGlvbnMucG9zdG1hblByb3ZpZGVyID09PSBcImFwaVwiICYmIG9wdGlvbnMuYXBpS2V5KSB7XG5cdFx0Y29uc3QgY29sbGVjdGlvbiA9IGJ1aWxkQ29sbGVjdGlvbkpzb24ocHJvamVjdE5hbWUsIGF1dGgwRW52KTtcblx0XHRjb25zdCBoZWFkZXJzID0geyBcIlgtQXBpLUtleVwiOiBvcHRpb25zLmFwaUtleSwgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfTtcblxuXHRcdGNvbnN0IGNvbFJlcyA9IGF3YWl0IGZldGNoKFxuXHRcdFx0YGh0dHBzOi8vYXBpLmdldHBvc3RtYW4uY29tL2NvbGxlY3Rpb25zP3dvcmtzcGFjZT0ke29wdGlvbnMud29ya3NwYWNlSWR9YCxcblx0XHRcdHtcblx0XHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdFx0aGVhZGVycyxcblx0XHRcdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoeyBjb2xsZWN0aW9uIH0pLFxuXHRcdFx0fSxcblx0XHQpO1xuXHRcdGlmIChjb2xSZXMub2spIHtcblx0XHRcdGNvbnNvbGUubG9nKFwiICDinJMgUG9zdG1hbiBjb2xsZWN0aW9uIHVwbG9hZGVkXCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiICDinJcgRmFpbGVkIHRvIHVwbG9hZCBQb3N0bWFuIGNvbGxlY3Rpb25cIik7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZW52VmFsdWVzID0gW1xuXHRcdFx0eyBrZXk6IFwiYmFzZVVybFwiLCB2YWx1ZTogXCJodHRwOi8vbG9jYWxob3N0OjMwMDBcIiwgZW5hYmxlZDogdHJ1ZSB9LFxuXHRcdFx0Li4uKGF1dGgwRW52Py5hdXRoMERvbWFpblxuXHRcdFx0XHQ/IFtcblx0XHRcdFx0XHRcdHsga2V5OiBcImF1dGgwRG9tYWluXCIsIHZhbHVlOiBhdXRoMEVudi5hdXRoMERvbWFpbiwgZW5hYmxlZDogdHJ1ZSB9LFxuXHRcdFx0XHRcdFx0eyBrZXk6IFwiYXV0aDBBdWRpZW5jZVwiLCB2YWx1ZTogYXV0aDBFbnYuYXV0aDBBdWRpZW5jZSA/PyBcIlwiLCBlbmFibGVkOiB0cnVlIH0sXG5cdFx0XHRcdFx0XHR7IGtleTogXCJhdXRoMENsaWVudElkXCIsIHZhbHVlOiBhdXRoMEVudi5hdXRoMENsaWVudElkID8/IFwiXCIsIGVuYWJsZWQ6IHRydWUgfSxcblx0XHRcdFx0XHRdXG5cdFx0XHRcdDogW10pLFxuXHRcdF07XG5cdFx0Y29uc3QgZW52UmVzID0gYXdhaXQgZmV0Y2goXG5cdFx0XHRgaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vZW52aXJvbm1lbnRzP3dvcmtzcGFjZT0ke29wdGlvbnMud29ya3NwYWNlSWR9YCxcblx0XHRcdHtcblx0XHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdFx0aGVhZGVycyxcblx0XHRcdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoe1xuXHRcdFx0XHRcdGVudmlyb25tZW50OiB7IG5hbWU6IGVudk5hbWUsIHZhbHVlczogZW52VmFsdWVzIH0sXG5cdFx0XHRcdH0pLFxuXHRcdFx0fSxcblx0XHQpO1xuXHRcdGlmIChlbnZSZXMub2spIHtcblx0XHRcdGNvbnNvbGUubG9nKFwiICDinJMgUG9zdG1hbiBlbnZpcm9ubWVudCB1cGxvYWRlZFwiKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcIiAg4pyXIEZhaWxlZCB0byB1cGxvYWQgUG9zdG1hbiBlbnZpcm9ubWVudFwiKTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGNvbnN0IFBvc3RtYW5GZWF0dXJlOiBGZWF0dXJlPFBvc3RtYW5PcHRpb25zPiA9IHsgZ2V0T3B0aW9ucywgc2NhZmZvbGQgfTtcbmV4cG9ydCB7IFBPU1RNQU5fQ0FMTEJBQ0tTLCBQT1NUTUFOX1NDT1BFUyB9O1xuIl0sIm5hbWVzIjpbInJhbmRvbVVVSUQiLCJleGlzdHNTeW5jIiwicmVhZEZpbGVTeW5jIiwiam9pbiIsInBpY2siLCJXRUxMX0tOT1dOX0ZJTEVTIiwiYXV0aDBDbGkiLCJQT1NUTUFOX0NBTExCQUNLUyIsIlBPU1RNQU5fU0NPUEVTIiwiZ2V0T3B0aW9ucyIsIl93b3Jrc3BhY2UiLCJjbGlPcHRpb25zIiwicG9zdG1hblByb3ZpZGVyIiwiY2hvaWNlcyIsImxhYmVsIiwiZGVzY3JpcHRpb24iLCJzZWxlY3RlZCIsImMiLCJwcm92aWRlciIsImFwaUtleSIsInByb2Nlc3MiLCJlbnYiLCJQT1NUTUFOX0FQSV9LRVkiLCJ0aGVuIiwibSIsImFzayIsImhlYWRlcnMiLCJ3c1JlcyIsImZldGNoIiwib2siLCJjb25zb2xlIiwiZXJyb3IiLCJ3b3Jrc3BhY2VzIiwianNvbiIsIndzQ2hvaWNlcyIsImlkIiwibWFwIiwidyIsIm5hbWUiLCJ0eXBlIiwid3NQaWNrZWQiLCJ3b3Jrc3BhY2VJZCIsIndzTmFtZSIsImNyZWF0ZVJlcyIsIm1ldGhvZCIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5Iiwid29ya3NwYWNlIiwid3MiLCJsb2ciLCJidWlsZENvbGxlY3Rpb25Kc29uIiwicHJvamVjdE5hbWUiLCJhdXRoIiwiYXV0aE9iaiIsImF1dGgwRG9tYWluIiwib2F1dGgyIiwia2V5IiwidmFsdWUiLCJ1bmRlZmluZWQiLCJoZWxsb1VybCIsInBhdGgiLCJyYXciLCJob3N0Iiwic3BsaXQiLCJmaWx0ZXIiLCJCb29sZWFuIiwiaW5mbyIsIl9wb3N0bWFuX2lkIiwic2NoZW1hIiwiaXRlbSIsInJlcXVlc3QiLCJ1cmwiLCJoZWFkZXIiLCJtb2RlIiwieWFtbFF1b3RlIiwidGVzdCIsImluY2x1ZGVzIiwiYnVpbGRFbnZpcm9ubWVudFlhbWwiLCJ2YWx1ZXMiLCJwdXNoIiwiYXV0aDBBdWRpZW5jZSIsImF1dGgwQ2xpZW50SWQiLCJsaW5lcyIsInYiLCJidWlsZExvY2FsVmlld0ZpbGVzIiwiY29sbGVjdGlvbkRpciIsImZpbGVzIiwiYXV0aEJsb2NrIiwiZmlsZVBhdGgiLCJjb250ZW50IiwibCIsInJlcGxhY2UiLCJyZXF1ZXN0cyIsImZpbGUiLCJ5YW1sIiwiciIsInJlYWRFeGlzdGluZ1NwYUNsaWVudElkIiwidGFyZ2V0RGlyIiwiZW52UGF0aCIsInRleHQiLCJtYXRjaCIsInRyaW0iLCJsZW5ndGgiLCJyZXNvbHZlU3BhQ2xpZW50SWQiLCJhcHBOYW1lIiwiYXBwIiwiZW5zdXJlU3BhQXBwIiwicmV1c2VkIiwiY2xpZW50X2lkIiwiZW5hYmxlQ29ubmVjdGlvbkZvckNsaWVudCIsIkRCX0NPTk5FQ1RJT05fTkFNRSIsImVyciIsIkVycm9yIiwibWVzc2FnZSIsImV4aXN0aW5nIiwic2NhZmZvbGQiLCJvcHRpb25zIiwiYXV0aENvbmZpZ01vZGVsIiwiZ2V0TW9kZWwiLCJBVVRIX0NPTkZJRyIsImF1dGhDZmciLCJjb25maWciLCJzcGFDbGllbnRJZCIsImlzc3VlckJhc2VVcmwiLCJhdXRoMEVudiIsImF1ZGllbmNlIiwiZW52TmFtZSIsImxvY2FsRmlsZXMiLCJlbnZZYW1sIiwiYWRkRmlsZSIsImNvbGxlY3Rpb24iLCJjb2xSZXMiLCJlbnZWYWx1ZXMiLCJlbmFibGVkIiwiZW52UmVzIiwiZW52aXJvbm1lbnQiLCJQb3N0bWFuRmVhdHVyZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsVUFBVSxRQUFRLGNBQWM7QUFDekMsU0FBU0MsVUFBVSxFQUFFQyxZQUFZLFFBQVEsVUFBVTtBQUNuRCxTQUFTQyxJQUFJLFFBQVEsWUFBWTtBQUNqQyxTQUFTQyxJQUFJLFFBQVEseUJBQXlCO0FBQzlDLFNBQVNDLGdCQUFnQixRQUFRLHdCQUF3QjtBQUl6RCxZQUFZQyxjQUFjLGlCQUFpQjtBQUUzQyxxRUFBcUUsR0FDckUsTUFBTUMsb0JBQW9CO0lBQ3pCO0lBQ0E7Q0FDQTtBQUVELDhFQUE4RSxHQUM5RSxNQUFNQyxpQkFBaUI7SUFDdEI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7Q0FDQSxDQUFDTCxJQUFJLENBQUM7QUFRUCxlQUFlTSxXQUNkQyxVQUE2QixFQUM3QkMsVUFBbUM7SUFFbkMsSUFBSUEsV0FBV0MsZUFBZSxJQUFJLE1BQU0sT0FBTyxDQUFDO0lBRWhELE1BQU1DLFVBQVU7UUFDZjtZQUFFQyxPQUFPO1lBQWlCQyxhQUFhO1FBQU87UUFDOUM7WUFDQ0QsT0FBTztZQUNQQyxhQUFhO1FBQ2Q7UUFDQTtZQUNDRCxPQUFPO1lBQ1BDLGFBQWE7UUFDZDtLQUNBO0lBQ0QsTUFBTUMsV0FBVyxNQUFNWixLQUN0QixpQkFDQVMsU0FDQSxDQUFDSSxJQUFNLEdBQUdBLEVBQUVILEtBQUssQ0FBQyxHQUFHLEVBQUVHLEVBQUVGLFdBQVcsRUFBRTtJQUV2QyxNQUFNRyxXQUFXRixVQUFVRixTQUFTO0lBRXBDLElBQUlJLGFBQWEsUUFBUSxPQUFPO1FBQUVOLGlCQUFpQjtJQUFPO0lBQzFELElBQUlNLGFBQWEsU0FBUyxPQUFPO1FBQUVOLGlCQUFpQjtJQUFRO0lBRTVELE1BQU1PLFNBQ0xDLFFBQVFDLEdBQUcsQ0FB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
|
|
253
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL3Bvc3RtYW4uZmVhdHVyZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHBpY2sgfSBmcm9tIFwiLi4vLi4vZG9tYWluL3Byb21wdC5qc1wiO1xuaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlU2NhZmZvbGQgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3Byb2plY3QubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgRmVhdHVyZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zY2FmZm9sZC5zZXJ2aWNlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEF1dGhDb25maWdNb2RlbCB9IGZyb20gXCIuLi9tb2RlbHMvYXV0aC1jb25maWcubW9kZWwuanNcIjtcbmltcG9ydCB7IGJ1aWxkSGVsbG9PcGVuQXBpRG9jdW1lbnQgfSBmcm9tIFwiLi4vcG9zdG1hbi9oZWxsby1vcGVuYXBpLmpzXCI7XG5pbXBvcnQge1xuXHRidWlsZEVudmlyb25tZW50WWFtbCxcblx0YnVpbGRMb2NhbFZpZXdGaWxlc0Zyb21Db2xsZWN0aW9uLFxufSBmcm9tIFwiLi4vcG9zdG1hbi9sb2NhbC12aWV3LmpzXCI7XG5pbXBvcnQge1xuXHR0eXBlIEF1dGgwRW52LFxuXHRhcHBseVBvc3RtYW5BdXRoT3ZlcmxheSxcblx0b3BlbkFwaVRvUG9zdG1hbkNvbGxlY3Rpb24sXG59IGZyb20gXCIuLi9wb3N0bWFuL29wZW5hcGktdG8tcG9zdG1hbi5qc1wiO1xuaW1wb3J0ICogYXMgYXV0aDBDbGkgZnJvbSBcIi4vYXV0aDAtY2xpLmpzXCI7XG5cbi8qKiBQb3N0bWFuIE9BdXRoIGNhbGxiYWNrIFVSTHMgKHBvcHVwICsgXCJBdXRob3JpemUgdXNpbmcgYnJvd3NlclwiKS4gKi9cbmNvbnN0IFBPU1RNQU5fQ0FMTEJBQ0tTID0gW1xuXHRcImh0dHBzOi8vb2F1dGgucHN0bW4uaW8vdjEvY2FsbGJhY2tcIixcblx0XCJodHRwczovL29hdXRoLnBzdG1uLmlvL3YxL2Jyb3dzZXItY2FsbGJhY2tcIixcbl0gYXMgY29uc3Q7XG5cbi8qKiBTY29wZXMgcmVxdWVzdGVkIGZvciBBdXRoMCBhY2Nlc3MgdG9rZW5zIChPSURDICsgSGVsbG8gQ0FTTCBwZXJtaXNzaW9ucykuICovXG5jb25zdCBQT1NUTUFOX1NDT1BFUyA9IFtcblx0XCJvcGVuaWRcIixcblx0XCJwcm9maWxlXCIsXG5cdFwiZW1haWxcIixcblx0XCJyZWFkOkhlbGxvXCIsXG5cdFwiY3JlYXRlOkhlbGxvXCIsXG5cdFwidXBkYXRlOkhlbGxvXCIsXG5cdFwiZGVsZXRlOkhlbGxvXCIsXG5dLmpvaW4oXCIgXCIpO1xuXG5jb25zdCBDT0xMRUNUSU9OX0RFU0NSSVBUSU9OID1cblx0XCJPcGVuIHRoZSBwcm9qZWN0IHJvb3QgaW4gUG9zdG1hbiBMb2NhbCBWaWV3IChub3QgdGhlIHBvc3RtYW4vIGZvbGRlcikuIFwiICtcblx0XCJTZWxlY3QgdGhlIExvY2FsIGVudmlyb25tZW50LCB0aGVuIEF1dGhvcml6YXRpb24g4oaSIEdldCBOZXcgQWNjZXNzIFRva2VuIChQS0NFKS4gXCIgK1xuXHRcIlJvdXRlcyBhcmUgZ2VuZXJhdGVkIGZyb20gT3BlbkFQSTsgQXV0aDAgb3ZlcmxheSBpcyBoYW5kLWF1dGhvcmVkLlwiO1xuXG5leHBvcnQgdHlwZSBQb3N0bWFuT3B0aW9ucyA9IHtcblx0cG9zdG1hblByb3ZpZGVyPzogXCJhcGlcIiB8IFwibG9jYWxcIiB8IFwibm9uZVwiO1xuXHRhcGlLZXk/OiBzdHJpbmc7XG5cdHdvcmtzcGFjZUlkPzogc3RyaW5nO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0T3B0aW9ucyhcblx0X3dvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsXG5cdGNsaU9wdGlvbnM6IFBhcnRpYWw8UG9zdG1hbk9wdGlvbnM+LFxuKTogUHJvbWlzZTxQYXJ0aWFsPFBvc3RtYW5PcHRpb25zPj4ge1xuXHRpZiAoY2xpT3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgIT0gbnVsbCkgcmV0dXJuIHt9O1xuXG5cdGNvbnN0IGNob2ljZXMgPSBbXG5cdFx0eyBsYWJlbDogXCJub25lXCIgYXMgY29uc3QsIGRlc2NyaXB0aW9uOiBcInNraXBcIiB9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiBcImxvY2FsXCIgYXMgY29uc3QsXG5cdFx0XHRkZXNjcmlwdGlvbjogXCJMb2NhbCBWaWV3IC8gTmF0aXZlIEdpdCBmaWxlcyAobm8gQVBJIGtleSlcIixcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiBcImFwaVwiIGFzIGNvbnN0LFxuXHRcdFx0ZGVzY3JpcHRpb246IFwiYWxzbyB1cGxvYWQgdG8gUG9zdG1hbi5jb20gKG5lZWRzIEFQSSBrZXkpXCIsXG5cdFx0fSxcblx0XTtcblx0Y29uc3Qgc2VsZWN0ZWQgPSBhd2FpdCBwaWNrKFxuXHRcdFwiXFxuICBQb3N0bWFuOiBcIixcblx0XHRjaG9pY2VzLFxuXHRcdChjKSA9PiBgJHtjLmxhYmVsfSDigJQgJHtjLmRlc2NyaXB0aW9ufWAsXG5cdCk7XG5cdGNvbnN0IHByb3ZpZGVyID0gc2VsZWN0ZWQ/LmxhYmVsID8/IFwibm9uZVwiO1xuXG5cdGlmIChwcm92aWRlciA9PT0gXCJub25lXCIpIHJldHVybiB7IHBvc3RtYW5Qcm92aWRlcjogXCJub25lXCIgfTtcblx0aWYgKHByb3ZpZGVyID09PSBcImxvY2FsXCIpIHJldHVybiB7IHBvc3RtYW5Qcm92aWRlcjogXCJsb2NhbFwiIH07XG5cblx0Y29uc3QgYXBpS2V5ID1cblx0XHRwcm9jZXNzLmVudi5QT1NUTUFOX0FQSV9LRVkgPz9cblx0XHQoYXdhaXQgaW1wb3J0KFwiLi4vLi4vZG9tYWluL3Byb21wdC5qc1wiKS50aGVuKChtKSA9PlxuXHRcdFx0bS5hc2soXCJcXG4gIFBvc3RtYW4gQVBJIGtleSAoYXBwLmdldHBvc3RtYW4uY29tL3NldHRpbmdzL21lL2FwaS1rZXlzKTogXCIpLFxuXHRcdCkpO1xuXG5cdGNvbnN0IGhlYWRlcnMgPSB7IFwiWC1BcGktS2V5XCI6IGFwaUtleSwgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfTtcblx0Y29uc3Qgd3NSZXMgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vYXBpLmdldHBvc3RtYW4uY29tL3dvcmtzcGFjZXNcIiwgeyBoZWFkZXJzIH0pO1xuXG5cdGlmICghd3NSZXMub2spIHtcblx0XHRjb25zb2xlLmVycm9yKFwiXFxuICBQb3N0bWFuIEFQSSBrZXkgaW52YWxpZCDigJQgZmFsbGluZyBiYWNrIHRvIGxvY2FsIGZpbGVzLlwiKTtcblx0XHRyZXR1cm4geyBwb3N0bWFuUHJvdmlkZXI6IFwibG9jYWxcIiB9O1xuXHR9XG5cblx0Y29uc3QgeyB3b3Jrc3BhY2VzIH0gPSAoYXdhaXQgd3NSZXMuanNvbigpKSBhcyB7XG5cdFx0d29ya3NwYWNlczogQXJyYXk8eyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9Pjtcblx0fTtcblxuXHR0eXBlIFdzQ2hvaWNlID0geyBsYWJlbDogc3RyaW5nOyBpZDogc3RyaW5nIHwgbnVsbCB9O1xuXHRjb25zdCB3c0Nob2ljZXM6IFdzQ2hvaWNlW10gPSBbXG5cdFx0eyBsYWJlbDogXCI8bmV3IHdvcmtzcGFjZT5cIiwgaWQ6IG51bGwgfSxcblx0XHQuLi53b3Jrc3BhY2VzLm1hcCgodykgPT4gKHsgbGFiZWw6IGAke3cubmFtZX0gKCR7dy50eXBlfSlgLCBpZDogdy5pZCB9KSksXG5cdF07XG5cblx0Y29uc3Qgd3NQaWNrZWQgPSBhd2FpdCBwaWNrKFwiXFxuICBQb3N0bWFuIHdvcmtzcGFjZTogXCIsIHdzQ2hvaWNlcywgKGMpID0+IGMubGFiZWwpO1xuXG5cdGxldCB3b3Jrc3BhY2VJZDogc3RyaW5nO1xuXHRpZiAoIXdzUGlja2VkIHx8IHdzUGlja2VkLmlkID09PSBudWxsKSB7XG5cdFx0Y29uc3QgeyBhc2sgfSA9IGF3YWl0IGltcG9ydChcIi4uLy4uL2RvbWFpbi9wcm9tcHQuanNcIik7XG5cdFx0Y29uc3Qgd3NOYW1lID0gYXdhaXQgYXNrKGAgIFdvcmtzcGFjZSBuYW1lOiBgKTtcblx0XHRjb25zdCBjcmVhdGVSZXMgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vYXBpLmdldHBvc3RtYW4uY29tL3dvcmtzcGFjZXNcIiwge1xuXHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdGhlYWRlcnMsXG5cdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7IHdvcmtzcGFjZTogeyBuYW1lOiB3c05hbWUsIHR5cGU6IFwicGVyc29uYWxcIiB9IH0pLFxuXHRcdH0pO1xuXHRcdGNvbnN0IHsgd29ya3NwYWNlOiB3cyB9ID0gKGF3YWl0IGNyZWF0ZVJlcy5qc29uKCkpIGFzIHsgd29ya3NwYWNlOiB7IGlkOiBzdHJpbmcgfSB9O1xuXHRcdHdvcmtzcGFjZUlkID0gd3MuaWQ7XG5cdFx0Y29uc29sZS5sb2coYCAg4pyTIFdvcmtzcGFjZSBjcmVhdGVkOiAke3dzTmFtZX1gKTtcblx0fSBlbHNlIHtcblx0XHR3b3Jrc3BhY2VJZCA9IHdzUGlja2VkLmlkO1xuXHR9XG5cblx0cmV0dXJuIHsgcG9zdG1hblByb3ZpZGVyOiBcImFwaVwiLCBhcGlLZXksIHdvcmtzcGFjZUlkIH07XG59XG5cbi8qKiBCdWlsZCBQb3N0bWFuIGNvbGxlY3Rpb246IE9wZW5BUEkgcm91dGVzICsgQXV0aDAgYXV0aCBvdmVybGF5LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSHlicmlkUG9zdG1hbkNvbGxlY3Rpb24ocHJvamVjdE5hbWU6IHN0cmluZywgYXV0aD86IEF1dGgwRW52KSB7XG5cdGNvbnN0IG9wZW5hcGkgPSBidWlsZEhlbGxvT3BlbkFwaURvY3VtZW50KHByb2plY3ROYW1lKTtcblx0Y29uc3QgYmFzZSA9IGF3YWl0IG9wZW5BcGlUb1Bvc3RtYW5Db2xsZWN0aW9uKG9wZW5hcGkpO1xuXHRpZiAoYmFzZS5pbmZvLl9wb3N0bWFuX2lkID09IG51bGwpIHtcblx0XHRiYXNlLmluZm8uX3Bvc3RtYW5faWQgPSByYW5kb21VVUlEKCk7XG5cdH1cblx0cmV0dXJuIGFwcGx5UG9zdG1hbkF1dGhPdmVybGF5KGJhc2UsIHByb2plY3ROYW1lLCBhdXRoLCB7XG5cdFx0Y2FsbGJhY2tzOiBQT1NUTUFOX0NBTExCQUNLUyxcblx0XHRzY29wZXM6IFBPU1RNQU5fU0NPUEVTLFxuXHRcdGRlc2NyaXB0aW9uOiBDT0xMRUNUSU9OX0RFU0NSSVBUSU9OLFxuXHR9KTtcbn1cblxuLyoqIFJlYWQgYSBwcmV2aW91c2x5IHNjYWZmb2xkZWQgYXV0aDBDbGllbnRJZCBzbyByZS1zY2FmZm9sZCBuZXZlciBibGFua3MgaXQuICovXG5mdW5jdGlvbiByZWFkRXhpc3RpbmdTcGFDbGllbnRJZCh0YXJnZXREaXI6IHN0cmluZywgcHJvamVjdE5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGVudlBhdGggPSBqb2luKFxuXHRcdHRhcmdldERpcixcblx0XHRcInBvc3RtYW4vZW52aXJvbm1lbnRzXCIsXG5cdFx0YCR7cHJvamVjdE5hbWV9LUxvY2FsLmVudmlyb25tZW50LnlhbWxgLFxuXHQpO1xuXHRpZiAoIWV4aXN0c1N5bmMoZW52UGF0aCkpIHJldHVybiB1bmRlZmluZWQ7XG5cdGNvbnN0IHRleHQgPSByZWFkRmlsZVN5bmMoZW52UGF0aCwgXCJ1dGY4XCIpO1xuXHRjb25zdCBtYXRjaCA9IHRleHQubWF0Y2goL2tleTpcXHMqYXV0aDBDbGllbnRJZFxccypcXG5cXHMqdmFsdWU6XFxzKltcIiddPyhbXlwiJ1xcbl0rKS8pO1xuXHRjb25zdCB2YWx1ZSA9IG1hdGNoPy5bMV0/LnRyaW0oKTtcblx0cmV0dXJuIHZhbHVlICYmIHZhbHVlLmxlbmd0aCA+IDAgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBQb3N0bWFuIFNQQSBjbGllbnQgaWQuIE5ldmVyIHJldHVybnMgZW1wdHkg4oCUIHByZXNlcnZlcyBhbiBleGlzdGluZ1xuICogZW52IHZhbHVlIG9uIEF1dGgwIGZhaWx1cmUsIG90aGVyd2lzZSB0aHJvd3Mgc28gd2UgZG8gbm90IHdyaXRlIGEgYmxhbmsgZW52LlxuICovXG5mdW5jdGlvbiByZXNvbHZlU3BhQ2xpZW50SWQod29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCk6IHN0cmluZyB7XG5cdGNvbnN0IGFwcE5hbWUgPSBgJHt3b3Jrc3BhY2UubmFtZX0gUG9zdG1hbmA7XG5cdHRyeSB7XG5cdFx0Y29uc3QgYXBwID0gYXV0aDBDbGkuZW5zdXJlU3BhQXBwKGFwcE5hbWUsIFsuLi5QT1NUTUFOX0NBTExCQUNLU10pO1xuXHRcdGNvbnNvbGUubG9nKFxuXHRcdFx0YXBwLnJldXNlZFxuXHRcdFx0XHQ/IGAgIOKckyBSZXVzaW5nIEF1dGgwIFNQQSBhcHAgZm9yIFBvc3RtYW4gUEtDRSAoJHthcHAuY2xpZW50X2lkfSlgXG5cdFx0XHRcdDogYCAg4pyTIEF1dGgwIFNQQSBhcHAgY3JlYXRlZCBmb3IgUG9zdG1hbiBQS0NFICgke2FwcC5jbGllbnRfaWR9KWAsXG5cdFx0KTtcblx0XHR0cnkge1xuXHRcdFx0YXV0aDBDbGkuZW5hYmxlQ29ubmVjdGlvbkZvckNsaWVudChhdXRoMENsaS5EQl9DT05ORUNUSU9OX05BTUUsIGFwcC5jbGllbnRfaWQpO1xuXHRcdFx0Y29uc29sZS5sb2coYCAg4pyTIEVuYWJsZWQgJHthdXRoMENsaS5EQl9DT05ORUNUSU9OX05BTUV9IG9uIFBvc3RtYW4gU1BBYCk7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFxuXHRcdFx0XHRgICDinJcgRmFpbGVkIHRvIGVuYWJsZSBEQiBjb25uZWN0aW9uIG9uIFNQQTogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogZXJyfWAsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gYXBwLmNsaWVudF9pZDtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Y29uc3QgZXhpc3RpbmcgPSByZWFkRXhpc3RpbmdTcGFDbGllbnRJZCh3b3Jrc3BhY2UudGFyZ2V0RGlyLCB3b3Jrc3BhY2UubmFtZSk7XG5cdFx0aWYgKGV4aXN0aW5nKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFxuXHRcdFx0XHRgICDinJcgRmFpbGVkIHRvIGVuc3VyZSBBdXRoMCBTUEEgYXBwICgke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBlcnJ9KWAsXG5cdFx0XHQpO1xuXHRcdFx0Y29uc29sZS5sb2coYCAg4pyTIEtlZXBpbmcgZXhpc3RpbmcgYXV0aDBDbGllbnRJZCBmcm9tIFBvc3RtYW4gZW52aXJvbm1lbnQgKCR7ZXhpc3Rpbmd9KWApO1xuXHRcdFx0cmV0dXJuIGV4aXN0aW5nO1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRgRmFpbGVkIHRvIGVuc3VyZSBBdXRoMCBTUEEgYXBwIGZvciBQb3N0bWFuIOKAlCBhdXRoMENsaWVudElkIHdvdWxkIGJlIGVtcHR5OiAke1xuXHRcdFx0XHRlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogZXJyXG5cdFx0XHR9YCxcblx0XHQpO1xuXHR9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkKHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsIG9wdGlvbnM6IFBvc3RtYW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG5cdGlmIChvcHRpb25zLnBvc3RtYW5Qcm92aWRlciA9PT0gXCJub25lXCIgfHwgb3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgPT0gbnVsbCkgcmV0dXJuO1xuXG5cdGNvbnN0IGF1dGhDb25maWdNb2RlbCA9IHdvcmtzcGFjZS5nZXRNb2RlbDxBdXRoQ29uZmlnTW9kZWw+KFdFTExfS05PV05fRklMRVMuQVVUSF9DT05GSUcpO1xuXHRjb25zdCBhdXRoQ2ZnID0gYXV0aENvbmZpZ01vZGVsPy5jb25maWc7XG5cblx0Y29uc3Qgc3BhQ2xpZW50SWQgPSBhdXRoQ2ZnPy5pc3N1ZXJCYXNlVXJsID8gcmVzb2x2ZVNwYUNsaWVudElkKHdvcmtzcGFjZSkgOiB1bmRlZmluZWQ7XG5cblx0Y29uc3QgYXV0aDBFbnY6IEF1dGgwRW52IHwgdW5kZWZpbmVkID0gYXV0aENmZz8uaXNzdWVyQmFzZVVybFxuXHRcdD8ge1xuXHRcdFx0XHRhdXRoMERvbWFpbjogYXV0aENmZy5pc3N1ZXJCYXNlVXJsLnJlcGxhY2UoL15odHRwcz86XFwvXFwvLywgXCJcIiksXG5cdFx0XHRcdGF1dGgwQXVkaWVuY2U6IGF1dGhDZmcuYXVkaWVuY2UsXG5cdFx0XHRcdGF1dGgwQ2xpZW50SWQ6IHNwYUNsaWVudElkLFxuXHRcdFx0fVxuXHRcdDogdW5kZWZpbmVkO1xuXG5cdGNvbnN0IHByb2plY3ROYW1lID0gd29ya3NwYWNlLm5hbWU7XG5cdGNvbnN0IGVudk5hbWUgPSBgJHtwcm9qZWN0TmFtZX0gTG9jYWxgO1xuXHRjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgYnVpbGRIeWJyaWRQb3N0bWFuQ29sbGVjdGlvbihwcm9qZWN0TmFtZSwgYXV0aDBFbnYpO1xuXHRjb25zdCBsb2NhbEZpbGVzID0gYnVpbGRMb2NhbFZpZXdGaWxlc0Zyb21Db2xsZWN0aW9uKGNvbGxlY3Rpb24sIHByb2plY3ROYW1lLCBhdXRoMEVudiwge1xuXHRcdGNhbGxiYWNrczogUE9TVE1BTl9DQUxMQkFDS1MsXG5cdFx0c2NvcGVzOiBQT1NUTUFOX1NDT1BFUyxcblx0fSk7XG5cdGNvbnN0IGVudllhbWwgPSBidWlsZEVudmlyb25tZW50WWFtbChlbnZOYW1lLCBhdXRoMEVudiwge1xuXHRcdGNhbGxiYWNrczogUE9TVE1BTl9DQUxMQkFDS1MsXG5cdFx0c2NvcGVzOiBQT1NUTUFOX1NDT1BFUyxcblx0fSk7XG5cblx0d29ya3NwYWNlLmFkZEZpbGUoe1xuXHRcdGZpbGVzOiAoKSA9PiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcIi5wb3N0bWFuL3Jlc291cmNlcy55YW1sXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IFtcblx0XHRcdFx0XHRcIiMgT3BlbiB0aGlzIHByb2plY3Qgcm9vdCBpbiBQb3N0bWFuIChGaWxlcyDihpIgT3BlbiBmb2xkZXIpLCBub3QgdGhlIHBvc3RtYW4vIHN1YmZvbGRlci5cIixcblx0XHRcdFx0XHRcIiMgUG9zdG1hbiBmaWxscyB3b3Jrc3BhY2UuaWQgd2hlbiB5b3UgY29ubmVjdCBMb2NhbCBWaWV3LlwiLFxuXHRcdFx0XHRcdFwiI1wiLFxuXHRcdFx0XHRcdFwiIyBBbGwgcmVzb3VyY2VzIHVuZGVyIHBvc3RtYW4vIGFyZSByZWdpc3RlcmVkIGF1dG9tYXRpY2FsbHkuXCIsXG5cdFx0XHRcdFx0XCIjIFJvdXRlIHJlcXVlc3RzIGFyZSBnZW5lcmF0ZWQgZnJvbSBPcGVuQVBJOyBBdXRoMCBvdmVybGF5IGlzIGhhbmQtYXV0aG9yZWQuXCIsXG5cdFx0XHRcdFx0XCJcIixcblx0XHRcdFx0XS5qb2luKFwiXFxuXCIpLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IGBwb3N0bWFuL2Vudmlyb25tZW50cy8ke3Byb2plY3ROYW1lfS1Mb2NhbC5lbnZpcm9ubWVudC55YW1sYCxcblx0XHRcdFx0Y29udGVudDogZW52WWFtbCxcblx0XHRcdH0sXG5cdFx0XHQuLi5sb2NhbEZpbGVzLFxuXHRcdF0sXG5cdH0pO1xuXG5cdGlmIChvcHRpb25zLnBvc3RtYW5Qcm92aWRlciA9PT0gXCJhcGlcIiAmJiBvcHRpb25zLmFwaUtleSkge1xuXHRcdGNvbnN0IGhlYWRlcnMgPSB7IFwiWC1BcGktS2V5XCI6IG9wdGlvbnMuYXBpS2V5LCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9O1xuXG5cdFx0Y29uc3QgY29sUmVzID0gYXdhaXQgZmV0Y2goXG5cdFx0XHRgaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vY29sbGVjdGlvbnM/d29ya3NwYWNlPSR7b3B0aW9ucy53b3Jrc3BhY2VJZH1gLFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRoZWFkZXJzLFxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvbGxlY3Rpb24gfSksXG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0aWYgKGNvbFJlcy5vaykge1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBQb3N0bWFuIGNvbGxlY3Rpb24gdXBsb2FkZWRcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCIgIOKclyBGYWlsZWQgdG8gdXBsb2FkIFBvc3RtYW4gY29sbGVjdGlvblwiKTtcblx0XHR9XG5cblx0XHRjb25zdCBlbnZWYWx1ZXMgPSBbXG5cdFx0XHR7IGtleTogXCJiYXNlVXJsXCIsIHZhbHVlOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMFwiLCBlbmFibGVkOiB0cnVlIH0sXG5cdFx0XHQuLi4oYXV0aDBFbnY/LmF1dGgwRG9tYWluXG5cdFx0XHRcdD8gW1xuXHRcdFx0XHRcdFx0eyBrZXk6IFwiYXV0aDBEb21haW5cIiwgdmFsdWU6IGF1dGgwRW52LmF1dGgwRG9tYWluLCBlbmFibGVkOiB0cnVlIH0sXG5cdFx0XHRcdFx0XHR7IGtleTogXCJhdXRoMEF1ZGllbmNlXCIsIHZhbHVlOiBhdXRoMEVudi5hdXRoMEF1ZGllbmNlID8/IFwiXCIsIGVuYWJsZWQ6IHRydWUgfSxcblx0XHRcdFx0XHRcdHsga2V5OiBcImF1dGgwQ2xpZW50SWRcIiwgdmFsdWU6IGF1dGgwRW52LmF1dGgwQ2xpZW50SWQgPz8gXCJcIiwgZW5hYmxlZDogdHJ1ZSB9LFxuXHRcdFx0XHRcdF1cblx0XHRcdFx0OiBbXSksXG5cdFx0XTtcblx0XHRjb25zdCBlbnZSZXMgPSBhd2FpdCBmZXRjaChcblx0XHRcdGBodHRwczovL2FwaS5nZXRwb3N0bWFuLmNvbS9lbnZpcm9ubWVudHM/d29ya3NwYWNlPSR7b3B0aW9ucy53b3Jrc3BhY2VJZH1gLFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRoZWFkZXJzLFxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdFx0ZW52aXJvbm1lbnQ6IHsgbmFtZTogZW52TmFtZSwgdmFsdWVzOiBlbnZWYWx1ZXMgfSxcblx0XHRcdFx0fSksXG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0aWYgKGVudlJlcy5vaykge1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBQb3N0bWFuIGVudmlyb25tZW50IHVwbG9hZGVkXCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiICDinJcgRmFpbGVkIHRvIHVwbG9hZCBQb3N0bWFuIGVudmlyb25tZW50XCIpO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgY29uc3QgUG9zdG1hbkZlYXR1cmU6IEZlYXR1cmU8UG9zdG1hbk9wdGlvbnM+ID0geyBnZXRPcHRpb25zLCBzY2FmZm9sZCB9O1xuZXhwb3J0IHsgYnVpbGRIZWxsb09wZW5BcGlEb2N1bWVudCB9IGZyb20gXCIuLi9wb3N0bWFuL2hlbGxvLW9wZW5hcGkuanNcIjtcbmV4cG9ydCB7IFBPU1RNQU5fQ0FMTEJBQ0tTLCBQT1NUTUFOX1NDT1BFUyB9O1xuIl0sIm5hbWVzIjpbInJhbmRvbVVVSUQiLCJleGlzdHNTeW5jIiwicmVhZEZpbGVTeW5jIiwiam9pbiIsInBpY2siLCJXRUxMX0tOT1dOX0ZJTEVTIiwiYnVpbGRIZWxsb09wZW5BcGlEb2N1bWVudCIsImJ1aWxkRW52aXJvbm1lbnRZYW1sIiwiYnVpbGRMb2NhbFZpZXdGaWxlc0Zyb21Db2xsZWN0aW9uIiwiYXBwbHlQb3N0bWFuQXV0aE92ZXJsYXkiLCJvcGVuQXBpVG9Qb3N0bWFuQ29sbGVjdGlvbiIsImF1dGgwQ2xpIiwiUE9TVE1BTl9DQUxMQkFDS1MiLCJQT1NUTUFOX1NDT1BFUyIsIkNPTExFQ1RJT05fREVTQ1JJUFRJT04iLCJnZXRPcHRpb25zIiwiX3dvcmtzcGFjZSIsImNsaU9wdGlvbnMiLCJwb3N0bWFuUHJvdmlkZXIiLCJjaG9pY2VzIiwibGFiZWwiLCJkZXNjcmlwdGlvbiIsInNlbGVjdGVkIiwiYyIsInByb3ZpZGVyIiwiYXBpS2V5IiwicHJvY2VzcyIsImVudiIsIlBPU1RNQU5fQVBJX0tFWSIsInRoZW4iLCJtIiwiYXNrIiwiaGVhZGVycyIsIndzUmVzIiwiZmV0Y2giLCJvayIsImNvbnNvbGUiLCJlcnJvciIsIndvcmtzcGFjZXMiLCJqc29uIiwid3NDaG9pY2VzIiwiaWQiLCJtYXAiLCJ3IiwibmFtZSIsInR5cGUiLCJ3c1BpY2tlZCIsIndvcmtzcGFjZUlkIiwid3NOYW1lIiwiY3JlYXRlUmVzIiwibWV0aG9kIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ3b3Jrc3BhY2UiLCJ3cyIsImxvZyIsImJ1aWxkSHlicmlkUG9zdG1hbkNvbGxlY3Rpb24iLCJwcm9qZWN0TmFtZSIsImF1dGgiLCJvcGVuYXBpIiwiYmFzZSIsImluZm8iLCJfcG9zdG1hbl9pZCIsImNhbGxiYWNrcyIsInNjb3BlcyIsInJlYWRFeGlzdGluZ1NwYUNsaWVudElkIiwidGFyZ2V0RGlyIiwiZW52UGF0aCIsInVuZGVmaW5lZCIsInRleHQiLCJtYXRjaCIsInZhbHVlIiwidHJpbSIsImxlbmd0aCIsInJlc29sdmVTcGFDbGllbnRJZCIsImFwcE5hbWUiLCJhcHAiLCJlbnN1cmVTcGFBcHAiLCJyZXVzZWQiLCJjbGllbnRfaWQiLCJlbmFibGVDb25uZWN0aW9uRm9yQ2xpZW50IiwiREJfQ09OTkVDVElPTl9OQU1FIiwiZXJyIiwiRXJyb3IiLCJtZXNzYWdlIiwiZXhpc3RpbmciLCJzY2FmZm9sZCIsIm9wdGlvbnMiLCJhdXRoQ29uZmlnTW9kZWwiLCJnZXRNb2RlbCIsIkFVVEhfQ09ORklHIiwiYXV0aENmZyIsImNvbmZpZyIsInNwYUNsaWVudElkIiwiaXNzdWVyQmFzZVVybCIsImF1dGgwRW52IiwiYXV0aDBEb21haW4iLCJyZXBsYWNlIiwiYXV0aDBBdWRpZW5jZSIsImF1ZGllbmNlIiwiYXV0aDBDbGllbnRJZCIsImVudk5hbWUiLCJjb2xsZWN0aW9uIiwibG9jYWxGaWxlcyIsImVudllhbWwiLCJhZGRGaWxlIiwiZmlsZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJjb2xSZXMiLCJlbnZWYWx1ZXMiLCJrZXkiLCJlbmFibGVkIiwiZW52UmVzIiwiZW52aXJvbm1lbnQiLCJ2YWx1ZXMiLCJQb3N0bWFuRmVhdHVyZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsVUFBVSxRQUFRLGNBQWM7QUFDekMsU0FBU0MsVUFBVSxFQUFFQyxZQUFZLFFBQVEsVUFBVTtBQUNuRCxTQUFTQyxJQUFJLFFBQVEsWUFBWTtBQUNqQyxTQUFTQyxJQUFJLFFBQVEseUJBQXlCO0FBQzlDLFNBQVNDLGdCQUFnQixRQUFRLHdCQUF3QjtBQUl6RCxTQUFTQyx5QkFBeUIsUUFBUSw4QkFBOEI7QUFDeEUsU0FDQ0Msb0JBQW9CLEVBQ3BCQyxpQ0FBaUMsUUFDM0IsMkJBQTJCO0FBQ2xDLFNBRUNDLHVCQUF1QixFQUN2QkMsMEJBQTBCLFFBQ3BCLG1DQUFtQztBQUMxQyxZQUFZQyxjQUFjLGlCQUFpQjtBQUUzQyxxRUFBcUUsR0FDckUsTUFBTUMsb0JBQW9CO0lBQ3pCO0lBQ0E7Q0FDQTtBQUVELDhFQUE4RSxHQUM5RSxNQUFNQyxpQkFBaUI7SUFDdEI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7Q0FDQSxDQUFDVixJQUFJLENBQUM7QUFFUCxNQUFNVyx5QkFDTCw0RUFDQSxxRkFDQTtBQVFELGVBQWVDLFdBQ2RDLFVBQTZCLEVBQzdCQyxVQUFtQztJQUVuQyxJQUFJQSxXQUFXQyxlQUFlLElBQUksTUFBTSxPQUFPLENBQUM7SUFFaEQsTUFBTUMsVUFBVTtRQUNmO1lBQUVDLE9BQU87WUFBaUJDLGFBQWE7UUFBTztRQUM5QztZ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
|