@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.
@@ -17,6 +17,12 @@ _export(exports, {
17
17
  },
18
18
  get PostmanFeature () {
19
19
  return PostmanFeature;
20
+ },
21
+ get buildHelloOpenApiDocument () {
22
+ return _helloopenapi.buildHelloOpenApiDocument;
23
+ },
24
+ get buildHybridPostmanCollection () {
25
+ return buildHybridPostmanCollection;
20
26
  }
21
27
  });
22
28
  const _nodecrypto = require("node:crypto");
@@ -24,6 +30,9 @@ const _nodefs = require("node:fs");
24
30
  const _nodepath = require("node:path");
25
31
  const _prompt = require("../../domain/prompt.js");
26
32
  const _const = require("../../models/const.js");
33
+ const _helloopenapi = require("../postman/hello-openapi.js");
34
+ const _localview = require("../postman/local-view.js");
35
+ const _openapitopostman = require("../postman/openapi-to-postman.js");
27
36
  const _auth0cli = /*#__PURE__*/ _interop_require_wildcard(require("./auth0-cli.js"));
28
37
  function _getRequireWildcardCache(nodeInterop) {
29
38
  if (typeof WeakMap !== "function") return null;
@@ -79,6 +88,7 @@ function _interop_require_wildcard(obj, nodeInterop) {
79
88
  "update:Hello",
80
89
  "delete:Hello"
81
90
  ].join(" ");
91
+ 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.";
82
92
  async function getOptions(_workspace, cliOptions) {
83
93
  if (cliOptions.postmanProvider != null) return {};
84
94
  const choices = [
@@ -155,333 +165,17 @@ async function getOptions(_workspace, cliOptions) {
155
165
  workspaceId
156
166
  };
157
167
  }
158
- /** v2.1 JSON — used for Postman.com API upload only. */ function buildCollectionJson(projectName, auth) {
159
- const authObj = auth?.auth0Domain ? {
160
- type: "oauth2",
161
- oauth2: [
162
- {
163
- key: "grant_type",
164
- value: "authorization_code_with_pkce",
165
- type: "string"
166
- },
167
- {
168
- key: "authUrl",
169
- value: "https://{{auth0Domain}}/authorize?audience={{auth0Audience}}",
170
- type: "string"
171
- },
172
- {
173
- key: "accessTokenUrl",
174
- value: "https://{{auth0Domain}}/oauth/token",
175
- type: "string"
176
- },
177
- {
178
- key: "clientId",
179
- value: "{{auth0ClientId}}",
180
- type: "string"
181
- },
182
- {
183
- key: "scope",
184
- value: POSTMAN_SCOPES,
185
- type: "string"
186
- },
187
- {
188
- key: "redirect_uri",
189
- value: POSTMAN_CALLBACKS[0],
190
- type: "string"
191
- },
192
- {
193
- key: "useBrowser",
194
- value: "true",
195
- type: "boolean"
196
- },
197
- {
198
- key: "addTokenTo",
199
- value: "header",
200
- type: "string"
201
- },
202
- {
203
- key: "challengeAlgorithm",
204
- value: "S256",
205
- type: "string"
206
- },
207
- {
208
- key: "client_authentication",
209
- value: "body",
210
- type: "string"
211
- },
212
- {
213
- key: "clientSecret",
214
- value: "",
215
- type: "string"
216
- },
217
- {
218
- key: "tokenName",
219
- value: `${projectName} Access Token`,
220
- type: "string"
221
- }
222
- ]
223
- } : undefined;
224
- const helloUrl = (path, raw)=>({
225
- raw: `{{baseUrl}}${raw}`,
226
- host: [
227
- "{{baseUrl}}"
228
- ],
229
- path: path.split("/").filter(Boolean)
230
- });
231
- return {
232
- info: {
233
- _postman_id: (0, _nodecrypto.randomUUID)(),
234
- name: `${projectName} WebAPI`,
235
- schema: "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
236
- description: "Open the project root in Postman Local View (not the postman/ folder). " + "Select the Local environment, then Authorization → Get New Access Token (PKCE)."
237
- },
238
- ...authObj ? {
239
- auth: authObj
240
- } : {},
241
- item: [
242
- {
243
- name: "Hello",
244
- item: [
245
- {
246
- name: "List (anonymous)",
247
- request: {
248
- auth: {
249
- type: "noauth"
250
- },
251
- method: "GET",
252
- url: helloUrl("hello", "/hello")
253
- }
254
- },
255
- {
256
- name: "Get by id",
257
- request: {
258
- method: "GET",
259
- url: helloUrl("hello/:id", "/hello/:id")
260
- }
261
- },
262
- {
263
- name: "Create",
264
- request: {
265
- method: "POST",
266
- header: [
267
- {
268
- key: "Content-Type",
269
- value: "application/json"
270
- }
271
- ],
272
- body: {
273
- mode: "raw",
274
- raw: '{\n "message": "hello"\n}\n'
275
- },
276
- url: helloUrl("hello", "/hello")
277
- }
278
- },
279
- {
280
- name: "Update",
281
- request: {
282
- method: "PUT",
283
- header: [
284
- {
285
- key: "Content-Type",
286
- value: "application/json"
287
- }
288
- ],
289
- body: {
290
- mode: "raw",
291
- raw: '{\n "message": "updated"\n}\n'
292
- },
293
- url: helloUrl("hello/:id", "/hello/:id")
294
- }
295
- },
296
- {
297
- name: "Delete",
298
- request: {
299
- method: "DELETE",
300
- url: helloUrl("hello/:id", "/hello/:id")
301
- }
302
- }
303
- ]
304
- }
305
- ]
306
- };
307
- }
308
- function yamlQuote(value) {
309
- if (/[:#{}[\],&*?|<>=!%@`]/.test(value) || value.includes("\n") || value === "") {
310
- return JSON.stringify(value);
168
+ async function buildHybridPostmanCollection(projectName, auth) {
169
+ const openapi = (0, _helloopenapi.buildHelloOpenApiDocument)(projectName);
170
+ const base = await (0, _openapitopostman.openApiToPostmanCollection)(openapi);
171
+ if (base.info._postman_id == null) {
172
+ base.info._postman_id = (0, _nodecrypto.randomUUID)();
311
173
  }
312
- return value;
313
- }
314
- /** Local View / Native Git environment (YAML). */ function buildEnvironmentYaml(name, auth) {
315
- const values = [
316
- {
317
- key: "baseUrl",
318
- value: "http://localhost:3000"
319
- }
320
- ];
321
- if (auth?.auth0Domain) {
322
- values.push({
323
- key: "auth0Domain",
324
- value: auth.auth0Domain
325
- }, {
326
- key: "auth0Audience",
327
- value: auth.auth0Audience ?? ""
328
- }, {
329
- key: "auth0ClientId",
330
- value: auth.auth0ClientId ?? ""
331
- }, {
332
- key: "authUrl",
333
- value: `https://${auth.auth0Domain}/authorize?audience=${auth.auth0Audience ?? ""}`
334
- }, {
335
- key: "accessTokenUrl",
336
- value: `https://${auth.auth0Domain}/oauth/token`
337
- }, {
338
- key: "callbackUrl",
339
- value: POSTMAN_CALLBACKS[0]
340
- }, {
341
- key: "scope",
342
- value: POSTMAN_SCOPES
343
- });
344
- }
345
- const lines = [
346
- `name: ${yamlQuote(name)}`,
347
- "values:"
348
- ];
349
- for (const v of values){
350
- lines.push(` - key: ${v.key}`);
351
- lines.push(` value: ${yamlQuote(v.value)}`);
352
- lines.push(" enabled: true");
353
- }
354
- return `${lines.join("\n")}\n`;
355
- }
356
- /** Local View / Native Git collection (v3 multi-file YAML). */ function buildLocalViewFiles(projectName, auth) {
357
- const collectionDir = `postman/collections/${projectName} WebAPI`;
358
- const files = [];
359
- // Postman Local View stores OAuth under auth[].credentials (not the v2.1 oauth2 array).
360
- // Use concrete https URLs — empty Auth URL yields "Invalid protocol for auth URL".
361
- const authBlock = auth?.auth0Domain ? [
362
- "auth:",
363
- ` - id: ${(0, _nodecrypto.randomUUID)()}`,
364
- " type: oauth2",
365
- " name: OAuth 2.0",
366
- " credentials:",
367
- " addTokenTo: header",
368
- " grant_type: authorization_code_with_pkce",
369
- ` authUrl: https://${auth.auth0Domain}/authorize?audience=${auth.auth0Audience ?? ""}`,
370
- ` accessTokenUrl: https://${auth.auth0Domain}/oauth/token`,
371
- ` clientId: ${yamlQuote(auth.auth0ClientId ?? "")}`,
372
- ` scope: ${yamlQuote(POSTMAN_SCOPES)}`,
373
- ` redirect_uri: ${POSTMAN_CALLBACKS[0]}`,
374
- " useBrowser: true",
375
- " challengeAlgorithm: S256",
376
- // SPA public client: Auth0 token endpoint rejects Basic auth (feacft Unauthorized).
377
- " client_authentication: body",
378
- ' clientSecret: ""',
379
- ` tokenName: ${yamlQuote(`${projectName} Access Token`)}`,
380
- ""
381
- ].join("\n") : "";
382
- files.push({
383
- filePath: `${collectionDir}/.resources/definition.yaml`,
384
- content: [
385
- "$kind: collection",
386
- `name: ${yamlQuote(`${projectName} WebAPI`)}`,
387
- "schemaVersion: '3.0'",
388
- "description: >-",
389
- " Open this project root in Postman Local View (Files → Open folder).",
390
- " Select the Local environment, then Authorization → Get New Access Token (PKCE).",
391
- authBlock
392
- ].filter((l)=>l !== undefined).join("\n").replace(/\n+$/, "\n")
393
- });
394
- files.push({
395
- filePath: `${collectionDir}/Hello/.resources/definition.yaml`,
396
- content: [
397
- "$kind: folder",
398
- "name: Hello",
399
- "order: 1000",
400
- ""
401
- ].join("\n")
174
+ return (0, _openapitopostman.applyPostmanAuthOverlay)(base, projectName, auth, {
175
+ callbacks: POSTMAN_CALLBACKS,
176
+ scopes: POSTMAN_SCOPES,
177
+ description: COLLECTION_DESCRIPTION
402
178
  });
403
- const requests = [
404
- {
405
- file: "List (anonymous).request.yaml",
406
- yaml: [
407
- "$kind: http-request",
408
- "name: List (anonymous)",
409
- "method: GET",
410
- 'url: "{{baseUrl}}/hello"',
411
- "auth:",
412
- " type: noauth",
413
- "order: 1000",
414
- ""
415
- ].join("\n")
416
- },
417
- {
418
- file: "Get by id.request.yaml",
419
- yaml: [
420
- "$kind: http-request",
421
- "name: Get by id",
422
- "method: GET",
423
- 'url: "{{baseUrl}}/hello/:id"',
424
- "order: 2000",
425
- ""
426
- ].join("\n")
427
- },
428
- {
429
- file: "Create.request.yaml",
430
- yaml: [
431
- "$kind: http-request",
432
- "name: Create",
433
- "method: POST",
434
- 'url: "{{baseUrl}}/hello"',
435
- "headers:",
436
- " Content-Type: application/json",
437
- "body:",
438
- " type: json",
439
- " content: |-",
440
- " {",
441
- ' "message": "hello"',
442
- " }",
443
- "order: 3000",
444
- ""
445
- ].join("\n")
446
- },
447
- {
448
- file: "Update.request.yaml",
449
- yaml: [
450
- "$kind: http-request",
451
- "name: Update",
452
- "method: PUT",
453
- 'url: "{{baseUrl}}/hello/:id"',
454
- "headers:",
455
- " Content-Type: application/json",
456
- "body:",
457
- " type: json",
458
- " content: |-",
459
- " {",
460
- ' "message": "updated"',
461
- " }",
462
- "order: 4000",
463
- ""
464
- ].join("\n")
465
- },
466
- {
467
- file: "Delete.request.yaml",
468
- yaml: [
469
- "$kind: http-request",
470
- "name: Delete",
471
- "method: DELETE",
472
- 'url: "{{baseUrl}}/hello/:id"',
473
- "order: 5000",
474
- ""
475
- ].join("\n")
476
- }
477
- ];
478
- for (const r of requests){
479
- files.push({
480
- filePath: `${collectionDir}/Hello/${r.file}`,
481
- content: r.yaml
482
- });
483
- }
484
- return files;
485
179
  }
486
180
  /** Read a previously scaffolded auth0ClientId so re-scaffold never blanks it. */ function readExistingSpaClientId(targetDir, projectName) {
487
181
  const envPath = (0, _nodepath.join)(targetDir, "postman/environments", `${projectName}-Local.environment.yaml`);
@@ -530,8 +224,15 @@ async function scaffold(workspace, options) {
530
224
  } : undefined;
531
225
  const projectName = workspace.name;
532
226
  const envName = `${projectName} Local`;
533
- const localFiles = buildLocalViewFiles(projectName, auth0Env);
534
- const envYaml = buildEnvironmentYaml(envName, auth0Env);
227
+ const collection = await buildHybridPostmanCollection(projectName, auth0Env);
228
+ const localFiles = (0, _localview.buildLocalViewFilesFromCollection)(collection, projectName, auth0Env, {
229
+ callbacks: POSTMAN_CALLBACKS,
230
+ scopes: POSTMAN_SCOPES
231
+ });
232
+ const envYaml = (0, _localview.buildEnvironmentYaml)(envName, auth0Env, {
233
+ callbacks: POSTMAN_CALLBACKS,
234
+ scopes: POSTMAN_SCOPES
235
+ });
535
236
  workspace.addFile({
536
237
  files: ()=>[
537
238
  {
@@ -541,6 +242,7 @@ async function scaffold(workspace, options) {
541
242
  "# Postman fills workspace.id when you connect Local View.",
542
243
  "#",
543
244
  "# All resources under postman/ are registered automatically.",
245
+ "# Route requests are generated from OpenAPI; Auth0 overlay is hand-authored.",
544
246
  ""
545
247
  ].join("\n")
546
248
  },
@@ -552,7 +254,6 @@ async function scaffold(workspace, options) {
552
254
  ]
553
255
  });
554
256
  if (options.postmanProvider === "api" && options.apiKey) {
555
- const collection = buildCollectionJson(projectName, auth0Env);
556
257
  const headers = {
557
258
  "X-Api-Key": options.apiKey,
558
259
  "Content-Type": "application/json"
@@ -615,4 +316,4 @@ const PostmanFeature = {
615
316
  scaffold
616
317
  };
617
318
 
618
- //# 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/IFwiXCIsIGVuYWJsZWQ6IHRydWUgfSxcblx0XHRcdFx0XHRdXG5cdFx0XHRcdDogW10pLFxuXHRcdF07XG5cdFx0Y29uc3QgZW52UmVzID0gYXdhaXQgZmV0Y2goXG5cdFx0XHRgaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vZW52aXJvbm1lbnRzP3dvcmtzcGFjZT0ke29wdGlvbnMud29ya3NwYWNlSWR9YCxcblx0XHRcdHtcblx0XHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdFx0aGVhZGVycyxcblx0XHRcdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoe1xuXHRcdFx0XHRcdGVudmlyb25tZW50OiB7IG5hbWU6IGVudk5hbWUsIHZhbHVlczogZW52VmFsdWVzIH0sXG5cdFx0XHRcdH0pLFxuXHRcdFx0fSxcblx0XHQpO1xuXHRcdGlmIChlbnZSZXMub2spIHtcblx0XHRcdGNvbnNvbGUubG9nKFwiICDinJMgUG9zdG1hbiBlbnZpcm9ubWVudCB1cGxvYWRlZFwiKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcIiAg4pyXIEZhaWxlZCB0byB1cGxvYWQgUG9zdG1hbiBlbnZpcm9ubWVudFwiKTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGNvbnN0IFBvc3RtYW5GZWF0dXJlOiBGZWF0dXJlPFBvc3RtYW5PcHRpb25zPiA9IHsgZ2V0T3B0aW9ucywgc2NhZmZvbGQgfTtcbmV4cG9ydCB7IFBPU1RNQU5fQ0FMTEJBQ0tTLCBQT1NUTUFOX1NDT1BFUyB9O1xuIl0sIm5hbWVzIjpbIlBPU1RNQU5fQ0FMTEJBQ0tTIiwiUE9TVE1BTl9TQ09QRVMiLCJQb3N0bWFuRmVhdHVyZSIsImpvaW4iLCJnZXRPcHRpb25zIiwiX3dvcmtzcGFjZSIsImNsaU9wdGlvbnMiLCJwb3N0bWFuUHJvdmlkZXIiLCJjaG9pY2VzIiwibGFiZWwiLCJkZXNjcmlwdGlvbiIsInNlbGVjdGVkIiwicGljayIsImMiLCJwcm92aWRlciIsImFwaUtleSIsInByb2Nlc3MiLCJlbnYiLCJQT1NUTUFOX0FQSV9LRVkiLCJ0aGVuIiwibSIsImFzayIsImhlYWRlcnMiLCJ3c1JlcyIsImZldGNoIiwib2siLCJjb25zb2xlIiwiZXJyb3IiLCJ3b3Jrc3BhY2VzIiwianNvbiIsIndzQ2hvaWNlcyIsImlkIiwibWFwIiwidyIsIm5hbWUiLCJ0eXBlIiwid3NQaWNrZWQiLCJ3b3Jrc3BhY2VJZCIsIndzTmFtZSIsImNyZWF0ZVJlcyIsIm1ldGhvZCIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5Iiwid29ya3NwYWNlIiwid3MiLCJsb2ciLCJidWlsZENvbGxlY3Rpb25Kc29uIiwicHJvamVjdE5hbWUiLCJhdXRoIiwiYXV0aE9iaiIsImF1dGgwRG9tYWluIiwib2F1dGgyIiwia2V5IiwidmFsdWUiLCJ1bmRlZmluZWQiLCJoZWxsb1VybCIsInBhdGgiLCJyYXciLCJob3N0Iiwic3BsaXQiLCJmaWx0ZXIiLCJCb29sZWFuIiwiaW5mbyIsIl9wb3N0bWFuX2lkIiwicmFuZG9tVVVJRCIsInNjaGVtYSIsIml0ZW0iLCJyZXF1ZXN0IiwidXJsIiwiaGVhZGVyIiwibW9kZSIsInlhbWxRdW90ZSIsInRlc3QiLCJpbmNsdWRlcyIsImJ1aWxkRW52aXJvbm1lbnRZYW1sIiwidmFsdWVzIiwicHVzaCIsImF1dGgwQXVkaWVuY2UiLCJhdXRoMENsaWVudElkIiwibGluZXMiLCJ2IiwiYnVpbGRMb2NhbFZpZXdGaWxlcyIsImNvbGxlY3Rpb25EaXIiLCJmaWxlcyIsImF1dGhCbG9jayIsImZpbGVQYXRoIiwiY29udGVudCIsImwiLCJyZXBsYWNlIiwicmVxdWVzdHMiLCJmaWxlIiwieWFtbCIsInIiLCJyZWFkRXhpc3RpbmdTcGFDbGllbnRJZCIsInRhcmdldERpciIsImVudlBhdGgiLCJleGlzdHNTeW5jIiwidGV4dCIsInJlYWRGaWxlU3luYyIsIm1hdGNoIiwidHJpbSIsImxlbmd0aCIsInJlc29sdmVTcGFDbGllbnRJZCIsImFwcE5hbWUiLCJhcHAiLCJhdXRoMENsaSIsImVuc3VyZVNwYUFwcCIsInJldXNlZCIsImNsaWVudF9pZCIsImVuYWJsZUNvbm5lY3Rpb25Gb3JDbGllbnQiLCJEQl9DT05ORUNUSU9OX05BTUUiLCJlcnIiLCJFcnJvciIsIm1lc3NhZ2UiLCJleGlzdGluZyIsInNjYWZmb2xkIiwib3B0aW9ucyIsImF1dGhDb25maWdNb2RlbCIsImdldE1vZGVsIiwiV0VMTF9LTk9XTl9GSUxFUyIsIkFVVEhfQ09ORklHIiwiYXV0aENmZyIsImNvbmZpZyIsInNwYUNsaWVudElkIiwiaXNzdWVyQmFzZVVybCIsImF1dGgwRW52IiwiYXVkaWVuY2UiLCJlbnZOYW1lIiwibG9jYWxGaWxlcyIsImVudllhbWwiLCJhZGRGaWxlIiwiY29sbGVjdGlvbiIsImNvbFJlcyIsImVudlZhbHVlcyIsImVuYWJsZWQiLCJlbnZSZXMiLCJlbnZpcm9ubWVudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7UUF5aEJTQTtlQUFBQTs7UUFBbUJDO2VBQUFBOztRQURmQztlQUFBQTs7OzRCQXhoQmM7d0JBQ2M7MEJBQ3BCO3dCQUNBO3VCQUNZO2tFQUlQOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFMUIscUVBQXFFLEdBQ3JFLE1BQU1GLG9CQUFvQjtJQUN6QjtJQUNBO0NBQ0E7QUFFRCw4RUFBOEUsR0FDOUUsTUFBTUMsaUJBQWlCO0lBQ3RCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0NBQ0EsQ0FBQ0UsSUFBSSxDQUFDO0FBUVAsZUFBZUMsV0FDZEMsVUFBNkIsRUFDN0JDLFVBQW1DO0lBRW5DLElBQUlBLFdBQVdDLGVBQWUsSUFBSSxNQUFNLE9BQU8sQ0FBQztJQUVoRCxNQUFNQyxVQUFVO1FBQ2Y7WUFBRUMsT0FBTztZQUFpQkMsYUFBYTtRQUFPO1FBQzlDO1lBQ0NELE9BQU87WUFDUEMsYUFBYTtRQUNkO1FBQ0E7WUFDQ0QsT0FBTztZQUNQQyxhQUFhO1FBQ2Q7S0FDQTtJQUNELE1BQU1DLFdBQVcsTUFBTUMsSUFBQUEsWUFBSSxFQUMxQixpQkFDQUosU0FDQSxDQUFDSyxJQUFNLEdBQUdBLEVBQUVKLEtBQUssQ0FBQyxHQUFHLEVBQUVJLEVBQUVILFdBQVcsRUFBRTtJQUV2QyxNQUFNSSxXQUFXSCxVQUFVRixTQUFTO0lBRXBDLElBQUlLLGFBQWEsUUFBUSxPQUFPO1FBQUVQLGlCQUFpQjtJQUFPO0lBQzFELElBQUlPLGFBQWEsU0FBUyxPQUFPO1FBQUVQLGlCQUFpQjtJQUFRO0lBRTVELE1BQU1RLFNBQ0xDLFFBQVFDLEdBQUcsQ0FBQ0MsZUFBZSxJQUMxQixNQUFNLG1FQUFBLFFBQU8s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
319
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL3Bvc3RtYW4uZmVhdHVyZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHBpY2sgfSBmcm9tIFwiLi4vLi4vZG9tYWluL3Byb21wdC5qc1wiO1xuaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlU2NhZmZvbGQgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3Byb2plY3QubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgRmVhdHVyZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zY2FmZm9sZC5zZXJ2aWNlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEF1dGhDb25maWdNb2RlbCB9IGZyb20gXCIuLi9tb2RlbHMvYXV0aC1jb25maWcubW9kZWwuanNcIjtcbmltcG9ydCB7IGJ1aWxkSGVsbG9PcGVuQXBpRG9jdW1lbnQgfSBmcm9tIFwiLi4vcG9zdG1hbi9oZWxsby1vcGVuYXBpLmpzXCI7XG5pbXBvcnQge1xuXHRidWlsZEVudmlyb25tZW50WWFtbCxcblx0YnVpbGRMb2NhbFZpZXdGaWxlc0Zyb21Db2xsZWN0aW9uLFxufSBmcm9tIFwiLi4vcG9zdG1hbi9sb2NhbC12aWV3LmpzXCI7XG5pbXBvcnQge1xuXHR0eXBlIEF1dGgwRW52LFxuXHRhcHBseVBvc3RtYW5BdXRoT3ZlcmxheSxcblx0b3BlbkFwaVRvUG9zdG1hbkNvbGxlY3Rpb24sXG59IGZyb20gXCIuLi9wb3N0bWFuL29wZW5hcGktdG8tcG9zdG1hbi5qc1wiO1xuaW1wb3J0ICogYXMgYXV0aDBDbGkgZnJvbSBcIi4vYXV0aDAtY2xpLmpzXCI7XG5cbi8qKiBQb3N0bWFuIE9BdXRoIGNhbGxiYWNrIFVSTHMgKHBvcHVwICsgXCJBdXRob3JpemUgdXNpbmcgYnJvd3NlclwiKS4gKi9cbmNvbnN0IFBPU1RNQU5fQ0FMTEJBQ0tTID0gW1xuXHRcImh0dHBzOi8vb2F1dGgucHN0bW4uaW8vdjEvY2FsbGJhY2tcIixcblx0XCJodHRwczovL29hdXRoLnBzdG1uLmlvL3YxL2Jyb3dzZXItY2FsbGJhY2tcIixcbl0gYXMgY29uc3Q7XG5cbi8qKiBTY29wZXMgcmVxdWVzdGVkIGZvciBBdXRoMCBhY2Nlc3MgdG9rZW5zIChPSURDICsgSGVsbG8gQ0FTTCBwZXJtaXNzaW9ucykuICovXG5jb25zdCBQT1NUTUFOX1NDT1BFUyA9IFtcblx0XCJvcGVuaWRcIixcblx0XCJwcm9maWxlXCIsXG5cdFwiZW1haWxcIixcblx0XCJyZWFkOkhlbGxvXCIsXG5cdFwiY3JlYXRlOkhlbGxvXCIsXG5cdFwidXBkYXRlOkhlbGxvXCIsXG5cdFwiZGVsZXRlOkhlbGxvXCIsXG5dLmpvaW4oXCIgXCIpO1xuXG5jb25zdCBDT0xMRUNUSU9OX0RFU0NSSVBUSU9OID1cblx0XCJPcGVuIHRoZSBwcm9qZWN0IHJvb3QgaW4gUG9zdG1hbiBMb2NhbCBWaWV3IChub3QgdGhlIHBvc3RtYW4vIGZvbGRlcikuIFwiICtcblx0XCJTZWxlY3QgdGhlIExvY2FsIGVudmlyb25tZW50LCB0aGVuIEF1dGhvcml6YXRpb24g4oaSIEdldCBOZXcgQWNjZXNzIFRva2VuIChQS0NFKS4gXCIgK1xuXHRcIlJvdXRlcyBhcmUgZ2VuZXJhdGVkIGZyb20gT3BlbkFQSTsgQXV0aDAgb3ZlcmxheSBpcyBoYW5kLWF1dGhvcmVkLlwiO1xuXG5leHBvcnQgdHlwZSBQb3N0bWFuT3B0aW9ucyA9IHtcblx0cG9zdG1hblByb3ZpZGVyPzogXCJhcGlcIiB8IFwibG9jYWxcIiB8IFwibm9uZVwiO1xuXHRhcGlLZXk/OiBzdHJpbmc7XG5cdHdvcmtzcGFjZUlkPzogc3RyaW5nO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0T3B0aW9ucyhcblx0X3dvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsXG5cdGNsaU9wdGlvbnM6IFBhcnRpYWw8UG9zdG1hbk9wdGlvbnM+LFxuKTogUHJvbWlzZTxQYXJ0aWFsPFBvc3RtYW5PcHRpb25zPj4ge1xuXHRpZiAoY2xpT3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgIT0gbnVsbCkgcmV0dXJuIHt9O1xuXG5cdGNvbnN0IGNob2ljZXMgPSBbXG5cdFx0eyBsYWJlbDogXCJub25lXCIgYXMgY29uc3QsIGRlc2NyaXB0aW9uOiBcInNraXBcIiB9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiBcImxvY2FsXCIgYXMgY29uc3QsXG5cdFx0XHRkZXNjcmlwdGlvbjogXCJMb2NhbCBWaWV3IC8gTmF0aXZlIEdpdCBmaWxlcyAobm8gQVBJIGtleSlcIixcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiBcImFwaVwiIGFzIGNvbnN0LFxuXHRcdFx0ZGVzY3JpcHRpb246IFwiYWxzbyB1cGxvYWQgdG8gUG9zdG1hbi5jb20gKG5lZWRzIEFQSSBrZXkpXCIsXG5cdFx0fSxcblx0XTtcblx0Y29uc3Qgc2VsZWN0ZWQgPSBhd2FpdCBwaWNrKFxuXHRcdFwiXFxuICBQb3N0bWFuOiBcIixcblx0XHRjaG9pY2VzLFxuXHRcdChjKSA9PiBgJHtjLmxhYmVsfSDigJQgJHtjLmRlc2NyaXB0aW9ufWAsXG5cdCk7XG5cdGNvbnN0IHByb3ZpZGVyID0gc2VsZWN0ZWQ/LmxhYmVsID8/IFwibm9uZVwiO1xuXG5cdGlmIChwcm92aWRlciA9PT0gXCJub25lXCIpIHJldHVybiB7IHBvc3RtYW5Qcm92aWRlcjogXCJub25lXCIgfTtcblx0aWYgKHByb3ZpZGVyID09PSBcImxvY2FsXCIpIHJldHVybiB7IHBvc3RtYW5Qcm92aWRlcjogXCJsb2NhbFwiIH07XG5cblx0Y29uc3QgYXBpS2V5ID1cblx0XHRwcm9jZXNzLmVudi5QT1NUTUFOX0FQSV9LRVkgPz9cblx0XHQoYXdhaXQgaW1wb3J0KFwiLi4vLi4vZG9tYWluL3Byb21wdC5qc1wiKS50aGVuKChtKSA9PlxuXHRcdFx0bS5hc2soXCJcXG4gIFBvc3RtYW4gQVBJIGtleSAoYXBwLmdldHBvc3RtYW4uY29tL3NldHRpbmdzL21lL2FwaS1rZXlzKTogXCIpLFxuXHRcdCkpO1xuXG5cdGNvbnN0IGhlYWRlcnMgPSB7IFwiWC1BcGktS2V5XCI6IGFwaUtleSwgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfTtcblx0Y29uc3Qgd3NSZXMgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vYXBpLmdldHBvc3RtYW4uY29tL3dvcmtzcGFjZXNcIiwgeyBoZWFkZXJzIH0pO1xuXG5cdGlmICghd3NSZXMub2spIHtcblx0XHRjb25zb2xlLmVycm9yKFwiXFxuICBQb3N0bWFuIEFQSSBrZXkgaW52YWxpZCDigJQgZmFsbGluZyBiYWNrIHRvIGxvY2FsIGZpbGVzLlwiKTtcblx0XHRyZXR1cm4geyBwb3N0bWFuUHJvdmlkZXI6IFwibG9jYWxcIiB9O1xuXHR9XG5cblx0Y29uc3QgeyB3b3Jrc3BhY2VzIH0gPSAoYXdhaXQgd3NSZXMuanNvbigpKSBhcyB7XG5cdFx0d29ya3NwYWNlczogQXJyYXk8eyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9Pjtcblx0fTtcblxuXHR0eXBlIFdzQ2hvaWNlID0geyBsYWJlbDogc3RyaW5nOyBpZDogc3RyaW5nIHwgbnVsbCB9O1xuXHRjb25zdCB3c0Nob2ljZXM6IFdzQ2hvaWNlW10gPSBbXG5cdFx0eyBsYWJlbDogXCI8bmV3IHdvcmtzcGFjZT5cIiwgaWQ6IG51bGwgfSxcblx0XHQuLi53b3Jrc3BhY2VzLm1hcCgodykgPT4gKHsgbGFiZWw6IGAke3cubmFtZX0gKCR7dy50eXBlfSlgLCBpZDogdy5pZCB9KSksXG5cdF07XG5cblx0Y29uc3Qgd3NQaWNrZWQgPSBhd2FpdCBwaWNrKFwiXFxuICBQb3N0bWFuIHdvcmtzcGFjZTogXCIsIHdzQ2hvaWNlcywgKGMpID0+IGMubGFiZWwpO1xuXG5cdGxldCB3b3Jrc3BhY2VJZDogc3RyaW5nO1xuXHRpZiAoIXdzUGlja2VkIHx8IHdzUGlja2VkLmlkID09PSBudWxsKSB7XG5cdFx0Y29uc3QgeyBhc2sgfSA9IGF3YWl0IGltcG9ydChcIi4uLy4uL2RvbWFpbi9wcm9tcHQuanNcIik7XG5cdFx0Y29uc3Qgd3NOYW1lID0gYXdhaXQgYXNrKGAgIFdvcmtzcGFjZSBuYW1lOiBgKTtcblx0XHRjb25zdCBjcmVhdGVSZXMgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vYXBpLmdldHBvc3RtYW4uY29tL3dvcmtzcGFjZXNcIiwge1xuXHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdGhlYWRlcnMsXG5cdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7IHdvcmtzcGFjZTogeyBuYW1lOiB3c05hbWUsIHR5cGU6IFwicGVyc29uYWxcIiB9IH0pLFxuXHRcdH0pO1xuXHRcdGNvbnN0IHsgd29ya3NwYWNlOiB3cyB9ID0gKGF3YWl0IGNyZWF0ZVJlcy5qc29uKCkpIGFzIHsgd29ya3NwYWNlOiB7IGlkOiBzdHJpbmcgfSB9O1xuXHRcdHdvcmtzcGFjZUlkID0gd3MuaWQ7XG5cdFx0Y29uc29sZS5sb2coYCAg4pyTIFdvcmtzcGFjZSBjcmVhdGVkOiAke3dzTmFtZX1gKTtcblx0fSBlbHNlIHtcblx0XHR3b3Jrc3BhY2VJZCA9IHdzUGlja2VkLmlkO1xuXHR9XG5cblx0cmV0dXJuIHsgcG9zdG1hblByb3ZpZGVyOiBcImFwaVwiLCBhcGlLZXksIHdvcmtzcGFjZUlkIH07XG59XG5cbi8qKiBCdWlsZCBQb3N0bWFuIGNvbGxlY3Rpb246IE9wZW5BUEkgcm91dGVzICsgQXV0aDAgYXV0aCBvdmVybGF5LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSHlicmlkUG9zdG1hbkNvbGxlY3Rpb24ocHJvamVjdE5hbWU6IHN0cmluZywgYXV0aD86IEF1dGgwRW52KSB7XG5cdGNvbnN0IG9wZW5hcGkgPSBidWlsZEhlbGxvT3BlbkFwaURvY3VtZW50KHByb2plY3ROYW1lKTtcblx0Y29uc3QgYmFzZSA9IGF3YWl0IG9wZW5BcGlUb1Bvc3RtYW5Db2xsZWN0aW9uKG9wZW5hcGkpO1xuXHRpZiAoYmFzZS5pbmZvLl9wb3N0bWFuX2lkID09IG51bGwpIHtcblx0XHRiYXNlLmluZm8uX3Bvc3RtYW5faWQgPSByYW5kb21VVUlEKCk7XG5cdH1cblx0cmV0dXJuIGFwcGx5UG9zdG1hbkF1dGhPdmVybGF5KGJhc2UsIHByb2plY3ROYW1lLCBhdXRoLCB7XG5cdFx0Y2FsbGJhY2tzOiBQT1NUTUFOX0NBTExCQUNLUyxcblx0XHRzY29wZXM6IFBPU1RNQU5fU0NPUEVTLFxuXHRcdGRlc2NyaXB0aW9uOiBDT0xMRUNUSU9OX0RFU0NSSVBUSU9OLFxuXHR9KTtcbn1cblxuLyoqIFJlYWQgYSBwcmV2aW91c2x5IHNjYWZmb2xkZWQgYXV0aDBDbGllbnRJZCBzbyByZS1zY2FmZm9sZCBuZXZlciBibGFua3MgaXQuICovXG5mdW5jdGlvbiByZWFkRXhpc3RpbmdTcGFDbGllbnRJZCh0YXJnZXREaXI6IHN0cmluZywgcHJvamVjdE5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGVudlBhdGggPSBqb2luKFxuXHRcdHRhcmdldERpcixcblx0XHRcInBvc3RtYW4vZW52aXJvbm1lbnRzXCIsXG5cdFx0YCR7cHJvamVjdE5hbWV9LUxvY2FsLmVudmlyb25tZW50LnlhbWxgLFxuXHQpO1xuXHRpZiAoIWV4aXN0c1N5bmMoZW52UGF0aCkpIHJldHVybiB1bmRlZmluZWQ7XG5cdGNvbnN0IHRleHQgPSByZWFkRmlsZVN5bmMoZW52UGF0aCwgXCJ1dGY4XCIpO1xuXHRjb25zdCBtYXRjaCA9IHRleHQubWF0Y2goL2tleTpcXHMqYXV0aDBDbGllbnRJZFxccypcXG5cXHMqdmFsdWU6XFxzKltcIiddPyhbXlwiJ1xcbl0rKS8pO1xuXHRjb25zdCB2YWx1ZSA9IG1hdGNoPy5bMV0/LnRyaW0oKTtcblx0cmV0dXJuIHZhbHVlICYmIHZhbHVlLmxlbmd0aCA+IDAgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBQb3N0bWFuIFNQQSBjbGllbnQgaWQuIE5ldmVyIHJldHVybnMgZW1wdHkg4oCUIHByZXNlcnZlcyBhbiBleGlzdGluZ1xuICogZW52IHZhbHVlIG9uIEF1dGgwIGZhaWx1cmUsIG90aGVyd2lzZSB0aHJvd3Mgc28gd2UgZG8gbm90IHdyaXRlIGEgYmxhbmsgZW52LlxuICovXG5mdW5jdGlvbiByZXNvbHZlU3BhQ2xpZW50SWQod29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCk6IHN0cmluZyB7XG5cdGNvbnN0IGFwcE5hbWUgPSBgJHt3b3Jrc3BhY2UubmFtZX0gUG9zdG1hbmA7XG5cdHRyeSB7XG5cdFx0Y29uc3QgYXBwID0gYXV0aDBDbGkuZW5zdXJlU3BhQXBwKGFwcE5hbWUsIFsuLi5QT1NUTUFOX0NBTExCQUNLU10pO1xuXHRcdGNvbnNvbGUubG9nKFxuXHRcdFx0YXBwLnJldXNlZFxuXHRcdFx0XHQ/IGAgIOKckyBSZXVzaW5nIEF1dGgwIFNQQSBhcHAgZm9yIFBvc3RtYW4gUEtDRSAoJHthcHAuY2xpZW50X2lkfSlgXG5cdFx0XHRcdDogYCAg4pyTIEF1dGgwIFNQQSBhcHAgY3JlYXRlZCBmb3IgUG9zdG1hbiBQS0NFICgke2FwcC5jbGllbnRfaWR9KWAsXG5cdFx0KTtcblx0XHR0cnkge1xuXHRcdFx0YXV0aDBDbGkuZW5hYmxlQ29ubmVjdGlvbkZvckNsaWVudChhdXRoMENsaS5EQl9DT05ORUNUSU9OX05BTUUsIGFwcC5jbGllbnRfaWQpO1xuXHRcdFx0Y29uc29sZS5sb2coYCAg4pyTIEVuYWJsZWQgJHthdXRoMENsaS5EQl9DT05ORUNUSU9OX05BTUV9IG9uIFBvc3RtYW4gU1BBYCk7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFxuXHRcdFx0XHRgICDinJcgRmFpbGVkIHRvIGVuYWJsZSBEQiBjb25uZWN0aW9uIG9uIFNQQTogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogZXJyfWAsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gYXBwLmNsaWVudF9pZDtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Y29uc3QgZXhpc3RpbmcgPSByZWFkRXhpc3RpbmdTcGFDbGllbnRJZCh3b3Jrc3BhY2UudGFyZ2V0RGlyLCB3b3Jrc3BhY2UubmFtZSk7XG5cdFx0aWYgKGV4aXN0aW5nKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFxuXHRcdFx0XHRgICDinJcgRmFpbGVkIHRvIGVuc3VyZSBBdXRoMCBTUEEgYXBwICgke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBlcnJ9KWAsXG5cdFx0XHQpO1xuXHRcdFx0Y29uc29sZS5sb2coYCAg4pyTIEtlZXBpbmcgZXhpc3RpbmcgYXV0aDBDbGllbnRJZCBmcm9tIFBvc3RtYW4gZW52aXJvbm1lbnQgKCR7ZXhpc3Rpbmd9KWApO1xuXHRcdFx0cmV0dXJuIGV4aXN0aW5nO1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRgRmFpbGVkIHRvIGVuc3VyZSBBdXRoMCBTUEEgYXBwIGZvciBQb3N0bWFuIOKAlCBhdXRoMENsaWVudElkIHdvdWxkIGJlIGVtcHR5OiAke1xuXHRcdFx0XHRlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogZXJyXG5cdFx0XHR9YCxcblx0XHQpO1xuXHR9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkKHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsIG9wdGlvbnM6IFBvc3RtYW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG5cdGlmIChvcHRpb25zLnBvc3RtYW5Qcm92aWRlciA9PT0gXCJub25lXCIgfHwgb3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgPT0gbnVsbCkgcmV0dXJuO1xuXG5cdGNvbnN0IGF1dGhDb25maWdNb2RlbCA9IHdvcmtzcGFjZS5nZXRNb2RlbDxBdXRoQ29uZmlnTW9kZWw+KFdFTExfS05PV05fRklMRVMuQVVUSF9DT05GSUcpO1xuXHRjb25zdCBhdXRoQ2ZnID0gYXV0aENvbmZpZ01vZGVsPy5jb25maWc7XG5cblx0Y29uc3Qgc3BhQ2xpZW50SWQgPSBhdXRoQ2ZnPy5pc3N1ZXJCYXNlVXJsID8gcmVzb2x2ZVNwYUNsaWVudElkKHdvcmtzcGFjZSkgOiB1bmRlZmluZWQ7XG5cblx0Y29uc3QgYXV0aDBFbnY6IEF1dGgwRW52IHwgdW5kZWZpbmVkID0gYXV0aENmZz8uaXNzdWVyQmFzZVVybFxuXHRcdD8ge1xuXHRcdFx0XHRhdXRoMERvbWFpbjogYXV0aENmZy5pc3N1ZXJCYXNlVXJsLnJlcGxhY2UoL15odHRwcz86XFwvXFwvLywgXCJcIiksXG5cdFx0XHRcdGF1dGgwQXVkaWVuY2U6IGF1dGhDZmcuYXVkaWVuY2UsXG5cdFx0XHRcdGF1dGgwQ2xpZW50SWQ6IHNwYUNsaWVudElkLFxuXHRcdFx0fVxuXHRcdDogdW5kZWZpbmVkO1xuXG5cdGNvbnN0IHByb2plY3ROYW1lID0gd29ya3NwYWNlLm5hbWU7XG5cdGNvbnN0IGVudk5hbWUgPSBgJHtwcm9qZWN0TmFtZX0gTG9jYWxgO1xuXHRjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgYnVpbGRIeWJyaWRQb3N0bWFuQ29sbGVjdGlvbihwcm9qZWN0TmFtZSwgYXV0aDBFbnYpO1xuXHRjb25zdCBsb2NhbEZpbGVzID0gYnVpbGRMb2NhbFZpZXdGaWxlc0Zyb21Db2xsZWN0aW9uKGNvbGxlY3Rpb24sIHByb2plY3ROYW1lLCBhdXRoMEVudiwge1xuXHRcdGNhbGxiYWNrczogUE9TVE1BTl9DQUxMQkFDS1MsXG5cdFx0c2NvcGVzOiBQT1NUTUFOX1NDT1BFUyxcblx0fSk7XG5cdGNvbnN0IGVudllhbWwgPSBidWlsZEVudmlyb25tZW50WWFtbChlbnZOYW1lLCBhdXRoMEVudiwge1xuXHRcdGNhbGxiYWNrczogUE9TVE1BTl9DQUxMQkFDS1MsXG5cdFx0c2NvcGVzOiBQT1NUTUFOX1NDT1BFUyxcblx0fSk7XG5cblx0d29ya3NwYWNlLmFkZEZpbGUoe1xuXHRcdGZpbGVzOiAoKSA9PiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcIi5wb3N0bWFuL3Jlc291cmNlcy55YW1sXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IFtcblx0XHRcdFx0XHRcIiMgT3BlbiB0aGlzIHByb2plY3Qgcm9vdCBpbiBQb3N0bWFuIChGaWxlcyDihpIgT3BlbiBmb2xkZXIpLCBub3QgdGhlIHBvc3RtYW4vIHN1YmZvbGRlci5cIixcblx0XHRcdFx0XHRcIiMgUG9zdG1hbiBmaWxscyB3b3Jrc3BhY2UuaWQgd2hlbiB5b3UgY29ubmVjdCBMb2NhbCBWaWV3LlwiLFxuXHRcdFx0XHRcdFwiI1wiLFxuXHRcdFx0XHRcdFwiIyBBbGwgcmVzb3VyY2VzIHVuZGVyIHBvc3RtYW4vIGFyZSByZWdpc3RlcmVkIGF1dG9tYXRpY2FsbHkuXCIsXG5cdFx0XHRcdFx0XCIjIFJvdXRlIHJlcXVlc3RzIGFyZSBnZW5lcmF0ZWQgZnJvbSBPcGVuQVBJOyBBdXRoMCBvdmVybGF5IGlzIGhhbmQtYXV0aG9yZWQuXCIsXG5cdFx0XHRcdFx0XCJcIixcblx0XHRcdFx0XS5qb2luKFwiXFxuXCIpLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IGBwb3N0bWFuL2Vudmlyb25tZW50cy8ke3Byb2plY3ROYW1lfS1Mb2NhbC5lbnZpcm9ubWVudC55YW1sYCxcblx0XHRcdFx0Y29udGVudDogZW52WWFtbCxcblx0XHRcdH0sXG5cdFx0XHQuLi5sb2NhbEZpbGVzLFxuXHRcdF0sXG5cdH0pO1xuXG5cdGlmIChvcHRpb25zLnBvc3RtYW5Qcm92aWRlciA9PT0gXCJhcGlcIiAmJiBvcHRpb25zLmFwaUtleSkge1xuXHRcdGNvbnN0IGhlYWRlcnMgPSB7IFwiWC1BcGktS2V5XCI6IG9wdGlvbnMuYXBpS2V5LCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9O1xuXG5cdFx0Y29uc3QgY29sUmVzID0gYXdhaXQgZmV0Y2goXG5cdFx0XHRgaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vY29sbGVjdGlvbnM/d29ya3NwYWNlPSR7b3B0aW9ucy53b3Jrc3BhY2VJZH1gLFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRoZWFkZXJzLFxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvbGxlY3Rpb24gfSksXG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0aWYgKGNvbFJlcy5vaykge1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBQb3N0bWFuIGNvbGxlY3Rpb24gdXBsb2FkZWRcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCIgIOKclyBGYWlsZWQgdG8gdXBsb2FkIFBvc3RtYW4gY29sbGVjdGlvblwiKTtcblx0XHR9XG5cblx0XHRjb25zdCBlbnZWYWx1ZXMgPSBbXG5cdFx0XHR7IGtleTogXCJiYXNlVXJsXCIsIHZhbHVlOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMFwiLCBlbmFibGVkOiB0cnVlIH0sXG5cdFx0XHQuLi4oYXV0aDBFbnY/LmF1dGgwRG9tYWluXG5cdFx0XHRcdD8gW1xuXHRcdFx0XHRcdFx0eyBrZXk6IFwiYXV0aDBEb21haW5cIiwgdmFsdWU6IGF1dGgwRW52LmF1dGgwRG9tYWluLCBlbmFibGVkOiB0cnVlIH0sXG5cdFx0XHRcdFx0XHR7IGtleTogXCJhdXRoMEF1ZGllbmNlXCIsIHZhbHVlOiBhdXRoMEVudi5hdXRoMEF1ZGllbmNlID8/IFwiXCIsIGVuYWJsZWQ6IHRydWUgfSxcblx0XHRcdFx0XHRcdHsga2V5OiBcImF1dGgwQ2xpZW50SWRcIiwgdmFsdWU6IGF1dGgwRW52LmF1dGgwQ2xpZW50SWQgPz8gXCJcIiwgZW5hYmxlZDogdHJ1ZSB9LFxuXHRcdFx0XHRcdF1cblx0XHRcdFx0OiBbXSksXG5cdFx0XTtcblx0XHRjb25zdCBlbnZSZXMgPSBhd2FpdCBmZXRjaChcblx0XHRcdGBodHRwczovL2FwaS5nZXRwb3N0bWFuLmNvbS9lbnZpcm9ubWVudHM/d29ya3NwYWNlPSR7b3B0aW9ucy53b3Jrc3BhY2VJZH1gLFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRoZWFkZXJzLFxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdFx0ZW52aXJvbm1lbnQ6IHsgbmFtZTogZW52TmFtZSwgdmFsdWVzOiBlbnZWYWx1ZXMgfSxcblx0XHRcdFx0fSksXG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0aWYgKGVudlJlcy5vaykge1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBQb3N0bWFuIGVudmlyb25tZW50IHVwbG9hZGVkXCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiICDinJcgRmFpbGVkIHRvIHVwbG9hZCBQb3N0bWFuIGVudmlyb25tZW50XCIpO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgY29uc3QgUG9zdG1hbkZlYXR1cmU6IEZlYXR1cmU8UG9zdG1hbk9wdGlvbnM+ID0geyBnZXRPcHRpb25zLCBzY2FmZm9sZCB9O1xuZXhwb3J0IHsgYnVpbGRIZWxsb09wZW5BcGlEb2N1bWVudCB9IGZyb20gXCIuLi9wb3N0bWFuL2hlbGxvLW9wZW5hcGkuanNcIjtcbmV4cG9ydCB7IFBPU1RNQU5fQ0FMTEJBQ0tTLCBQT1NUTUFOX1NDT1BFUyB9O1xuIl0sIm5hbWVzIjpbIlBPU1RNQU5fQ0FMTEJBQ0tTIiwiUE9TVE1BTl9TQ09QRVMiLCJQb3N0bWFuRmVhdHVyZSIsImJ1aWxkSGVsbG9PcGVuQXBpRG9jdW1lbnQiLCJidWlsZEh5YnJpZFBvc3RtYW5Db2xsZWN0aW9uIiwiam9pbiIsIkNPTExFQ1RJT05fREVTQ1JJUFRJT04iLCJnZXRPcHRpb25zIiwiX3dvcmtzcGFjZSIsImNsaU9wdGlvbnMiLCJwb3N0bWFuUHJvdmlkZXIiLCJjaG9pY2VzIiwibGFiZWwiLCJkZXNjcmlwdGlvbiIsInNlbGVjdGVkIiwicGljayIsImMiLCJwcm92aWRlciIsImFwaUtleSIsInByb2Nlc3MiLCJlbnYiLCJQT1NUTUFOX0FQSV9LRVkiLCJ0aGVuIiwibSIsImFzayIsImhlYWRlcnMiLCJ3c1JlcyIsImZldGNoIiwib2siLCJjb25zb2xlIiwiZXJyb3IiLCJ3b3Jrc3BhY2VzIiwianNvbiIsIndzQ2hvaWNlcyIsImlkIiwibWFwIiwidyIsIm5hbWUiLCJ0eXBlIiwid3NQaWNrZWQiLCJ3b3Jrc3BhY2VJZCIsIndzTmFtZSIsImNyZWF0ZVJlcyIsIm1ldGhvZCIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5Iiwid29ya3NwYWNlIiwid3MiLCJsb2ciLCJwcm9qZWN0TmFtZSIsImF1dGgiLCJvcGVuYXBpIiwiYmFzZSIsIm9wZW5BcGlUb1Bvc3RtYW5Db2xsZWN0aW9uIiwiaW5mbyIsIl9wb3N0bWFuX2lkIiwicmFuZG9tVVVJRCIsImFwcGx5UG9zdG1hbkF1dGhPdmVybGF5IiwiY2FsbGJhY2tzIiwic2NvcGVzIiwicmVhZEV4aXN0aW5nU3BhQ2xpZW50SWQiLCJ0YXJnZXREaXIiLCJlbnZQYXRoIiwiZXhpc3RzU3luYyIsInVuZGVmaW5lZCIsInRleHQiLCJyZWFkRmlsZVN5bmMiLCJtYXRjaCIsInZhbHVlIiwidHJpbSIsImxlbmd0aCIsInJlc29sdmVTcGFDbGllbnRJZCIsImFwcE5hbWUiLCJhcHAiLCJhdXRoMENsaSIsImVuc3VyZVNwYUFwcCIsInJldXNlZCIsImNsaWVudF9pZCIsImVuYWJsZUNvbm5lY3Rpb25Gb3JDbGllbnQiLCJEQl9DT05ORUNUSU9OX05BTUUiLCJlcnIiLCJFcnJvciIsIm1lc3NhZ2UiLCJleGlzdGluZyIsInNjYWZmb2xkIiwib3B0aW9ucyIsImF1dGhDb25maWdNb2RlbCIsImdldE1vZGVsIiwiV0VMTF9LTk9XTl9GSUxFUyIsIkFVVEhfQ09ORklHIiwiYXV0aENmZyIsImNvbmZpZyIsInNwYUNsaWVudElkIiwiaXNzdWVyQmFzZVVybCIsImF1dGgwRW52IiwiYXV0aDBEb21haW4iLCJyZXBsYWNlIiwiYXV0aDBBdWRpZW5jZSIsImF1ZGllbmNlIiwiYXV0aDBDbGllbnRJZCIsImVudk5hbWUiLCJjb2xsZWN0aW9uIiwibG9jYWxGaWxlcyIsImJ1aWxkTG9jYWxWaWV3RmlsZXNGcm9tQ29sbGVjdGlvbiIsImVudllhbWwiLCJidWlsZEVudmlyb25tZW50WWFtbCIsImFkZEZpbGUiLCJmaWxlcyIsImZpbGVQYXRoIiwiY29udGVudCIsImNvbFJlcyIsImVudlZhbHVlcyIsImtleSIsImVuYWJsZWQiLCJlbnZSZXMiLCJlbnZpcm9ubWVudCIsInZhbHVlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7UUEyUlNBO2VBQUFBOztRQUFtQkM7ZUFBQUE7O1FBRmZDO2VBQUFBOztRQUNKQztlQUFBQSx1Q0FBeUI7O1FBaktaQztlQUFBQTs7OzRCQXpISzt3QkFDYzswQkFDcEI7d0JBQ0E7dUJBQ1k7OEJBSVM7MkJBSW5DO2tDQUtBO2tFQUNtQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTFCLHFFQUFxRSxHQUNyRSxNQUFNSixvQkFBb0I7SUFDekI7SUFDQTtDQUNBO0FBRUQsOEVBQThFLEdBQzlFLE1BQU1DLGlCQUFpQjtJQUN0QjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtDQUNBLENBQUNJLElBQUksQ0FBQztBQUVQLE1BQU1DLHlCQUNMLDRFQUNBLHFGQUNBO0FBUUQsZUFBZUMsV0FDZEMsVUFBNkIsRUFDN0JDLFVBQW1DO0lBRW5DLElBQUlBLFdBQVdDLGVBQWUsSUFBSSxNQUFNLE9BQU8sQ0FBQztJQUVoRCxNQUFNQyxVQUFVO1FBQ2Y7WUFBRUMsT0FBTztZQUFpQkMsYUFBYTtRQUFPO1FBQzlDO1lBQ0NELE9BQU87WUFDUEMsYUFBYTtRQUNkO1FBQ0E7WUFDQ0QsT0FBTztZQUNQQyxhQUFhO1FBQ2Q7S0FDQTtJQUNELE1BQU1DLFdBQVcsTUFBTUMsSUFBQUEsWUFBSSxFQUMxQixpQkFDQUosU0FD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