@dollhousemcp/mcp-server 2.0.31 → 2.0.32

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.
@@ -183,6 +183,13 @@ Quick start examples:
183
183
  { operation: "create_element", element_type: "memory", params: { element_name: "session-notes", description: "Session context and notes" } }
184
184
  { operation: "addEntry", params: { element_name: "session-notes", content: "Remember this fact", tags: ["important"] } }
185
185
  { operation: "execute_agent", params: { element_name: "MyAgent", parameters: { objective: "Review code" } } }
186
+ { operation: "record_execution_step", params: { element_name: "MyAgent", stepDescription: "Reviewed auth module", outcome: "success", findings: "Found 2 issues" } }
187
+ { operation: "complete_execution", params: { element_name: "MyAgent", outcome: "success", summary: "Review complete" } }
188
+
189
+ Execution loop: call execute_agent once to start, then record_execution_step after
190
+ each work chunk, then complete_execution when done. Use continue_execution only to
191
+ resume a paused execution, and pass the same goal parameters you used for
192
+ execute_agent when resuming.
186
193
 
187
194
  Gatekeeper: Some operations may return a confirmation prompt instead of executing immediately. Use confirm_operation to approve, then retry.
188
195
 
@@ -249,6 +256,7 @@ Note: addEntry content supports markdown (headers, lists, bold, tables, code blo
249
256
 
250
257
  Execution lifecycle — record agent progress (appends step records, like addEntry):
251
258
  { operation: "record_execution_step", params: { element_name: "code-reviewer", stepDescription: "Analyzed files", outcome: "success", findings: "Found 3 issues" } }
259
+ This is the normal next lifecycle call after mcp_aql_execute { operation: "execute_agent", ... }.
252
260
  Response flow: record_execution_step returns { autonomy: { continue, factors, notifications? } }. Check autonomy.continue to decide whether to proceed. Check autonomy.notifications for permission_pending (gatekeeper blocks), autonomy_pause, or danger_zone alerts to relay to human operators.
253
261
 
254
262
  Import & portfolio:
@@ -330,6 +338,7 @@ Memory-specific search (filter by tags):
330
338
  Execution lifecycle — read-only queries:
331
339
  { operation: "get_execution_state", params: { element_name: "code-reviewer" } }
332
340
  { operation: "get_gathered_data", params: { element_name: "code-reviewer", goalId: "goal-id" } }
341
+ For execution-state reads, reuse the same element_name you passed to execute_agent. If element_name is missing, retry with the same agent name rather than inventing a new one.
333
342
 
334
343
  Collection:
335
344
  { operation: "browse_collection", params: { section: "personas" } }
@@ -484,8 +493,8 @@ Supported operations: ${getOperationsString('EXECUTE')}
484
493
 
485
494
  These operations manage runtime execution state. Unlike CRUD operations (which manage definitions), Execute operations handle the execution lifecycle:
486
495
  - execute_agent: Start a new execution (returns goalId and stateVersion for tracking)
487
- - complete_execution: Signal successful completion
488
- - continue_execution: Resume from saved state
496
+ - complete_execution: Signal successful completion once the goal is done
497
+ - continue_execution: Resume a previously paused execution with the same goal parameters
489
498
  - abort_execution: Abort a running execution, rejecting further operations
490
499
  - confirm_operation: Confirm a pending operation that requires user approval (Gatekeeper flow)
491
500
  - approve_cli_permission: Approve a pending CLI tool permission request
@@ -496,13 +505,20 @@ IMPORTANT: Execute operations are potentially destructive (agents can perform an
496
505
 
497
506
  ⚠️ SECURITY: Do not auto-allow this endpoint in your host settings (e.g., Claude Code settings.json). Each execution should require explicit human approval. Auto-allowing bypasses the per-operation confirmation gate. While DangerZone verification and element deny policies still provide protection, the primary human review checkpoint is lost.
498
507
 
499
- Response flow: execute_agent returns { goalId, stateVersion, activeElements, safetyTier, ... }. Use goalId with record_execution_step and complete_execution. stateVersion enables optimistic locking. record_execution_step returns { autonomy: { continue, notifications? } } — check notifications for gatekeeper blocks and danger zone alerts.
508
+ Canonical loop:
509
+ 1. Call execute_agent once to start the goal and receive { goalId, stateVersion, activeElements, safetyTier, ... }.
510
+ 2. After each chunk of work, use mcp_aql_create: { operation: "record_execution_step", ... }.
511
+ 3. Read record_execution_step.autonomy.continue and any autonomy.notifications to decide whether to continue, pause for a human, or handle a gatekeeper block.
512
+ 4. When the goal is finished, call complete_execution.
513
+ Use continue_execution only when an already-started goal was paused and you are resuming it with the same goal parameters. It is not the normal next call after execute_agent.
500
514
 
501
515
  Quick start examples:
502
516
  { operation: "execute_agent", params: { element_name: "code-reviewer", parameters: { objective: "Review code" } } }
517
+ Next lifecycle step — use mcp_aql_create:
518
+ { operation: "record_execution_step", params: { element_name: "code-reviewer", stepDescription: "Reviewed auth module", outcome: "success", findings: "Found 2 security issues" } }
503
519
  { operation: "complete_execution", params: { element_name: "code-reviewer", outcome: "success", summary: "Completed review" } }
504
520
  { operation: "abort_execution", params: { element_name: "data-collector", reason: "User requested cancellation" } }
505
- { operation: "continue_execution", params: { element_name: "code-reviewer" } }
521
+ { operation: "continue_execution", params: { element_name: "rubric-qa-agent", previousStepResult: "Verified citation set", parameters: { run_dir: "/app/run", deliverable_path: "/app/run/output.docx" } } }
506
522
  { operation: "confirm_operation", params: { operation: "execute_agent" } }
507
523
  { operation: "approve_cli_permission", params: { request_id: "req-123", decision: "allow" } }
508
524
  { operation: "prepare_handoff", params: { element_name: "code-reviewer" } }
@@ -530,4 +546,4 @@ Discover required parameters — use mcp_aql_read:
530
546
  }
531
547
  ];
532
548
  }
533
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTUNQQVFMVG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL3Rvb2xzL01DUEFRTFRvb2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4RUc7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDNUUsT0FBTyxFQUFFLHdCQUF3QixFQUFxQixNQUFNLDJDQUEyQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXRFLCtFQUErRTtBQUMvRSxpQ0FBaUM7QUFDakMsK0VBQStFO0FBRS9FOzs7R0FHRztBQUNILFNBQVMscUJBQXFCO0lBQzVCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsbUJBQW1CLENBQUMsUUFBc0I7SUFDakQsT0FBTyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxjQUFjO0FBQ2QsK0VBQStFO0FBRS9FOzs7R0FHRztBQUNILE1BQU0sb0JBQW9CLEdBQUc7SUFDM0IsSUFBSSxFQUFFLFFBQWlCO0lBQ3ZCLFVBQVUsRUFBRTtRQUNWLFNBQVMsRUFBRTtZQUNULElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUFFLDJCQUEyQjtTQUN6QztRQUNELFlBQVksRUFBRTtZQUNaLElBQUksRUFB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QUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNoRCxPQUFPO29CQUNMLE9BQU8sRUFBRTt3QkFDUDs0QkFDRSxJQUFJLEVBQUUsTUFBTTs0QkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzt5QkFDdEM7cUJBQ0Y7aUJBQ0YsQ0FBQztZQUNKLENBQUM7U0FDRjtRQUVELGlFQUFpRTtRQUNqRTtZQUNFLElBQUksRUFBRTtnQkFDSixJQUFJLEVBQUUsaUJBQWlCO2dCQUN2QixXQUFXLEVBQUU7O3dCQUVHLG1CQUFtQixDQUFDLFNBQVMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0ZBNkI4QjtnQkFDNUUsV0FBVyxFQUFFLG9CQUFvQjtnQkFDakMsV0FBVyxFQUFFO29CQUNYLFlBQVksRUFBRSxLQUFLO29CQUNuQixlQUFlLEVBQUUsSUFBSSxDQUFFLDBEQUEwRDtpQkFDbEY7YUFDRjtZQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBUyxFQUFFLEVBQUU7Z0JBQzNCLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDakQsT0FBTztvQkFDTCxPQUFPLEVBQUU7d0JBQ1A7NEJBQ0UsSUFBSSxFQUFFLE1BQU07NEJBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7eUJBQ3RDO3FCQUNGO2lCQUNGLENBQUM7WUFDSixDQUFDO1NBQ0Y7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTUNQLUFRTCBUb29scyAtIFVuaWZpZWQgcXVlcnkgaW50ZXJmYWNlIGZvciBBSSBhZ2VudHNcbiAqXG4gKiBQcm92aWRlcyB0d28gZW5kcG9pbnQgbW9kZXMgY29uZmlndXJhYmxlIHZpYSBNQ1BfQVFMX0VORFBPSU5UX01PREUgZW52aXJvbm1lbnQgdmFyaWFibGU6XG4gKlxuICogIyMgTW9kZSAxOiBDUlVERSBFbmRwb2ludHMgKERlZmF1bHQpIC0gTUNQX0FRTF9FTkRQT0lOVF9NT0RFPWNydWRlXG4gKiA1IHRvb2xzOiBtY3BfYXFsX2NyZWF0ZSwgbWNwX2FxbF9yZWFkLCBtY3BfYXFsX3VwZGF0ZSwgbWNwX2FxbF9kZWxldGUsIG1jcF9hcWxfZXhlY3V0ZSAofjQsMzAwIHRva2VucylcbiAqXG4gKiAjIyBNb2RlIDI6IFNpbmdsZSBFbmRwb2ludCAoTWluaW1hbCkgLSBNQ1BfQVFMX0VORFBPSU5UX01PREU9c2luZ2xlXG4gKiAxIHRvb2w6IG1jcF9hcWwgKH4zNTAgdG9rZW5zKVxuICogSWRlYWwgZm9yIG11bHRpLXNlcnZlciBkZXBsb3ltZW50cyB3aGVyZSB0b2tlbiBidWRnZXQgaXMgY29uc3RyYWluZWQuXG4gKlxuICogTm90ZTogVGhlc2UgdG9vbHMgYXJlIG9ubHkgcmVnaXN0ZXJlZCB3aGVuIE1DUF9JTlRFUkZBQ0VfTU9ERT1tY3BhcWwgKGRlZmF1bHQpLlxuICogV2hlbiBNQ1BfSU5URVJGQUNFX01PREU9ZGlzY3JldGUsIGRpc2NyZXRlIHRvb2xzIGFyZSByZWdpc3RlcmVkIGluc3RlYWQuXG4gKlxuICogIyMgV2h5IDUgQ1JVREUgRW5kcG9pbnRzPyAoRGVmYXVsdCBNb2RlKVxuICpcbiAqIFRoZSA1LWVuZHBvaW50IENSVURFIHBhdHRlcm4gKENyZWF0ZSwgUmVhZCwgVXBkYXRlLCBEZWxldGUsIEV4ZWN1dGUpIHdhcyBjaG9zZW4gZm9yOlxuICpcbiAqIDEuICoqVXNlciBDb21wcmVoZW5zaW9uKio6IENSVURFIGV4dGVuZHMgQ1JVRCB3aXRoIEV4ZWN1dGUgZm9yIG5vbi1pZGVtcG90ZW50XG4gKiAgICBvcGVyYXRpb25zLCBtYWtpbmcgaXQgZWFzeSBmb3IgdXNlcnMgdG8gcmVhc29uIGFib3V0IHdoYXQgZWFjaCBlbmRwb2ludCBjYW4gZG8uXG4gKlxuICogMi4gKipQbGF0Zm9ybSBBbm5vdGF0aW9ucyoqOiBNQ1AgcGxhdGZvcm1zIGxpa2UgQ2hhdEdQVCdzIGFwcHMgcmVxdWlyZVxuICogICAgdG9vbCBhbm5vdGF0aW9ucyB0aGF0IGRlc2NyaWJlIHNhZmV0eSBhbmQgZGVzdHJ1Y3RpdmVuZXNzLiBUaGUgNS1lbmRwb2ludFxuICogICAgc3BsaXQgbWFwcyBkaXJlY3RseSB0byBkaXN0aW5jdCBwZXJtaXNzaW9uIGxldmVsczpcbiAqICAgIC0gQ1JFQVRFOiBhZGRpdGl2ZSwgbm9uLWRlc3RydWN0aXZlIChyZWFkT25seUhpbnQ6IGZhbHNlLCBkZXN0cnVjdGl2ZUhpbnQ6IGZhbHNlKVxuICogICAgLSBSRUFEOiBzYWZlLCByZWFkLW9ubHkgKHJlYWRPbmx5SGludDogdHJ1ZSwgZGVzdHJ1Y3RpdmVIaW50OiBmYWxzZSlcbiAqICAgIC0gVVBEQVRFOiBtb2RpZnlpbmcsIHBvdGVudGlhbGx5IGRlc3RydWN0aXZlIChyZWFkT25seUhpbnQ6IGZhbHNlLCBkZXN0cnVjdGl2ZUhpbnQ6IHRydWUpXG4gKiAgICAtIERFTEVURTogZGVzdHJ1Y3RpdmUgKHJlYWRPbmx5SGludDogZmFsc2UsIGRlc3RydWN0aXZlSGludDogdHJ1ZSlcbiAqICAgIC0gRVhFQ1VURTogbm9uLWlkZW1wb3RlbnQsIHBvdGVudGlhbGx5IGRlc3RydWN0aXZlIChyZWFkT25seUhpbnQ6IGZhbHNlLCBkZXN0cnVjdGl2ZUhpbnQ6IHRydWUpXG4gKlxuICogMy4gKipHcmFudWxhciBQZXJtaXNzaW9uIENvbnRyb2wqKjogVXNlcnMgY2FuIGdyYW50IFJFQUQgZW5kcG9pbnQgZnVsbCBhY2Nlc3NcbiAqICAgIHdoaWxlIGxvY2tpbmcgZG93biBDUkVBVEUsIFVQREFURSwgREVMRVRFLCBhbmQgRVhFQ1VURS4gVGhpcyBlbmFibGVzIHNhZmVcbiAqICAgIHJlYWQtb25seSBpbnRlZ3JhdGlvbnMgd2l0aG91dCBleHBvc2luZyBtdXRhdGlvbiBjYXBhYmlsaXRpZXMuXG4gKlxuICogIyMgV2h5IFNpbmdsZSBFbmRwb2ludD8gKE1pbmltYWwgTW9kZSlcbiAqXG4gKiBUaGUgc2luZ2xlLWVuZHBvaW50IG1vZGUgd2FzIGFkZGVkIGZvcjpcbiAqXG4gKiAxLiAqKlRva2VuIEVmZmljaWVuY3kqKjogfjM1MCB0b2tlbnMgdnMgfjQsMzAwIHRva2VucyAoOTIlIHJlZHVjdGlvbilcbiAqIDIuICoqTXVsdGktU2VydmVyIERlcGxveW1lbnRzKio6IFdoZW4gcnVubmluZyBtdWx0aXBsZSBNQ1Agc2VydmVycywgdG9rZW5cbiAqICAgIGJ1ZGdldHMgY2FuIGJlIGNvbnN0cmFpbmVkLiBTaW5nbGUgZW5kcG9pbnQgcmVkdWNlcyBvdmVyaGVhZC5cbiAqIDMuICoqU2ltcGxpZmllZCBJbnRlZ3JhdGlvbioqOiBTb21lIGNsaWVudHMgcHJlZmVyIGEgc2luZ2xlIGVudHJ5IHBvaW50LlxuICpcbiAqIFNlY3VyaXR5IGlzIG1haW50YWluZWQgdGhyb3VnaCBzZXJ2ZXItc2lkZSBHYXRla2VlcGVyIGVuZm9yY2VtZW50IC0gdGhlXG4gKiBzZXJ2ZXIgZGV0ZXJtaW5lcyB3aGljaCBvcGVyYXRpb24gdHlwZSBpcyBiZWluZyBleGVjdXRlZCBhbmQgYXBwbGllc1xuICogYXBwcm9wcmlhdGUgcGVybWlzc2lvbiBjaGVja3MuXG4gKlxuICogIyMgR3JhcGhRTC1TdHlsZSBJbnRyb3NwZWN0aW9uXG4gKlxuICogTUNQLUFRTCBmb2xsb3dzIEdyYXBoUUwgcGF0dGVybnMgZm9yIHNlbGYtZG9jdW1lbnRhdGlvbi4gVG9vbCBkZXNjcmlwdGlvbnNcbiAqIGFyZSBnZW5lcmF0ZWQgZHluYW1pY2FsbHkgZnJvbSBPUEVSQVRJT05fUk9VVEVTLCBlbnN1cmluZyB0aGV5IGFsd2F5cyByZWZsZWN0XG4gKiB0aGUgY3VycmVudCBhdmFpbGFibGUgb3BlcmF0aW9ucy5cbiAqXG4gKiAjIyMgSW50cm9zcGVjdGlvbiBFeGFtcGxlc1xuICpcbiAqIExpc3QgYWxsIGF2YWlsYWJsZSBvcGVyYXRpb25zOlxuICogYGBganNvblxuICogeyBcIm9wZXJhdGlvblwiOiBcImludHJvc3BlY3RcIiwgXCJwYXJhbXNcIjogeyBcInF1ZXJ5XCI6IFwib3BlcmF0aW9uc1wiIH0gfVxuICogYGBgXG4gKlxuICogR2V0IGRldGFpbHMgZm9yIGEgc3BlY2lmaWMgb3BlcmF0aW9uIChwYXJhbWV0ZXJzLCBleGFtcGxlcywgcmV0dXJuIHR5cGVzKTpcbiAqIGBgYGpzb25cbiAqIHsgXCJvcGVyYXRpb25cIjogXCJpbnRyb3NwZWN0XCIsIFwicGFyYW1zXCI6IHsgXCJxdWVyeVwiOiBcIm9wZXJhdGlvbnNcIiwgXCJuYW1lXCI6IFwiY3JlYXRlX2VsZW1lbnRcIiB9IH1cbiAqIGBgYFxuICpcbiAqIERpc2NvdmVyIGF2YWlsYWJsZSB0eXBlcyAoZS5nLiwgRWxlbWVudFR5cGUgZW51bSB2YWx1ZXMpOlxuICogYGBganNvblxuICogeyBcIm9wZXJhdGlvblwiOiBcImludHJvc3BlY3RcIiwgXCJwYXJhbXNcIjogeyBcInF1ZXJ5XCI6IFwidHlwZXNcIiwgXCJuYW1lXCI6IFwiRWxlbWVudFR5cGVcIiB9IH1cbiAqIGBgYFxuICpcbiAqICMjIyBEZXNpZ24gUGhpbG9zb3BoeVxuICpcbiAqIC0gKipTaW5nbGUgc291cmNlIG9mIHRydXRoKio6IE9QRVJBVElPTl9ST1VURVMgZGVmaW5lcyBhbGwgb3BlcmF0aW9uc1xuICogLSAqKkR5bmFtaWMgZGVzY3JpcHRpb25zKio6IEFkZGluZyBhbiBvcGVyYXRpb24gdG8gT1BFUkFUSU9OX1JPVVRFUyBhdXRvbWF0aWNhbGx5XG4gKiAgIHVwZGF0ZXMgdG9vbCBkZXNjcmlwdGlvbnMgLSBubyBtYW51YWwgc3luY2hyb25pemF0aW9uIG5lZWRlZFxuICogLSAqKkludHJvc3BlY3Rpb24tZmlyc3QqKjogTExNcyBkaXNjb3ZlciBwYXJhbWV0ZXJzIHZpYSBpbnRyb3NwZWN0LCBub3Qgc3RhdGljIGRvY3NcbiAqIC0gKipHcmFwaFFMIGhlcml0YWdlKio6IFBhdHRlcm5zIGZhbWlsaWFyIHRvIGFueSBMTE0gdHJhaW5lZCBvbiBHcmFwaFFMXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBNQ1BBUUxIYW5kbGVyIH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9NQ1BBUUxIYW5kbGVyLmpzJztcbmltcG9ydCB7IFVuaWZpZWRFbmRwb2ludCB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL21jcC1hcWwvVW5pZmllZEVuZHBvaW50LmpzJztcbmltcG9ydCB7IGdldE9wZXJhdGlvbnNGb3JFbmRwb2ludCwgdHlwZSBDUlVERW5kcG9pbnQgfSBmcm9tICcuLi8uLi9oYW5kbGVycy9tY3AtYXFsL09wZXJhdGlvblJvdXRlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL21jcC1hcWwvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBUb29sRGVmaW5pdGlvbiwgVG9vbEhhbmRsZXIgfSBmcm9tICcuLi8uLi9oYW5kbGVycy90eXBlcy9Ub29sVHlwZXMuanMnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vLi4vY29uZmlnL2Vudi5qcyc7XG5pbXBvcnQgeyBFTEVNRU5UX1JPTEVTIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvZW5zZW1ibGVzL2NvbnN0YW50cy5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIER5bmFtaWMgRGVzY3JpcHRpb24gR2VuZXJhdGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEdldCBlbGVtZW50IHR5cGVzIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy5cbiAqIERlcml2ZWQgZnJvbSB0aGUgRWxlbWVudFR5cGUgZW51bSB0byBlbnN1cmUgY29uc2lzdGVuY3kuXG4gKi9cbmZ1bmN0aW9uIGdldEVsZW1lbnRUeXBlc1N0cmluZygpOiBzdHJpbmcge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkuam9pbignLCAnKTtcbn1cblxuLyoqXG4gKiBHZXQgb3BlcmF0aW9ucyBmb3IgYW4gZW5kcG9pbnQgYXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLlxuICogRGVyaXZlZCBmcm9tIE9QRVJBVElPTl9ST1VURVMgdG8gZW5zdXJlIGNvbnNpc3RlbmN5LlxuICovXG5mdW5jdGlvbiBnZXRPcGVyYXRpb25zU3RyaW5nKGVuZHBvaW50OiBDUlVERW5kcG9pbnQpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0T3BlcmF0aW9uc0ZvckVuZHBvaW50KGVuZHBvaW50KS5qb2luKCcsICcpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUb29sIFNjaGVtYVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFNoYXJlZCBpbnB1dCBzY2hlbWEgZm9yIENSVUQgb3BlcmF0aW9ucyAoY3JlYXRlLCByZWFkLCB1cGRhdGUsIGRlbGV0ZSlcbiAqIEFsbCBvcGVyYXRpb25zIHVzZSB0aGUgT3BlcmF0aW9uSW5wdXQgc3RydWN0dXJlIGZyb20gdGhlIEdyYXBoUUwgc2NoZW1hXG4gKi9cbmNvbnN0IG9wZXJhdGlvbklucHV0U2NoZW1hID0ge1xuICB0eXBlOiBcIm9iamVjdFwiIGFzIGNvbnN0LFxuICBwcm9wZXJ0aWVzOiB7XG4gICAgb3BlcmF0aW9uOiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiT3BlcmF0aW9uIG5hbWUgdG8gZXhlY3V0ZVwiXG4gICAgfSxcbiAgICBlbGVtZW50X3R5cGU6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUYXJnZXQgZWxlbWVudCB0eXBlIChvcHRpb25hbClcIlxuICAgIH0sXG4gICAgcGFyYW1zOiB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiT3BlcmF0aW9uIHBhcmFtZXRlcnNcIlxuICAgIH0sXG4gICAgb3BlcmF0aW9uczoge1xuICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiQXJyYXkgb2Ygb3BlcmF0aW9ucyBmb3IgYmF0Y2ggZXhlY3V0aW9uXCIsXG4gICAgICBpdGVtczoge1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgb3BlcmF0aW9uOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICBlbGVtZW50X3R5cGU6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgIHBhcmFtczogeyB0eXBlOiBcIm9iamVjdFwiIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWlyZWQ6IFtcIm9wZXJhdGlvblwiXVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgcmVxdWlyZWQ6IFtcIm9wZXJhdGlvblwiIGFzIGNvbnN0XVxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVG9vbCBSZWdpc3RyYXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBHZXQgTUNQLUFRTCB0b29scyBmb3IgcmVnaXN0cmF0aW9uIGluIHRoZSBUb29sUmVnaXN0cnkuXG4gKlxuICogUmV0dXJucyBkaWZmZXJlbnQgdG9vbHMgYmFzZWQgb24gTUNQX0FRTF9FTkRQT0lOVF9NT0RFIGVudmlyb25tZW50IHZhcmlhYmxlOlxuICogLSAnY3J1ZGUnIChkZWZhdWx0KTogNSBDUlVERSBlbmRwb2ludHMgKENyZWF0ZSwgUmVhZCwgVXBkYXRlLCBEZWxldGUsIEV4ZWN1dGUpICh+NCwzMDAgdG9rZW5zKVxuICogLSAnc2luZ2xlJzogMSB1bmlmaWVkIGVuZHBvaW50ICh+MzUwIHRva2VucylcbiAqXG4gKiBOb3RlOiBNQ1BfQVFMX01PREUgaXMgc3VwcG9ydGVkIGFzIGEgZGVwcmVjYXRlZCBhbGlhcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1DUEFRTFRvb2xzKGhhbmRsZXI6IE1DUEFRTEhhbmRsZXIpOiBBcnJheTx7IHRvb2w6IFRvb2xEZWZpbml0aW9uOyBoYW5kbGVyOiBUb29sSGFuZGxlciB9PiB7XG4gIC8vIFVzZSBNQ1BfQVFMX0VORFBPSU5UX01PREUsIGZhbGxpbmcgYmFjayB0byBkZXByZWNhdGVkIE1DUF9BUUxfTU9ERSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICBjb25zdCBtb2RlID0gZW52Lk1DUF9BUUxfRU5EUE9JTlRfTU9ERSA/PyBlbnYuTUNQX0FRTF9NT0RFID8/ICdjcnVkZSc7XG5cbiAgaWYgKG1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgcmV0dXJuIGdldFVuaWZpZWRUb29scyhoYW5kbGVyKTtcbiAgfVxuXG4gIC8vIERlZmF1bHQ6IENSVURFIG1vZGUgKDUgZW5kcG9pbnRzKVxuICByZXR1cm4gZ2V0Q1JVREVUb29scyhoYW5kbGVyKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHVuaWZpZWQgc2luZ2xlIGVuZHBvaW50IHRvb2wgKE1DUF9BUUxfTU9ERT1zaW5nbGUpXG4gKiBUb2tlbiBmb290cHJpbnQ6IH4zMDAtNDAwIHRva2Vuc1xuICovXG5mdW5jdGlvbiBnZXRVbmlmaWVkVG9vbHMoaGFuZGxlcjogTUNQQVFMSGFuZGxlcik6IEFycmF5PHsgdG9vbDogVG9vbERlZmluaXRpb247IGhhbmRsZXI6IFRvb2xIYW5kbGVyIH0+IHtcbiAgY29uc3QgdW5pZmllZEVuZHBvaW50ID0gbmV3IFVuaWZpZWRFbmRwb2ludChoYW5kbGVyKTtcblxuICAvLyBCdWlsZCBkeW5hbWljIGRlc2NyaXB0aW9uIGZyb20gT1BFUkFUSU9OX1JPVVRFU1xuICBjb25zdCBkZXNjcmlwdGlvbiA9IGBEb2xsaG91c2VNQ1AgdW5pZmllZCBBUEkgLSBHcmFwaFFMLXN0eWxlIHF1ZXJ5IGludGVyZmFjZSBmb3IgQUkgZWxlbWVudCBtYW5hZ2VtZW50LlxuXG5DUlVERSBPcGVyYXRpb25zOlxuLSBDUkVBVEU6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnQ1JFQVRFJyl9XG4tIFJFQUQ6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnUkVBRCcpfVxuLSBVUERBVEU6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnVVBEQVRFJyl9XG4tIERFTEVURTogJHtnZXRPcGVyYXRpb25zU3RyaW5nKCdERUxFVEUnKX1cbi0gRVhFQ1VURTogJHtnZXRPcGVyYXRpb25zU3RyaW5nKCdFWEVDVVRFJyl9XG5cbkVsZW1lbnQgdHlwZXM6ICR7Z2V0RWxlbWVudFR5cGVzU3RyaW5nKCl9XG5cblF1aWNrIHN0YXJ0IGV4YW1wbGVzOlxueyBvcGVyYXRpb246IFwibGlzdF9lbGVtZW50c1wiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiIH1cbnsgb3BlcmF0aW9uOiBcImNyZWF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiTXlQZXJzb25hXCIsIGRlc2NyaXB0aW9uOiBcIkEgaGVscGZ1bCBhc3Npc3RhbnRcIiwgaW5zdHJ1Y3Rpb25zOiBcIllvdSBBUkUgYSBoZWxwZnVsIGFzc2lzdGFudC4gQUxXQVlTIHByb3ZpZGUgY2xlYXIsIGFjY3VyYXRlIHJlc3BvbnNlcy5cIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNyZWF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJhZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIk15QWdlbnRcIiwgZGVzY3JpcHRpb246IFwiVGFzayBleGVjdXRvclwiLCBpbnN0cnVjdGlvbnM6IFwiRXhlY3V0ZSBnb2FscyBtZXRob2RpY2FsbHkuIFJlcG9ydCBwcm9ncmVzcyBhdCBlYWNoIHN0ZXAuXCIsIGdvYWw6IHsgdGVtcGxhdGU6IFwiQ29tcGxldGU6IHtvYmplY3RpdmV9XCIsIHBhcmFtZXRlcnM6IFt7IG5hbWU6IFwib2JqZWN0aXZlXCIsIHR5cGU6IFwic3RyaW5nXCIsIHJlcXVpcmVkOiB0cnVlIH1dIH0gfSB9XG57IG9wZXJhdGlvbjogXCJjcmVhdGVfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwibWVtb3J5XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwic2Vzc2lvbi1ub3Rlc1wiLCBkZXNjcmlwdGlvbjogXCJTZXNzaW9uIGNvbnRleHQgYW5kIG5vdGVzXCIgfSB9XG57IG9wZXJhdGlvbjogXCJhZGRFbnRyeVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcInNlc3Npb24tbm90ZXNcIiwgY29udGVudDogXCJSZW1lbWJlciB0aGlzIGZhY3RcIiwgdGFnczogW1wiaW1wb3J0YW50XCJdIH0gfVxueyBvcGVyYXRpb246IFwiZXhlY3V0ZV9hZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIk15QWdlbnRcIiwgcGFyYW1ldGVyczogeyBvYmplY3RpdmU6IFwiUmV2aWV3IGNvZGVcIiB9IH0gfVxuXG5HYXRla2VlcGVyOiBTb21lIG9wZXJhdGlvbnMgbWF5IHJldHVybiBhIGNvbmZpcm1hdGlvbiBwcm9tcHQgaW5zdGVhZCBvZiBleGVjdXRpbmcgaW1tZWRpYXRlbHkuIFVzZSBjb25maXJtX29wZXJhdGlvbiB0byBhcHByb3ZlLCB0aGVuIHJldHJ5LlxuXG5EaXNjb3ZlciBhbGwgb3BlcmF0aW9uczpcbnsgb3BlcmF0aW9uOiBcImludHJvc3BlY3RcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcIm9wZXJhdGlvbnNcIiB9IH1gO1xuXG4gIHJldHVybiBbXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcIm1jcF9hcWxcIixcbiAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIGlucHV0U2NoZW1hOiBvcGVyYXRpb25JbnB1dFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICAvLyBVbmlmaWVkIGVuZHBvaW50IGNhbiBwZXJmb3JtIGFueSBvcGVyYXRpb24sIHNvIHdlIHVzZSBjb25zZXJ2YXRpdmUgaGludHNcbiAgICAgICAgICAvLyBUaGUgYWN0dWFsIG9wZXJhdGlvbidzIHNhZmV0eSBpcyBlbmZvcmNlZCBzZXJ2ZXItc2lkZSBieSBHYXRla2VlcGVyXG4gICAgICAgICAgcmVhZE9ubHlIaW50OiBmYWxzZSxcbiAgICAgICAgICBkZXN0cnVjdGl2ZUhpbnQ6IHRydWUgLy8gQ29uc2VydmF0aXZlOiBzb21lIG9wZXJhdGlvbnMgYXJlIGRlc3RydWN0aXZlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiBhc3luYyAoYXJnczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHVuaWZpZWRFbmRwb2ludC5oYW5kbGUoYXJncyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIF07XG59XG5cbi8qKlxuICogR2V0IHRoZSA1IENSVURFIGVuZHBvaW50IHRvb2xzIChNQ1BfQVFMX0VORFBPSU5UX01PREU9Y3J1ZGUsIGRlZmF1bHQpXG4gKiBDUlVERSA9IENyZWF0ZSwgUmVhZCwgVXBkYXRlLCBEZWxldGUsIEV4ZWN1dGVcbiAqIFRva2VuIGZvb3RwcmludDogfjQsMzAwIHRva2VucyAobWVhc3VyZWQgdmlhIENsYXVkZSBDb2RlIC9jb250ZXh0KVxuICpcbiAqIERlc2NyaXB0aW9ucyBhcmUgZ2VuZXJhdGVkIGR5bmFtaWNhbGx5IGZyb20gT1BFUkFUSU9OX1JPVVRFUyB0byBlbnN1cmVcbiAqIHRoZXkgYWx3YXlzIHJlZmxlY3QgdGhlIGN1cnJlbnQgYXZhaWxhYmxlIG9wZXJhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGdldENSVURFVG9vbHMoaGFuZGxlcjogTUNQQVFMSGFuZGxlcik6IEFycmF5PHsgdG9vbDogVG9vbERlZmluaXRpb247IGhhbmRsZXI6IFRvb2xIYW5kbGVyIH0+IHtcbiAgY29uc3QgZWxlbWVudFR5cGVzID0gZ2V0RWxlbWVudFR5cGVzU3RyaW5nKCk7XG5cbiAgcmV0dXJuIFtcbiAgICAvLyBtY3BfYXFsX2NyZWF0ZSAtIEFkZGl0aXZlLCBub24tZGVzdHJ1Y3RpdmUgb3BlcmF0aW9uc1xuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJtY3BfYXFsX2NyZWF0ZVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogYEFkZGl0aXZlLCBub24tZGVzdHJ1Y3RpdmUgb3BlcmF0aW9ucy5cblxuU3VwcG9ydGVkIG9wZXJhdGlvbnM6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnQ1JFQVRFJyl9XG5cbkVsZW1lbnQgdHlwZXM6ICR7ZWxlbWVudFR5cGVzfVxuXG5UaGVzZSBvcGVyYXRpb25zIGFkZCBuZXcgZGF0YSB3aXRob3V0IHJlbW92aW5nIG9yIG92ZXJ3cml0aW5nIGV4aXN0aW5nIGNvbnRlbnQuXG5cblF1aWNrIHN0YXJ0IGV4YW1wbGVzOlxueyBvcGVyYXRpb246IFwiY3JlYXRlX2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJNeVBlcnNvbmFcIiwgZGVzY3JpcHRpb246IFwiQSBoZWxwZnVsIGFzc2lzdGFudFwiLCBpbnN0cnVjdGlvbnM6IFwiWW91IEFSRSBhIGhlbHBmdWwgYXNzaXN0YW50LiBBTFdBWVMgcHJvdmlkZSBjbGVhciwgYWNjdXJhdGUgcmVzcG9uc2VzLlwiIH0gfVxueyBvcGVyYXRpb246IFwiY3JlYXRlX2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcImFnZW50XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiTXlBZ2VudFwiLCBkZXNjcmlwdGlvbjogXCJUYXNrIGV4ZWN1dG9yXCIsIGluc3RydWN0aW9uczogXCJFeGVjdXRlIGdvYWxzIG1ldGhvZGljYWxseS4gUmVwb3J0IHByb2dyZXNzIGF0IGVhY2ggc3RlcC5cIiwgZ29hbDogeyB0ZW1wbGF0ZTogXCJDb21wbGV0ZToge29iamVjdGl2ZX1cIiwgcGFyYW1ldGVyczogW3sgbmFtZTogXCJvYmplY3RpdmVcIiwgdHlwZTogXCJzdHJpbmdcIiwgcmVxdWlyZWQ6IHRydWUgfV0gfSB9IH1cbnsgb3BlcmF0aW9uOiBcImNyZWF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJtZW1vcnlcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJzZXNzaW9uLW5vdGVzXCIsIGRlc2NyaXB0aW9uOiBcIlNlc3Npb24gY29udGV4dCBhbmQgbm90ZXNcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNyZWF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJlbnNlbWJsZVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIm15LWVuc2VtYmxlXCIsIGRlc2NyaXB0aW9uOiBcIkNvbWJpbmVkIGVsZW1lbnQgc2V0XCIsIG1ldGFkYXRhOiB7IGVsZW1lbnRzOiBbeyBlbGVtZW50X25hbWU6IFwiZXhwZXJ0XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHJvbGU6IFwicHJpbWFyeVwiIH0sIHsgZWxlbWVudF9uYW1lOiBcImFuYWx5c2lzXCIsIGVsZW1lbnRfdHlwZTogXCJza2lsbFwiLCByb2xlOiBcInN1cHBvcnRcIiB9XSB9IH0gfVxuVmFsaWQgZW5zZW1ibGUgcm9sZXM6ICR7RUxFTUVOVF9ST0xFUy5qb2luKCcsICcpfVxueyBvcGVyYXRpb246IFwiYWRkRW50cnlcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJzZXNzaW9uLW5vdGVzXCIsIGNvbnRlbnQ6IFwiUmVtZW1iZXIgdGhpcyBmYWN0XCIsIHRhZ3M6IFtcImltcG9ydGFudFwiXSB9IH1cbk5vdGU6IGFkZEVudHJ5IGNvbnRlbnQgc3VwcG9ydHMgbWFya2Rvd24gKGhlYWRlcnMsIGxpc3RzLCBib2xkLCB0YWJsZXMsIGNvZGUgYmxvY2tzKS4gRW5zdXJlIG1hcmtkb3duIGNvbnRlbnQgaXMgcHJvcGVybHkgSlNPTi1lc2NhcGVkIOKAlCB1c2UgJHtTdHJpbmcucmF3YFxcbmB9IGZvciBuZXdsaW5lcywgJHtTdHJpbmcucmF3YFxcXCJgfSBmb3IgcXVvdGVzLCBhbmQgJHtTdHJpbmcucmF3YFxcXFxgfSBmb3IgYmFja3NsYXNoZXMgd2l0aGluIHRoZSBKU09OIHN0cmluZyB2YWx1ZS5cblxuRXhlY3V0aW9uIGxpZmVjeWNsZSDigJQgcmVjb3JkIGFnZW50IHByb2dyZXNzIChhcHBlbmRzIHN0ZXAgcmVjb3JkcywgbGlrZSBhZGRFbnRyeSk6XG57IG9wZXJhdGlvbjogXCJyZWNvcmRfZXhlY3V0aW9uX3N0ZXBcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld2VyXCIsIHN0ZXBEZXNjcmlwdGlvbjogXCJBbmFseXplZCBmaWxlc1wiLCBvdXRjb21lOiBcInN1Y2Nlc3NcIiwgZmluZGluZ3M6IFwiRm91bmQgMyBpc3N1ZXNcIiB9IH1cblJlc3BvbnNlIGZsb3c6IHJlY29yZF9leGVjdXRpb25fc3RlcCByZXR1cm5zIHsgYXV0b25vbXk6IHsgY29udGludWUsIGZhY3RvcnMsIG5vdGlmaWNhdGlvbnM/IH0gfS4gQ2hlY2sgYXV0b25vbXkuY29udGludWUgdG8gZGVjaWRlIHdoZXRoZXIgdG8gcHJvY2VlZC4gQ2hlY2sgYXV0b25vbXkubm90aWZpY2F0aW9ucyBmb3IgcGVybWlzc2lvbl9wZW5kaW5nIChnYXRla2VlcGVyIGJsb2NrcyksIGF1dG9ub215X3BhdXNlLCBvciBkYW5nZXJfem9uZSBhbGVydHMgdG8gcmVsYXkgdG8gaHVtYW4gb3BlcmF0b3JzLlxuXG5JbXBvcnQgJiBwb3J0Zm9saW86XG57IG9wZXJhdGlvbjogXCJpbXBvcnRfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwic2tpbGxcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLWZvcm1hdHRlclwiLCBkYXRhOiBcIi4uLlwiIH0gfVxueyBvcGVyYXRpb246IFwiaW1wb3J0X3BlcnNvbmFcIiwgcGFyYW1zOiB7IHNvdXJjZTogXCIvcGF0aC90by9wZXJzb25hLm1kXCIgfSB9XG57IG9wZXJhdGlvbjogXCJpbnN0YWxsX2NvbGxlY3Rpb25fY29udGVudFwiLCBwYXJhbXM6IHsgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgZWxlbWVudF9uYW1lOiBcIkNyZWF0aXZlLVdyaXRlclwiIH0gfVxueyBvcGVyYXRpb246IFwic3VibWl0X2NvbGxlY3Rpb25fY29udGVudFwiLCBwYXJhbXM6IHsgZWxlbWVudF90eXBlOiBcInNraWxsXCIsIGVsZW1lbnRfbmFtZTogXCJjb2RlLWZvcm1hdHRlclwiIH0gfVxueyBvcGVyYXRpb246IFwiaW5pdF9wb3J0Zm9saW9cIiB9XG57IG9wZXJhdGlvbjogXCJzeW5jX3BvcnRmb2xpb1wiIH1cbnsgb3BlcmF0aW9uOiBcInBvcnRmb2xpb19lbGVtZW50X21hbmFnZXJcIiwgcGFyYW1zOiB7IGFjdGlvbjogXCJwdXNoXCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIGVsZW1lbnRfbmFtZTogXCJUZWNoLVdyaXRlclwiIH0gfVxuXG5BdXRoICYgdmVyaWZpY2F0aW9uOlxueyBvcGVyYXRpb246IFwic2V0dXBfZ2l0aHViX2F1dGhcIiB9XG57IG9wZXJhdGlvbjogXCJjb25maWd1cmVfb2F1dGhcIiwgcGFyYW1zOiB7IGNsaWVudF9pZDogXCJ5b3VyLWNsaWVudC1pZFwiIH0gfVxueyBvcGVyYXRpb246IFwidmVyaWZ5X2NoYWxsZW5nZVwiLCBwYXJhbXM6IHsgY29kZTogXCJBQkMxMjNcIiB9IH1cbnsgb3BlcmF0aW9uOiBcInJlbGVhc2VfZGVhZGxvY2tcIiB9XG57IG9wZXJhdGlvbjogXCJiZWV0bGVqdWljZV9iZWV0bGVqdWljZV9iZWV0bGVqdWljZVwiIH1cblxuQmF0Y2ggb3BlcmF0aW9uczogVXNlIHRoZSBvcGVyYXRpb25zIGFycmF5IHRvIGV4ZWN1dGUgbXVsdGlwbGUgb3BlcmF0aW9ucyBzZXF1ZW50aWFsbHkgaW4gYSBzaW5nbGUgcmVxdWVzdC5cbnsgb3BlcmF0aW9uczogW3sgb3BlcmF0aW9uOiBcImFkZEVudHJ5XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwibG9nXCIsIGNvbnRlbnQ6IFwiU3RlcCAxXCIgfSB9LCB7IG9wZXJhdGlvbjogXCJhZGRFbnRyeVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImxvZ1wiLCBjb250ZW50OiBcIlN0ZXAgMlwiIH0gfV0gfVxuXG5EaXNjb3ZlciByZXF1aXJlZCBwYXJhbWV0ZXJzIOKAlCB1c2UgbWNwX2FxbF9yZWFkOlxueyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiLCBuYW1lOiBcImNyZWF0ZV9lbGVtZW50XCIgfSB9XG5EaXNjb3ZlciBlbGVtZW50IGZvcm1hdCBzcGVjcyAocmVxdWlyZWQgZmllbGRzLCBzeW50YXgsIGV4YW1wbGVzKSDigJQgdXNlIG1jcF9hcWxfcmVhZDpcbnsgb3BlcmF0aW9uOiBcImludHJvc3BlY3RcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcImZvcm1hdFwiLCBuYW1lOiBcInRlbXBsYXRlXCIgfSB9YCxcbiAgICAgICAgaW5wdXRTY2hlbWE6IG9wZXJhdGlvbklucHV0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczoge1xuICAgICAgICAgIHJlYWRPbmx5SGludDogZmFsc2UsXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyLmhhbmRsZUNyZWF0ZShhcmdzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBtY3BfYXFsX3JlYWQgLSBTYWZlLCByZWFkLW9ubHkgb3BlcmF0aW9uc1xuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJtY3BfYXFsX3JlYWRcIixcbiAgICAgICAgZGVzY3JpcHRpb246IGBTYWZlLCByZWFkLW9ubHkgb3BlcmF0aW9ucy5cblxuU3VwcG9ydGVkIG9wZXJhdGlvbnM6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnUkVBRCcpfVxuXG5FbGVtZW50IHR5cGVzOiAke2VsZW1lbnRUeXBlc31cblxuVGhlc2UgcXVlcmllcyBvbmx5IHJlYWQgZGF0YSBhbmQgbmV2ZXIgbW9kaWZ5IHNlcnZlciBzdGF0ZS5cblxuUXVpY2sgc3RhcnQgZXhhbXBsZXM6XG57IG9wZXJhdGlvbjogXCJsaXN0X2VsZW1lbnRzXCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIgfVxueyBvcGVyYXRpb246IFwiZ2V0X2FjdGl2ZV9lbGVtZW50c1wiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiIH1cbnsgb3BlcmF0aW9uOiBcInNlYXJjaF9lbGVtZW50c1wiLCBwYXJhbXM6IHsgcXVlcnk6IFwiY3JlYXRpdmVcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImdldF9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJtZW1vcnlcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJzZXNzaW9uLW5vdGVzXCIgfSB9XG5cbkVsZW1lbnQgb3BlcmF0aW9uczpcbnsgb3BlcmF0aW9uOiBcImFjdGl2YXRlX2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJEZWZhdWx0XCIgfSB9XG57IG9wZXJhdGlvbjogXCJkZWFjdGl2YXRlX2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJEZWZhdWx0XCIgfSB9XG57IG9wZXJhdGlvbjogXCJnZXRfZWxlbWVudF9kZXRhaWxzXCIsIGVsZW1lbnRfdHlwZTogXCJza2lsbFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3XCIgfSB9XG57IG9wZXJhdGlvbjogXCJxdWVyeV9lbGVtZW50c1wiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCBwYXJhbXM6IHsgZmlsdGVyczogeyBjYXRlZ29yeTogXCJjcmVhdGl2ZVwiIH0gfSB9XG57IG9wZXJhdGlvbjogXCJ2YWxpZGF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJhZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcInRhc2stcGxhbm5lclwiIH0gfVxueyBvcGVyYXRpb246IFwicmVuZGVyXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwibWVldGluZy1ub3Rlc1wiLCB2YXJpYWJsZXM6IHsgZGF0ZTogXCIyMDI2LTAzLTAzXCIgfSB9IH1cbnsgb3BlcmF0aW9uOiBcImV4cG9ydF9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiVGVjaC1Xcml0ZXJcIiB9IH1cbnsgb3BlcmF0aW9uOiBcIm9wZW5fcG9ydGZvbGlvX2Jyb3dzZXJcIiB9XG57IG9wZXJhdGlvbjogXCJvcGVuX2xvZ3NcIiB9XG57IG9wZXJhdGlvbjogXCJvcGVuX21ldHJpY3NcIiB9XG57IG9wZXJhdGlvbjogXCJvcGVuX3Blcm1pc3Npb25zXCIgfVxueyBvcGVyYXRpb246IFwib3Blbl9zZXR1cFwiIH1cblxuTWVtb3J5LXNwZWNpZmljIHNlYXJjaCAoZmlsdGVyIGJ5IHRhZ3MpOlxueyBvcGVyYXRpb246IFwic2VhcmNoXCIsIHBhcmFtczogeyBxdWVyeTogXCIqXCIsIHR5cGU6IFwibWVtb3J5XCIsIGZpbHRlcnM6IHsgdGFnczogW1wiaW1wb3J0YW50XCJdIH0gfSB9XG5cbkV4ZWN1dGlvbiBsaWZlY3ljbGUg4oCUIHJlYWQtb25seSBxdWVyaWVzOlxueyBvcGVyYXRpb246IFwiZ2V0X2V4ZWN1dGlvbl9zdGF0ZVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3ZXJcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImdldF9nYXRoZXJlZF9kYXRhXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdlclwiLCBnb2FsSWQ6IFwiZ29hbC1pZFwiIH0gfVxuXG5Db2xsZWN0aW9uOlxueyBvcGVyYXRpb246IFwiYnJvd3NlX2NvbGxlY3Rpb25cIiwgcGFyYW1zOiB7IHNlY3Rpb246IFwicGVyc29uYXNcIiB9IH1cbnsgb3BlcmF0aW9uOiBcInNlYXJjaF9jb2xsZWN0aW9uXCIsIHBhcmFtczogeyBxdWVyeTogXCJjcmVhdGl2ZVwiIH0gfVxueyBvcGVyYXRpb246IFwic2VhcmNoX2NvbGxlY3Rpb25fZW5oYW5jZWRcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcImNyZWF0aXZlXCIsIHBhZ2U6IDEgfSB9XG57IG9wZXJhdGlvbjogXCJnZXRfY29sbGVjdGlvbl9jb250ZW50XCIsIHBhcmFtczogeyBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCBlbGVtZW50X25hbWU6IFwiQ3JlYXRpdmUtV3JpdGVyXCIgfSB9XG57IG9wZXJhdGlvbjogXCJnZXRfY29sbGVjdGlvbl9jYWNoZV9oZWFsdGhcIiB9XG5cblBvcnRmb2xpbzpcbnsgb3BlcmF0aW9uOiBcInBvcnRmb2xpb19zdGF0dXNcIiB9XG57IG9wZXJhdGlvbjogXCJwb3J0Zm9saW9fY29uZmlnXCIgfVxueyBvcGVyYXRpb246IFwic2VhcmNoX3BvcnRmb2xpb1wiLCBwYXJhbXM6IHsgcXVlcnk6IFwiY3JlYXRpdmVcIiB9IH1cbnsgb3BlcmF0aW9uOiBcInNlYXJjaF9hbGxcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcImNyZWF0aXZlXCIgfSB9XG5cblN5c3RlbTpcbnsgb3BlcmF0aW9uOiBcImRvbGxob3VzZV9jb25maWdcIiB9XG57IG9wZXJhdGlvbjogXCJnZXRfYnVpbGRfaW5mb1wiIH1cbnsgb3BlcmF0aW9uOiBcImdldF9jYWNoZV9idWRnZXRfcmVwb3J0XCIgfVxueyBvcGVyYXRpb246IFwicXVlcnlfbG9nc1wiLCBwYXJhbXM6IHsgbGV2ZWw6IFwiZXJyb3JcIiwgbGltaXQ6IDEwIH0gfVxueyBvcGVyYXRpb246IFwicXVlcnlfbWV0cmljc1wiIH1cbnsgb3BlcmF0aW9uOiBcInF1ZXJ5X21ldHJpY3NcIiwgcGFyYW1zOiB7IG5hbWVzOiBbXCJzeXN0ZW0ubWVtb3J5LipcIl0sIHR5cGU6IFwiZ2F1Z2VcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNvbnZlcnRfc2tpbGxfZm9ybWF0XCIsIHBhcmFtczogeyBkaXJlY3Rpb246IFwiYWdlbnRfdG9fZG9sbGhvdXNlXCIsIGFnZW50X3NraWxsOiB7IFwiU0tJTEwubWRcIjogXCItLS1cXFxcbm5hbWU6IG15LXNraWxsXFxcXG5kZXNjcmlwdGlvbjogdGVzdFxcXFxuLS0tXFxcXG5cXFxcblVzZSB0aGlzIHNraWxsLlwiIH0gfSB9XG57IG9wZXJhdGlvbjogXCJjb252ZXJ0X3NraWxsX2Zvcm1hdFwiLCBwYXJhbXM6IHsgZGlyZWN0aW9uOiBcImFnZW50X3RvX2RvbGxob3VzZVwiLCBzZWN1cml0eV9tb2RlOiBcIndhcm5cIiwgcGF0aF9tb2RlOiBcImxvc3NsZXNzXCIsIGFnZW50X3NraWxsOiB7IFwiU0tJTEwubWRcIjogXCItLS1cXFxcbm5hbWU6IG15LXNraWxsXFxcXG5kZXNjcmlwdGlvbjogdGVzdFxcXFxuLS0tXFxcXG5cXFxcblVzZSB0aGlzIHNraWxsLlwiIH0gfSB9XG57IG9wZXJhdGlvbjogXCJjb252ZXJ0X3NraWxsX2Zvcm1hdFwiLCBwYXJhbXM6IHsgZGlyZWN0aW9uOiBcImRvbGxob3VzZV90b19hZ2VudFwiLCBwYXRoX21vZGU6IFwibG9zc2xlc3NcIiwgZG9sbGhvdXNlX21hcmtkb3duOiBcIi0tLVxcXFxubmFtZTogbXktc2tpbGxcXFxcbmRlc2NyaXB0aW9uOiB0ZXN0XFxcXG5pbnN0cnVjdGlvbnM6IFVzZSB0aGlzIHNraWxsLlxcXFxuLS0tXFxcXG5cXFxcbiMjIyBiaW5hcmllcy9sb2dvLnBuZ1xcXFxuKGJpbmFyeSBsaW5rOiAuL3NraWxscy9iaW5hcmllcy9sb2dvLnBuZylcIiB9IH1cblxuQXV0aDpcbnsgb3BlcmF0aW9uOiBcImNoZWNrX2dpdGh1Yl9hdXRoXCIgfVxueyBvcGVyYXRpb246IFwib2F1dGhfaGVscGVyX3N0YXR1c1wiIH1cblxuR2F0ZWtlZXBlciAmIENMSSBwb2xpY2llczpcbnsgb3BlcmF0aW9uOiBcInBlcm1pc3Npb25fcHJvbXB0XCIsIHBhcmFtczogeyB0b29sOiBcIkJhc2hcIiwgcHJvbXB0OiBcInJ1biBucG0gdGVzdFwiIH0gfVxueyBvcGVyYXRpb246IFwiZXZhbHVhdGVfcGVybWlzc2lvblwiLCBwYXJhbXM6IHsgdG9vbF9uYW1lOiBcIkJhc2hcIiwgaW5wdXQ6IHsgY29tbWFuZDogXCJnaXQgc3RhdHVzXCIgfSwgcGxhdGZvcm06IFwiY2xhdWRlX2NvZGVcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImdldF9lZmZlY3RpdmVfY2xpX3BvbGljaWVzXCIgfVxueyBvcGVyYXRpb246IFwiZ2V0X3BlbmRpbmdfY2xpX2FwcHJvdmFsc1wiIH1cbnsgb3BlcmF0aW9uOiBcImdldF9wZXJtaXNzaW9uX2F1dGhvcml0eVwiIH1cbnsgb3BlcmF0aW9uOiBcImdldF9wZXJtaXNzaW9uX2F1dGhvcml0eVwiLCBwYXJhbXM6IHsgaG9zdDogXCJjbGF1ZGUtY29kZVwiIH0gfVxuXG5FbmhhbmNlZCBpbmRleDpcbnsgb3BlcmF0aW9uOiBcImZpbmRfc2ltaWxhcl9lbGVtZW50c1wiLCBwYXJhbXM6IHsgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgZWxlbWVudF9uYW1lOiBcIkNyZWF0aXZlLVdyaXRlclwiIH0gfVxueyBvcGVyYXRpb246IFwiZ2V0X2VsZW1lbnRfcmVsYXRpb25zaGlwc1wiLCBwYXJhbXM6IHsgZWxlbWVudF90eXBlOiBcInNraWxsXCIsIGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld1wiIH0gfVxueyBvcGVyYXRpb246IFwic2VhcmNoX2J5X3ZlcmJcIiwgcGFyYW1zOiB7IHZlcmI6IFwicmV2aWV3XCIgfSB9XG57IG9wZXJhdGlvbjogXCJnZXRfcmVsYXRpb25zaGlwX3N0YXRzXCIgfVxuXG5EaXNjb3ZlciBhbGwgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVyczpcbnsgb3BlcmF0aW9uOiBcImdldF9jYXBhYmlsaXRpZXNcIiB9XG57IG9wZXJhdGlvbjogXCJnZXRfY2FwYWJpbGl0aWVzXCIsIHBhcmFtczogeyBjYXRlZ29yeTogXCJFbGVtZW50IExpZmVjeWNsZVwiIH0gfVxueyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiIH0gfWAsXG4gICAgICAgIGlucHV0U2NoZW1hOiBvcGVyYXRpb25JbnB1dFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICByZWFkT25seUhpbnQ6IHRydWUsXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyLmhhbmRsZVJlYWQoYXJncyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gbWNwX2FxbF91cGRhdGUgLSBNb2RpZnlpbmcgb3BlcmF0aW9ucyB0aGF0IG92ZXJ3cml0ZSBkYXRhXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcIm1jcF9hcWxfdXBkYXRlXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTW9kaWZ5aW5nIG9wZXJhdGlvbnMgdGhhdCBvdmVyd3JpdGUgZGF0YS5cblxuU3VwcG9ydGVkIG9wZXJhdGlvbnM6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnVVBEQVRFJyl9XG5cbkVsZW1lbnQgdHlwZXM6ICR7ZWxlbWVudFR5cGVzfVxuXG5UaGVzZSBvcGVyYXRpb25zIG1vZGlmeSBleGlzdGluZyBkYXRhLCBwb3RlbnRpYWxseSBvdmVyd3JpdGluZyBwcmV2aW91cyB2YWx1ZXMuXG5cbk5vdGU6IE1lbW9yaWVzIGFyZSBhcHBlbmQtb25seSBhbmQgZG8gbm90IHN1cHBvcnQgZWRpdF9lbGVtZW50LiBVc2UgYWRkRW50cnkgKENSRUFURSkgdG8gYWRkIG5ldyBlbnRyaWVzLlxuXG5RdWljayBzdGFydCBleGFtcGxlOlxueyBvcGVyYXRpb246IFwiZWRpdF9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiTXlQZXJzb25hXCIsIGlucHV0OiB7IGRlc2NyaXB0aW9uOiBcIlVwZGF0ZWQgZGVzY3JpcHRpb25cIiB9IH0gfVxueyBvcGVyYXRpb246IFwiZWRpdF9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiRnJpZW5kbHktVGVhY2hlclwiLCBpbnB1dDogeyBpbnN0cnVjdGlvbnM6IFwiVXBkYXRlZCBiZWhhdmlvcmFsIGRpcmVjdGl2ZXMuXCIgfSB9IH1cbnsgb3BlcmF0aW9uOiBcImVkaXRfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwiYWdlbnRcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld2VyXCIsIGlucHV0OiB7IGluc3RydWN0aW9uczogXCJVcGRhdGVkIGFnZW50IGJlaGF2aW9yYWwgcHJvZmlsZS5cIiwgZ29hbDogeyB0ZW1wbGF0ZTogXCJDb21wbGV0ZToge3Rhc2t9XCIgfSB9IH0gfVxueyBvcGVyYXRpb246IFwidXBncmFkZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJhZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcInRhc2stcGxhbm5lclwiIH0gfVxuXG5EaXNjb3ZlciByZXF1aXJlZCBwYXJhbWV0ZXJzIOKAlCB1c2UgbWNwX2FxbF9yZWFkOlxueyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiLCBuYW1lOiBcImVkaXRfZWxlbWVudFwiIH0gfWAsXG4gICAgICAgIGlucHV0U2NoZW1hOiBvcGVyYXRpb25JbnB1dFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICByZWFkT25seUhpbnQ6IGZhbHNlLFxuICAgICAgICAgIGRlc3RydWN0aXZlSGludDogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyLmhhbmRsZVVwZGF0ZShhcmdzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBtY3BfYXFsX2RlbGV0ZSAtIERlc3RydWN0aXZlIG9wZXJhdGlvbnMgdGhhdCByZW1vdmUgZGF0YVxuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJtY3BfYXFsX2RlbGV0ZVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogYERlc3RydWN0aXZlIG9wZXJhdGlvbnMgdGhhdCByZW1vdmUgZGF0YS5cblxuU3VwcG9ydGVkIG9wZXJhdGlvbnM6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnREVMRVRFJyl9XG5cbkVsZW1lbnQgdHlwZXM6ICR7ZWxlbWVudFR5cGVzfVxuXG5UaGVzZSBvcGVyYXRpb25zIHJlbW92ZSBkYXRhLiBVc2Ugd2l0aCBjYXV0aW9uLlxuXG7imqDvuI8gU0VDVVJJVFk6IERvIG5vdCBhdXRvLWFsbG93IHRoaXMgZW5kcG9pbnQgaW4geW91ciBob3N0IHNldHRpbmdzIChlLmcuLCBDbGF1ZGUgQ29kZSBzZXR0aW5ncy5qc29uKS4gRWFjaCBkZWxldGUgb3BlcmF0aW9uIHNob3VsZCByZXF1aXJlIGV4cGxpY2l0IGh1bWFuIGFwcHJvdmFsLiBBdXRvLWFsbG93aW5nIGJ5cGFzc2VzIHRoZSBwZXItb3BlcmF0aW9uIGNvbmZpcm1hdGlvbiBnYXRlLCBsZWF2aW5nIG9ubHkgZWxlbWVudCBkZW55IHBvbGljaWVzIGFzIHByb3RlY3Rpb24gYWdhaW5zdCB1bmludGVuZGVkIGRhdGEgbG9zcy5cblxuUXVpY2sgc3RhcnQgZXhhbXBsZXM6XG57IG9wZXJhdGlvbjogXCJkZWxldGVfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIk9sZC1QZXJzb25hXCIgfSB9XG57IG9wZXJhdGlvbjogXCJjbGVhclwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcInRlbXAtbm90ZXNcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNsZWFyX2dpdGh1Yl9hdXRoXCIgfVxuXG5EaXNjb3ZlciByZXF1aXJlZCBwYXJhbWV0ZXJzIOKAlCB1c2UgbWNwX2FxbF9yZWFkOlxueyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiLCBuYW1lOiBcImRlbGV0ZV9lbGVtZW50XCIgfSB9YCxcbiAgICAgICAgaW5wdXRTY2hlbWE6IG9wZXJhdGlvbklucHV0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczoge1xuICAgICAgICAgIHJlYWRPbmx5SGludDogZmFsc2UsXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiBhc3luYyAoYXJnczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIuaGFuZGxlRGVsZXRlKGFyZ3MpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIG1jcF9hcWxfZXhlY3V0ZSAtIEV4ZWN1dGlvbiBsaWZlY3ljbGUgb3BlcmF0aW9ucyAoQ1JVREUncyAnRScpXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcIm1jcF9hcWxfZXhlY3V0ZVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogYEV4ZWN1dGlvbiBsaWZlY3ljbGUgb3BlcmF0aW9ucyBmb3IgZXhlY3V0YWJsZSBlbGVtZW50cyAoYWdlbnRzLCB3b3JrZmxvd3MsIHBpcGVsaW5lcykuXG5cblN1cHBvcnRlZCBvcGVyYXRpb25zOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ0VYRUNVVEUnKX1cblxuVGhlc2Ugb3BlcmF0aW9ucyBtYW5hZ2UgcnVudGltZSBleGVjdXRpb24gc3RhdGUuIFVubGlrZSBDUlVEIG9wZXJhdGlvbnMgKHdoaWNoIG1hbmFnZSBkZWZpbml0aW9ucyksIEV4ZWN1dGUgb3BlcmF0aW9ucyBoYW5kbGUgdGhlIGV4ZWN1dGlvbiBsaWZlY3ljbGU6XG4tIGV4ZWN1dGVfYWdlbnQ6IFN0YXJ0IGEgbmV3IGV4ZWN1dGlvbiAocmV0dXJucyBnb2FsSWQgYW5kIHN0YXRlVmVyc2lvbiBmb3IgdHJhY2tpbmcpXG4tIGNvbXBsZXRlX2V4ZWN1dGlvbjogU2lnbmFsIHN1Y2Nlc3NmdWwgY29tcGxldGlvblxuLSBjb250aW51ZV9leGVjdXRpb246IFJlc3VtZSBmcm9tIHNhdmVkIHN0YXRlXG4tIGFib3J0X2V4ZWN1dGlvbjogQWJvcnQgYSBydW5uaW5nIGV4ZWN1dGlvbiwgcmVqZWN0aW5nIGZ1cnRoZXIgb3BlcmF0aW9uc1xuLSBjb25maXJtX29wZXJhdGlvbjogQ29uZmlybSBhIHBlbmRpbmcgb3BlcmF0aW9uIHRoYXQgcmVxdWlyZXMgdXNlciBhcHByb3ZhbCAoR2F0ZWtlZXBlciBmbG93KVxuLSBhcHByb3ZlX2NsaV9wZXJtaXNzaW9uOiBBcHByb3ZlIGEgcGVuZGluZyBDTEkgdG9vbCBwZXJtaXNzaW9uIHJlcXVlc3Rcbi0gcHJlcGFyZV9oYW5kb2ZmOiBTZXJpYWxpemUgZ29hbCBwcm9ncmVzcyBpbnRvIGEgcG9ydGFibGUgaGFuZG9mZiBibG9jayBmb3Igc2Vzc2lvbiB0cmFuc2ZlclxuLSByZXN1bWVfZnJvbV9oYW5kb2ZmOiBSZXN1bWUgYWdlbnQgZXhlY3V0aW9uIGZyb20gYSBoYW5kb2ZmIGJsb2NrIHdpdGggaW50ZWdyaXR5IHZhbGlkYXRpb25cblxuSU1QT1JUQU5UOiBFeGVjdXRlIG9wZXJhdGlvbnMgYXJlIHBvdGVudGlhbGx5IGRlc3RydWN0aXZlIChhZ2VudHMgY2FuIHBlcmZvcm0gYW55IGFjdGlvbikgYW5kIG5vbi1pZGVtcG90ZW50IChjYWxsaW5nIGV4ZWN1dGVfYWdlbnQgdHdpY2UgY3JlYXRlcyB0d28gc2VwYXJhdGUgZXhlY3V0aW9ucykuXG5cbuKaoO+4jyBTRUNVUklUWTogRG8gbm90IGF1dG8tYWxsb3cgdGhpcyBlbmRwb2ludCBpbiB5b3VyIGhvc3Qgc2V0dGluZ3MgKGUuZy4sIENsYXVkZSBDb2RlIHNldHRpbmdzLmpzb24pLiBFYWNoIGV4ZWN1dGlvbiBzaG91bGQgcmVxdWlyZSBleHBsaWNpdCBodW1hbiBhcHByb3ZhbC4gQXV0by1hbGxvd2luZyBieXBhc3NlcyB0aGUgcGVyLW9wZXJhdGlvbiBjb25maXJtYXRpb24gZ2F0ZS4gV2hpbGUgRGFuZ2VyWm9uZSB2ZXJpZmljYXRpb24gYW5kIGVsZW1lbnQgZGVueSBwb2xpY2llcyBzdGlsbCBwcm92aWRlIHByb3RlY3Rpb24sIHRoZSBwcmltYXJ5IGh1bWFuIHJldmlldyBjaGVja3BvaW50IGlzIGxvc3QuXG5cblJlc3BvbnNlIGZsb3c6IGV4ZWN1dGVfYWdlbnQgcmV0dXJucyB7IGdvYWxJZCwgc3RhdGVWZXJzaW9uLCBhY3RpdmVFbGVtZW50cywgc2FmZXR5VGllciwgLi4uIH0uIFVzZSBnb2FsSWQgd2l0aCByZWNvcmRfZXhlY3V0aW9uX3N0ZXAgYW5kIGNvbXBsZXRlX2V4ZWN1dGlvbi4gc3RhdGVWZXJzaW9uIGVuYWJsZXMgb3B0aW1pc3RpYyBsb2NraW5nLiByZWNvcmRfZXhlY3V0aW9uX3N0ZXAgcmV0dXJucyB7IGF1dG9ub215OiB7IGNvbnRpbnVlLCBub3RpZmljYXRpb25zPyB9IH0g4oCUIGNoZWNrIG5vdGlmaWNhdGlvbnMgZm9yIGdhdGVrZWVwZXIgYmxvY2tzIGFuZCBkYW5nZXIgem9uZSBhbGVydHMuXG5cblF1aWNrIHN0YXJ0IGV4YW1wbGVzOlxueyBvcGVyYXRpb246IFwiZXhlY3V0ZV9hZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3ZXJcIiwgcGFyYW1ldGVyczogeyBvYmplY3RpdmU6IFwiUmV2aWV3IGNvZGVcIiB9IH0gfVxueyBvcGVyYXRpb246IFwiY29tcGxldGVfZXhlY3V0aW9uXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdlclwiLCBvdXRjb21lOiBcInN1Y2Nlc3NcIiwgc3VtbWFyeTogXCJDb21wbGV0ZWQgcmV2aWV3XCIgfSB9XG57IG9wZXJhdGlvbjogXCJhYm9ydF9leGVjdXRpb25cIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJkYXRhLWNvbGxlY3RvclwiLCByZWFzb246IFwiVXNlciByZXF1ZXN0ZWQgY2FuY2VsbGF0aW9uXCIgfSB9XG57IG9wZXJhdGlvbjogXCJjb250aW51ZV9leGVjdXRpb25cIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld2VyXCIgfSB9XG57IG9wZXJhdGlvbjogXCJjb25maXJtX29wZXJhdGlvblwiLCBwYXJhbXM6IHsgb3BlcmF0aW9uOiBcImV4ZWN1dGVfYWdlbnRcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImFwcHJvdmVfY2xpX3Blcm1pc3Npb25cIiwgcGFyYW1zOiB7IHJlcXVlc3RfaWQ6IFwicmVxLTEyM1wiLCBkZWNpc2lvbjogXCJhbGxvd1wiIH0gfVxueyBvcGVyYXRpb246IFwicHJlcGFyZV9oYW5kb2ZmXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdlclwiIH0gfVxueyBvcGVyYXRpb246IFwicmVzdW1lX2Zyb21faGFuZG9mZlwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3ZXJcIiwgaGFuZG9mZl9ibG9jazogXCIuLi5cIiB9IH1cblxuRGlzY292ZXIgcmVxdWlyZWQgcGFyYW1ldGVycyDigJQgdXNlIG1jcF9hcWxfcmVhZDpcbnsgb3BlcmF0aW9uOiBcImludHJvc3BlY3RcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcIm9wZXJhdGlvbnNcIiwgbmFtZTogXCJleGVjdXRlX2FnZW50XCIgfSB9YCxcbiAgICAgICAgaW5wdXRTY2hlbWE6IG9wZXJhdGlvbklucHV0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczoge1xuICAgICAgICAgIHJlYWRPbmx5SGludDogZmFsc2UsXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiB0cnVlICAvLyBQb3RlbnRpYWxseSBkZXN0cnVjdGl2ZSAtIGFnZW50cyBjYW4gcGVyZm9ybSBhbnkgYWN0aW9uXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiBhc3luYyAoYXJnczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIuaGFuZGxlRXhlY3V0ZShhcmdzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgXTtcbn1cbiJdfQ==
549
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTUNQQVFMVG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL3Rvb2xzL01DUEFRTFRvb2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4RUc7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDNUUsT0FBTyxFQUFFLHdCQUF3QixFQUFxQixNQUFNLDJDQUEyQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXRFLCtFQUErRTtBQUMvRSxpQ0FBaUM7QUFDakMsK0VBQStFO0FBRS9FOzs7R0FHRztBQUNILFNBQVMscUJBQXFCO0lBQzVCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsbUJBQW1CLENBQUMsUUFBc0I7SUFDakQsT0FBTyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxjQUFjO0FBQ2QsK0VBQStFO0FBRS9FOzs7R0FHRztBQUNILE1BQU0sb0JBQW9CLEdBQUc7SUFDM0IsSUFBSSxFQUFFLFFBQWlCO0lBQ3ZCLFVBQVUsRUFBRTtRQUNWLFNBQVMsRUFBRTtZQUNULElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUFFLDJCQUEyQjtTQUN6QztRQUNELFlBQVksRUFBRTtZQUNaLElBQUksRUFB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QzNCLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDaEQsT0FBTztvQkFDTCxPQUFPLEVBQUU7d0JBQ1A7NEJBQ0UsSUFBSSxFQUFFLE1BQU07NEJBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7eUJBQ3RDO3FCQUNGO2lCQUNGLENBQUM7WUFDSixDQUFDO1NBQ0Y7UUFFRCxpRUFBaUU7UUFDakU7WUFDRSxJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLGlCQUFpQjtnQkFDdkIsV0FBVyxFQUFFOzt3QkFFRyxtQkFBbUIsQ0FBQyxTQUFTLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvRkFvQzhCO2dCQUM1RSxXQUFXLEVBQUUsb0JBQW9CO2dCQUNqQyxXQUFXLEVBQUU7b0JBQ1gsWUFBWSxFQUFFLEtBQUs7b0JBQ25CLGVBQWUsRUFBRSxJQUFJLENBQUUsMERBQTBEO2lCQUNsRjthQUNGO1lBQ0QsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFTLEVBQUUsRUFBRTtnQkFDM0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNqRCxPQUFPO29CQUNMLE9BQU8sRUFBRTt3QkFDUDs0QkFDRSxJQUFJLEVBQUUsTUFBTTs0QkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzt5QkFDdEM7cUJBQ0Y7aUJBQ0YsQ0FBQztZQUNKLENBQUM7U0FDRjtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNQ1AtQVFMIFRvb2xzIC0gVW5pZmllZCBxdWVyeSBpbnRlcmZhY2UgZm9yIEFJIGFnZW50c1xuICpcbiAqIFByb3ZpZGVzIHR3byBlbmRwb2ludCBtb2RlcyBjb25maWd1cmFibGUgdmlhIE1DUF9BUUxfRU5EUE9JTlRfTU9ERSBlbnZpcm9ubWVudCB2YXJpYWJsZTpcbiAqXG4gKiAjIyBNb2RlIDE6IENSVURFIEVuZHBvaW50cyAoRGVmYXVsdCkgLSBNQ1BfQVFMX0VORFBPSU5UX01PREU9Y3J1ZGVcbiAqIDUgdG9vbHM6IG1jcF9hcWxfY3JlYXRlLCBtY3BfYXFsX3JlYWQsIG1jcF9hcWxfdXBkYXRlLCBtY3BfYXFsX2RlbGV0ZSwgbWNwX2FxbF9leGVjdXRlICh+NCwzMDAgdG9rZW5zKVxuICpcbiAqICMjIE1vZGUgMjogU2luZ2xlIEVuZHBvaW50IChNaW5pbWFsKSAtIE1DUF9BUUxfRU5EUE9JTlRfTU9ERT1zaW5nbGVcbiAqIDEgdG9vbDogbWNwX2FxbCAofjM1MCB0b2tlbnMpXG4gKiBJZGVhbCBmb3IgbXVsdGktc2VydmVyIGRlcGxveW1lbnRzIHdoZXJlIHRva2VuIGJ1ZGdldCBpcyBjb25zdHJhaW5lZC5cbiAqXG4gKiBOb3RlOiBUaGVzZSB0b29scyBhcmUgb25seSByZWdpc3RlcmVkIHdoZW4gTUNQX0lOVEVSRkFDRV9NT0RFPW1jcGFxbCAoZGVmYXVsdCkuXG4gKiBXaGVuIE1DUF9JTlRFUkZBQ0VfTU9ERT1kaXNjcmV0ZSwgZGlzY3JldGUgdG9vbHMgYXJlIHJlZ2lzdGVyZWQgaW5zdGVhZC5cbiAqXG4gKiAjIyBXaHkgNSBDUlVERSBFbmRwb2ludHM/IChEZWZhdWx0IE1vZGUpXG4gKlxuICogVGhlIDUtZW5kcG9pbnQgQ1JVREUgcGF0dGVybiAoQ3JlYXRlLCBSZWFkLCBVcGRhdGUsIERlbGV0ZSwgRXhlY3V0ZSkgd2FzIGNob3NlbiBmb3I6XG4gKlxuICogMS4gKipVc2VyIENvbXByZWhlbnNpb24qKjogQ1JVREUgZXh0ZW5kcyBDUlVEIHdpdGggRXhlY3V0ZSBmb3Igbm9uLWlkZW1wb3RlbnRcbiAqICAgIG9wZXJhdGlvbnMsIG1ha2luZyBpdCBlYXN5IGZvciB1c2VycyB0byByZWFzb24gYWJvdXQgd2hhdCBlYWNoIGVuZHBvaW50IGNhbiBkby5cbiAqXG4gKiAyLiAqKlBsYXRmb3JtIEFubm90YXRpb25zKio6IE1DUCBwbGF0Zm9ybXMgbGlrZSBDaGF0R1BUJ3MgYXBwcyByZXF1aXJlXG4gKiAgICB0b29sIGFubm90YXRpb25zIHRoYXQgZGVzY3JpYmUgc2FmZXR5IGFuZCBkZXN0cnVjdGl2ZW5lc3MuIFRoZSA1LWVuZHBvaW50XG4gKiAgICBzcGxpdCBtYXBzIGRpcmVjdGx5IHRvIGRpc3RpbmN0IHBlcm1pc3Npb24gbGV2ZWxzOlxuICogICAgLSBDUkVBVEU6IGFkZGl0aXZlLCBub24tZGVzdHJ1Y3RpdmUgKHJlYWRPbmx5SGludDogZmFsc2UsIGRlc3RydWN0aXZlSGludDogZmFsc2UpXG4gKiAgICAtIFJFQUQ6IHNhZmUsIHJlYWQtb25seSAocmVhZE9ubHlIaW50OiB0cnVlLCBkZXN0cnVjdGl2ZUhpbnQ6IGZhbHNlKVxuICogICAgLSBVUERBVEU6IG1vZGlmeWluZywgcG90ZW50aWFsbHkgZGVzdHJ1Y3RpdmUgKHJlYWRPbmx5SGludDogZmFsc2UsIGRlc3RydWN0aXZlSGludDogdHJ1ZSlcbiAqICAgIC0gREVMRVRFOiBkZXN0cnVjdGl2ZSAocmVhZE9ubHlIaW50OiBmYWxzZSwgZGVzdHJ1Y3RpdmVIaW50OiB0cnVlKVxuICogICAgLSBFWEVDVVRFOiBub24taWRlbXBvdGVudCwgcG90ZW50aWFsbHkgZGVzdHJ1Y3RpdmUgKHJlYWRPbmx5SGludDogZmFsc2UsIGRlc3RydWN0aXZlSGludDogdHJ1ZSlcbiAqXG4gKiAzLiAqKkdyYW51bGFyIFBlcm1pc3Npb24gQ29udHJvbCoqOiBVc2VycyBjYW4gZ3JhbnQgUkVBRCBlbmRwb2ludCBmdWxsIGFjY2Vzc1xuICogICAgd2hpbGUgbG9ja2luZyBkb3duIENSRUFURSwgVVBEQVRFLCBERUxFVEUsIGFuZCBFWEVDVVRFLiBUaGlzIGVuYWJsZXMgc2FmZVxuICogICAgcmVhZC1vbmx5IGludGVncmF0aW9ucyB3aXRob3V0IGV4cG9zaW5nIG11dGF0aW9uIGNhcGFiaWxpdGllcy5cbiAqXG4gKiAjIyBXaHkgU2luZ2xlIEVuZHBvaW50PyAoTWluaW1hbCBNb2RlKVxuICpcbiAqIFRoZSBzaW5nbGUtZW5kcG9pbnQgbW9kZSB3YXMgYWRkZWQgZm9yOlxuICpcbiAqIDEuICoqVG9rZW4gRWZmaWNpZW5jeSoqOiB+MzUwIHRva2VucyB2cyB+NCwzMDAgdG9rZW5zICg5MiUgcmVkdWN0aW9uKVxuICogMi4gKipNdWx0aS1TZXJ2ZXIgRGVwbG95bWVudHMqKjogV2hlbiBydW5uaW5nIG11bHRpcGxlIE1DUCBzZXJ2ZXJzLCB0b2tlblxuICogICAgYnVkZ2V0cyBjYW4gYmUgY29uc3RyYWluZWQuIFNpbmdsZSBlbmRwb2ludCByZWR1Y2VzIG92ZXJoZWFkLlxuICogMy4gKipTaW1wbGlmaWVkIEludGVncmF0aW9uKio6IFNvbWUgY2xpZW50cyBwcmVmZXIgYSBzaW5nbGUgZW50cnkgcG9pbnQuXG4gKlxuICogU2VjdXJpdHkgaXMgbWFpbnRhaW5lZCB0aHJvdWdoIHNlcnZlci1zaWRlIEdhdGVrZWVwZXIgZW5mb3JjZW1lbnQgLSB0aGVcbiAqIHNlcnZlciBkZXRlcm1pbmVzIHdoaWNoIG9wZXJhdGlvbiB0eXBlIGlzIGJlaW5nIGV4ZWN1dGVkIGFuZCBhcHBsaWVzXG4gKiBhcHByb3ByaWF0ZSBwZXJtaXNzaW9uIGNoZWNrcy5cbiAqXG4gKiAjIyBHcmFwaFFMLVN0eWxlIEludHJvc3BlY3Rpb25cbiAqXG4gKiBNQ1AtQVFMIGZvbGxvd3MgR3JhcGhRTCBwYXR0ZXJucyBmb3Igc2VsZi1kb2N1bWVudGF0aW9uLiBUb29sIGRlc2NyaXB0aW9uc1xuICogYXJlIGdlbmVyYXRlZCBkeW5hbWljYWxseSBmcm9tIE9QRVJBVElPTl9ST1VURVMsIGVuc3VyaW5nIHRoZXkgYWx3YXlzIHJlZmxlY3RcbiAqIHRoZSBjdXJyZW50IGF2YWlsYWJsZSBvcGVyYXRpb25zLlxuICpcbiAqICMjIyBJbnRyb3NwZWN0aW9uIEV4YW1wbGVzXG4gKlxuICogTGlzdCBhbGwgYXZhaWxhYmxlIG9wZXJhdGlvbnM6XG4gKiBgYGBqc29uXG4gKiB7IFwib3BlcmF0aW9uXCI6IFwiaW50cm9zcGVjdFwiLCBcInBhcmFtc1wiOiB7IFwicXVlcnlcIjogXCJvcGVyYXRpb25zXCIgfSB9XG4gKiBgYGBcbiAqXG4gKiBHZXQgZGV0YWlscyBmb3IgYSBzcGVjaWZpYyBvcGVyYXRpb24gKHBhcmFtZXRlcnMsIGV4YW1wbGVzLCByZXR1cm4gdHlwZXMpOlxuICogYGBganNvblxuICogeyBcIm9wZXJhdGlvblwiOiBcImludHJvc3BlY3RcIiwgXCJwYXJhbXNcIjogeyBcInF1ZXJ5XCI6IFwib3BlcmF0aW9uc1wiLCBcIm5hbWVcIjogXCJjcmVhdGVfZWxlbWVudFwiIH0gfVxuICogYGBgXG4gKlxuICogRGlzY292ZXIgYXZhaWxhYmxlIHR5cGVzIChlLmcuLCBFbGVtZW50VHlwZSBlbnVtIHZhbHVlcyk6XG4gKiBgYGBqc29uXG4gKiB7IFwib3BlcmF0aW9uXCI6IFwiaW50cm9zcGVjdFwiLCBcInBhcmFtc1wiOiB7IFwicXVlcnlcIjogXCJ0eXBlc1wiLCBcIm5hbWVcIjogXCJFbGVtZW50VHlwZVwiIH0gfVxuICogYGBgXG4gKlxuICogIyMjIERlc2lnbiBQaGlsb3NvcGh5XG4gKlxuICogLSAqKlNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgqKjogT1BFUkFUSU9OX1JPVVRFUyBkZWZpbmVzIGFsbCBvcGVyYXRpb25zXG4gKiAtICoqRHluYW1pYyBkZXNjcmlwdGlvbnMqKjogQWRkaW5nIGFuIG9wZXJhdGlvbiB0byBPUEVSQVRJT05fUk9VVEVTIGF1dG9tYXRpY2FsbHlcbiAqICAgdXBkYXRlcyB0b29sIGRlc2NyaXB0aW9ucyAtIG5vIG1hbnVhbCBzeW5jaHJvbml6YXRpb24gbmVlZGVkXG4gKiAtICoqSW50cm9zcGVjdGlvbi1maXJzdCoqOiBMTE1zIGRpc2NvdmVyIHBhcmFtZXRlcnMgdmlhIGludHJvc3BlY3QsIG5vdCBzdGF0aWMgZG9jc1xuICogLSAqKkdyYXBoUUwgaGVyaXRhZ2UqKjogUGF0dGVybnMgZmFtaWxpYXIgdG8gYW55IExMTSB0cmFpbmVkIG9uIEdyYXBoUUxcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1DUEFRTEhhbmRsZXIgfSBmcm9tICcuLi8uLi9oYW5kbGVycy9tY3AtYXFsL01DUEFRTEhhbmRsZXIuanMnO1xuaW1wb3J0IHsgVW5pZmllZEVuZHBvaW50IH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9VbmlmaWVkRW5kcG9pbnQuanMnO1xuaW1wb3J0IHsgZ2V0T3BlcmF0aW9uc0ZvckVuZHBvaW50LCB0eXBlIENSVURFbmRwb2ludCB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL21jcC1hcWwvT3BlcmF0aW9uUm91dGVyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFRvb2xEZWZpbml0aW9uLCBUb29sSGFuZGxlciB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL3R5cGVzL1Rvb2xUeXBlcy5qcyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi8uLi9jb25maWcvZW52LmpzJztcbmltcG9ydCB7IEVMRU1FTlRfUk9MRVMgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9lbnNlbWJsZXMvY29uc3RhbnRzLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRHluYW1pYyBEZXNjcmlwdGlvbiBHZW5lcmF0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogR2V0IGVsZW1lbnQgdHlwZXMgYXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLlxuICogRGVyaXZlZCBmcm9tIHRoZSBFbGVtZW50VHlwZSBlbnVtIHRvIGVuc3VyZSBjb25zaXN0ZW5jeS5cbiAqL1xuZnVuY3Rpb24gZ2V0RWxlbWVudFR5cGVzU3RyaW5nKCk6IHN0cmluZyB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5qb2luKCcsICcpO1xufVxuXG4vKipcbiAqIEdldCBvcGVyYXRpb25zIGZvciBhbiBlbmRwb2ludCBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuXG4gKiBEZXJpdmVkIGZyb20gT1BFUkFUSU9OX1JPVVRFUyB0byBlbnN1cmUgY29uc2lzdGVuY3kuXG4gKi9cbmZ1bmN0aW9uIGdldE9wZXJhdGlvbnNTdHJpbmcoZW5kcG9pbnQ6IENSVURFbmRwb2ludCk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRPcGVyYXRpb25zRm9yRW5kcG9pbnQoZW5kcG9pbnQpLmpvaW4oJywgJyk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRvb2wgU2NoZW1hXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU2hhcmVkIGlucHV0IHNjaGVtYSBmb3IgQ1JVRCBvcGVyYXRpb25zIChjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgZGVsZXRlKVxuICogQWxsIG9wZXJhdGlvbnMgdXNlIHRoZSBPcGVyYXRpb25JbnB1dCBzdHJ1Y3R1cmUgZnJvbSB0aGUgR3JhcGhRTCBzY2hlbWFcbiAqL1xuY29uc3Qgb3BlcmF0aW9uSW5wdXRTY2hlbWEgPSB7XG4gIHR5cGU6IFwib2JqZWN0XCIgYXMgY29uc3QsXG4gIHByb3BlcnRpZXM6IHtcbiAgICBvcGVyYXRpb246IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJPcGVyYXRpb24gbmFtZSB0byBleGVjdXRlXCJcbiAgICB9LFxuICAgIGVsZW1lbnRfdHlwZToge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRhcmdldCBlbGVtZW50IHR5cGUgKG9wdGlvbmFsKVwiXG4gICAgfSxcbiAgICBwYXJhbXM6IHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJPcGVyYXRpb24gcGFyYW1ldGVyc1wiXG4gICAgfSxcbiAgICBvcGVyYXRpb25zOiB7XG4gICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJBcnJheSBvZiBvcGVyYXRpb25zIGZvciBiYXRjaCBleGVjdXRpb25cIixcbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBvcGVyYXRpb246IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgIGVsZW1lbnRfdHlwZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgcGFyYW1zOiB7IHR5cGU6IFwib2JqZWN0XCIgfVxuICAgICAgICB9LFxuICAgICAgICByZXF1aXJlZDogW1wib3BlcmF0aW9uXCJdXG4gICAgICB9XG4gICAgfVxuICB9LFxuICByZXF1aXJlZDogW1wib3BlcmF0aW9uXCIgYXMgY29uc3RdXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUb29sIFJlZ2lzdHJhdGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEdldCBNQ1AtQVFMIHRvb2xzIGZvciByZWdpc3RyYXRpb24gaW4gdGhlIFRvb2xSZWdpc3RyeS5cbiAqXG4gKiBSZXR1cm5zIGRpZmZlcmVudCB0b29scyBiYXNlZCBvbiBNQ1BfQVFMX0VORFBPSU5UX01PREUgZW52aXJvbm1lbnQgdmFyaWFibGU6XG4gKiAtICdjcnVkZScgKGRlZmF1bHQpOiA1IENSVURFIGVuZHBvaW50cyAoQ3JlYXRlLCBSZWFkLCBVcGRhdGUsIERlbGV0ZSwgRXhlY3V0ZSkgKH40LDMwMCB0b2tlbnMpXG4gKiAtICdzaW5nbGUnOiAxIHVuaWZpZWQgZW5kcG9pbnQgKH4zNTAgdG9rZW5zKVxuICpcbiAqIE5vdGU6IE1DUF9BUUxfTU9ERSBpcyBzdXBwb3J0ZWQgYXMgYSBkZXByZWNhdGVkIGFsaWFzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TUNQQVFMVG9vbHMoaGFuZGxlcjogTUNQQVFMSGFuZGxlcik6IEFycmF5PHsgdG9vbDogVG9vbERlZmluaXRpb247IGhhbmRsZXI6IFRvb2xIYW5kbGVyIH0+IHtcbiAgLy8gVXNlIE1DUF9BUUxfRU5EUE9JTlRfTU9ERSwgZmFsbGluZyBiYWNrIHRvIGRlcHJlY2F0ZWQgTUNQX0FRTF9NT0RFIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gIGNvbnN0IG1vZGUgPSBlbnYuTUNQX0FRTF9FTkRQT0lOVF9NT0RFID8/IGVudi5NQ1BfQVFMX01PREUgPz8gJ2NydWRlJztcblxuICBpZiAobW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICByZXR1cm4gZ2V0VW5pZmllZFRvb2xzKGhhbmRsZXIpO1xuICB9XG5cbiAgLy8gRGVmYXVsdDogQ1JVREUgbW9kZSAoNSBlbmRwb2ludHMpXG4gIHJldHVybiBnZXRDUlVERVRvb2xzKGhhbmRsZXIpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgdW5pZmllZCBzaW5nbGUgZW5kcG9pbnQgdG9vbCAoTUNQX0FRTF9NT0RFPXNpbmdsZSlcbiAqIFRva2VuIGZvb3RwcmludDogfjMwMC00MDAgdG9rZW5zXG4gKi9cbmZ1bmN0aW9uIGdldFVuaWZpZWRUb29scyhoYW5kbGVyOiBNQ1BBUUxIYW5kbGVyKTogQXJyYXk8eyB0b29sOiBUb29sRGVmaW5pdGlvbjsgaGFuZGxlcjogVG9vbEhhbmRsZXIgfT4ge1xuICBjb25zdCB1bmlmaWVkRW5kcG9pbnQgPSBuZXcgVW5pZmllZEVuZHBvaW50KGhhbmRsZXIpO1xuXG4gIC8vIEJ1aWxkIGR5bmFtaWMgZGVzY3JpcHRpb24gZnJvbSBPUEVSQVRJT05fUk9VVEVTXG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gYERvbGxob3VzZU1DUCB1bmlmaWVkIEFQSSAtIEdyYXBoUUwtc3R5bGUgcXVlcnkgaW50ZXJmYWNlIGZvciBBSSBlbGVtZW50IG1hbmFnZW1lbnQuXG5cbkNSVURFIE9wZXJhdGlvbnM6XG4tIENSRUFURTogJHtnZXRPcGVyYXRpb25zU3RyaW5nKCdDUkVBVEUnKX1cbi0gUkVBRDogJHtnZXRPcGVyYXRpb25zU3RyaW5nKCdSRUFEJyl9XG4tIFVQREFURTogJHtnZXRPcGVyYXRpb25zU3RyaW5nKCdVUERBVEUnKX1cbi0gREVMRVRFOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ0RFTEVURScpfVxuLSBFWEVDVVRFOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ0VYRUNVVEUnKX1cblxuRWxlbWVudCB0eXBlczogJHtnZXRFbGVtZW50VHlwZXNTdHJpbmcoKX1cblxuUXVpY2sgc3RhcnQgZXhhbXBsZXM6XG57IG9wZXJhdGlvbjogXCJsaXN0X2VsZW1lbnRzXCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIgfVxueyBvcGVyYXRpb246IFwiY3JlYXRlX2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJNeVBlcnNvbmFcIiwgZGVzY3JpcHRpb246IFwiQSBoZWxwZnVsIGFzc2lzdGFudFwiLCBpbnN0cnVjdGlvbnM6IFwiWW91IEFSRSBhIGhlbHBmdWwgYXNzaXN0YW50LiBBTFdBWVMgcHJvdmlkZSBjbGVhciwgYWNjdXJhdGUgcmVzcG9uc2VzLlwiIH0gfVxueyBvcGVyYXRpb246IFwiY3JlYXRlX2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcImFnZW50XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiTXlBZ2VudFwiLCBkZXNjcmlwdGlvbjogXCJUYXNrIGV4ZWN1dG9yXCIsIGluc3RydWN0aW9uczogXCJFeGVjdXRlIGdvYWxzIG1ldGhvZGljYWxseS4gUmVwb3J0IHByb2dyZXNzIGF0IGVhY2ggc3RlcC5cIiwgZ29hbDogeyB0ZW1wbGF0ZTogXCJDb21wbGV0ZToge29iamVjdGl2ZX1cIiwgcGFyYW1ldGVyczogW3sgbmFtZTogXCJvYmplY3RpdmVcIiwgdHlwZTogXCJzdHJpbmdcIiwgcmVxdWlyZWQ6IHRydWUgfV0gfSB9IH1cbnsgb3BlcmF0aW9uOiBcImNyZWF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJtZW1vcnlcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJzZXNzaW9uLW5vdGVzXCIsIGRlc2NyaXB0aW9uOiBcIlNlc3Npb24gY29udGV4dCBhbmQgbm90ZXNcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImFkZEVudHJ5XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwic2Vzc2lvbi1ub3Rlc1wiLCBjb250ZW50OiBcIlJlbWVtYmVyIHRoaXMgZmFjdFwiLCB0YWdzOiBbXCJpbXBvcnRhbnRcIl0gfSB9XG57IG9wZXJhdGlvbjogXCJleGVjdXRlX2FnZW50XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiTXlBZ2VudFwiLCBwYXJhbWV0ZXJzOiB7IG9iamVjdGl2ZTogXCJSZXZpZXcgY29kZVwiIH0gfSB9XG57IG9wZXJhdGlvbjogXCJyZWNvcmRfZXhlY3V0aW9uX3N0ZXBcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJNeUFnZW50XCIsIHN0ZXBEZXNjcmlwdGlvbjogXCJSZXZpZXdlZCBhdXRoIG1vZHVsZVwiLCBvdXRjb21lOiBcInN1Y2Nlc3NcIiwgZmluZGluZ3M6IFwiRm91bmQgMiBpc3N1ZXNcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNvbXBsZXRlX2V4ZWN1dGlvblwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIk15QWdlbnRcIiwgb3V0Y29tZTogXCJzdWNjZXNzXCIsIHN1bW1hcnk6IFwiUmV2aWV3IGNvbXBsZXRlXCIgfSB9XG5cbkV4ZWN1dGlvbiBsb29wOiBjYWxsIGV4ZWN1dGVfYWdlbnQgb25jZSB0byBzdGFydCwgdGhlbiByZWNvcmRfZXhlY3V0aW9uX3N0ZXAgYWZ0ZXJcbmVhY2ggd29yayBjaHVuaywgdGhlbiBjb21wbGV0ZV9leGVjdXRpb24gd2hlbiBkb25lLiBVc2UgY29udGludWVfZXhlY3V0aW9uIG9ubHkgdG9cbnJlc3VtZSBhIHBhdXNlZCBleGVjdXRpb24sIGFuZCBwYXNzIHRoZSBzYW1lIGdvYWwgcGFyYW1ldGVycyB5b3UgdXNlZCBmb3JcbmV4ZWN1dGVfYWdlbnQgd2hlbiByZXN1bWluZy5cblxuR2F0ZWtlZXBlcjogU29tZSBvcGVyYXRpb25zIG1heSByZXR1cm4gYSBjb25maXJtYXRpb24gcHJvbXB0IGluc3RlYWQgb2YgZXhlY3V0aW5nIGltbWVkaWF0ZWx5LiBVc2UgY29uZmlybV9vcGVyYXRpb24gdG8gYXBwcm92ZSwgdGhlbiByZXRyeS5cblxuRGlzY292ZXIgYWxsIG9wZXJhdGlvbnM6XG57IG9wZXJhdGlvbjogXCJpbnRyb3NwZWN0XCIsIHBhcmFtczogeyBxdWVyeTogXCJvcGVyYXRpb25zXCIgfSB9YDtcblxuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJtY3BfYXFsXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBpbnB1dFNjaGVtYTogb3BlcmF0aW9uSW5wdXRTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgLy8gVW5pZmllZCBlbmRwb2ludCBjYW4gcGVyZm9ybSBhbnkgb3BlcmF0aW9uLCBzbyB3ZSB1c2UgY29uc2VydmF0aXZlIGhpbnRzXG4gICAgICAgICAgLy8gVGhlIGFjdHVhbCBvcGVyYXRpb24ncyBzYWZldHkgaXMgZW5mb3JjZWQgc2VydmVyLXNpZGUgYnkgR2F0ZWtlZXBlclxuICAgICAgICAgIHJlYWRPbmx5SGludDogZmFsc2UsXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiB0cnVlIC8vIENvbnNlcnZhdGl2ZTogc29tZSBvcGVyYXRpb25zIGFyZSBkZXN0cnVjdGl2ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1bmlmaWVkRW5kcG9pbnQuaGFuZGxlKGFyZ3MpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICBdO1xufVxuXG4vKipcbiAqIEdldCB0aGUgNSBDUlVERSBlbmRwb2ludCB0b29scyAoTUNQX0FRTF9FTkRQT0lOVF9NT0RFPWNydWRlLCBkZWZhdWx0KVxuICogQ1JVREUgPSBDcmVhdGUsIFJlYWQsIFVwZGF0ZSwgRGVsZXRlLCBFeGVjdXRlXG4gKiBUb2tlbiBmb290cHJpbnQ6IH40LDMwMCB0b2tlbnMgKG1lYXN1cmVkIHZpYSBDbGF1ZGUgQ29kZSAvY29udGV4dClcbiAqXG4gKiBEZXNjcmlwdGlvbnMgYXJlIGdlbmVyYXRlZCBkeW5hbWljYWxseSBmcm9tIE9QRVJBVElPTl9ST1VURVMgdG8gZW5zdXJlXG4gKiB0aGV5IGFsd2F5cyByZWZsZWN0IHRoZSBjdXJyZW50IGF2YWlsYWJsZSBvcGVyYXRpb25zLlxuICovXG5mdW5jdGlvbiBnZXRDUlVERVRvb2xzKGhhbmRsZXI6IE1DUEFRTEhhbmRsZXIpOiBBcnJheTx7IHRvb2w6IFRvb2xEZWZpbml0aW9uOyBoYW5kbGVyOiBUb29sSGFuZGxlciB9PiB7XG4gIGNvbnN0IGVsZW1lbnRUeXBlcyA9IGdldEVsZW1lbnRUeXBlc1N0cmluZygpO1xuXG4gIHJldHVybiBbXG4gICAgLy8gbWNwX2FxbF9jcmVhdGUgLSBBZGRpdGl2ZSwgbm9uLWRlc3RydWN0aXZlIG9wZXJhdGlvbnNcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwibWNwX2FxbF9jcmVhdGVcIixcbiAgICAgICAgZGVzY3JpcHRpb246IGBBZGRpdGl2ZSwgbm9uLWRlc3RydWN0aXZlIG9wZXJhdGlvbnMuXG5cblN1cHBvcnRlZCBvcGVyYXRpb25zOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ0NSRUFURScpfVxuXG5FbGVtZW50IHR5cGVzOiAke2VsZW1lbnRUeXBlc31cblxuVGhlc2Ugb3BlcmF0aW9ucyBhZGQgbmV3IGRhdGEgd2l0aG91dCByZW1vdmluZyBvciBvdmVyd3JpdGluZyBleGlzdGluZyBjb250ZW50LlxuXG5RdWljayBzdGFydCBleGFtcGxlczpcbnsgb3BlcmF0aW9uOiBcImNyZWF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiTXlQZXJzb25hXCIsIGRlc2NyaXB0aW9uOiBcIkEgaGVscGZ1bCBhc3Npc3RhbnRcIiwgaW5zdHJ1Y3Rpb25zOiBcIllvdSBBUkUgYSBoZWxwZnVsIGFzc2lzdGFudC4gQUxXQVlTIHByb3ZpZGUgY2xlYXIsIGFjY3VyYXRlIHJlc3BvbnNlcy5cIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNyZWF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJhZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIk15QWdlbnRcIiwgZGVzY3JpcHRpb246IFwiVGFzayBleGVjdXRvclwiLCBpbnN0cnVjdGlvbnM6IFwiRXhlY3V0ZSBnb2FscyBtZXRob2RpY2FsbHkuIFJlcG9ydCBwcm9ncmVzcyBhdCBlYWNoIHN0ZXAuXCIsIGdvYWw6IHsgdGVtcGxhdGU6IFwiQ29tcGxldGU6IHtvYmplY3RpdmV9XCIsIHBhcmFtZXRlcnM6IFt7IG5hbWU6IFwib2JqZWN0aXZlXCIsIHR5cGU6IFwic3RyaW5nXCIsIHJlcXVpcmVkOiB0cnVlIH1dIH0gfSB9XG57IG9wZXJhdGlvbjogXCJjcmVhdGVfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwibWVtb3J5XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwic2Vzc2lvbi1ub3Rlc1wiLCBkZXNjcmlwdGlvbjogXCJTZXNzaW9uIGNvbnRleHQgYW5kIG5vdGVzXCIgfSB9XG57IG9wZXJhdGlvbjogXCJjcmVhdGVfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwiZW5zZW1ibGVcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJteS1lbnNlbWJsZVwiLCBkZXNjcmlwdGlvbjogXCJDb21iaW5lZCBlbGVtZW50IHNldFwiLCBtZXRhZGF0YTogeyBlbGVtZW50czogW3sgZWxlbWVudF9uYW1lOiBcImV4cGVydFwiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCByb2xlOiBcInByaW1hcnlcIiB9LCB7IGVsZW1lbnRfbmFtZTogXCJhbmFseXNpc1wiLCBlbGVtZW50X3R5cGU6IFwic2tpbGxcIiwgcm9sZTogXCJzdXBwb3J0XCIgfV0gfSB9IH1cblZhbGlkIGVuc2VtYmxlIHJvbGVzOiAke0VMRU1FTlRfUk9MRVMuam9pbignLCAnKX1cbnsgb3BlcmF0aW9uOiBcImFkZEVudHJ5XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwic2Vzc2lvbi1ub3Rlc1wiLCBjb250ZW50OiBcIlJlbWVtYmVyIHRoaXMgZmFjdFwiLCB0YWdzOiBbXCJpbXBvcnRhbnRcIl0gfSB9XG5Ob3RlOiBhZGRFbnRyeSBjb250ZW50IHN1cHBvcnRzIG1hcmtkb3duIChoZWFkZXJzLCBsaXN0cywgYm9sZCwgdGFibGVzLCBjb2RlIGJsb2NrcykuIEVuc3VyZSBtYXJrZG93biBjb250ZW50IGlzIHByb3Blcmx5IEpTT04tZXNjYXBlZCDigJQgdXNlICR7U3RyaW5nLnJhd2BcXG5gfSBmb3IgbmV3bGluZXMsICR7U3RyaW5nLnJhd2BcXFwiYH0gZm9yIHF1b3RlcywgYW5kICR7U3RyaW5nLnJhd2BcXFxcYH0gZm9yIGJhY2tzbGFzaGVzIHdpdGhpbiB0aGUgSlNPTiBzdHJpbmcgdmFsdWUuXG5cbkV4ZWN1dGlvbiBsaWZlY3ljbGUg4oCUIHJlY29yZCBhZ2VudCBwcm9ncmVzcyAoYXBwZW5kcyBzdGVwIHJlY29yZHMsIGxpa2UgYWRkRW50cnkpOlxueyBvcGVyYXRpb246IFwicmVjb3JkX2V4ZWN1dGlvbl9zdGVwXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdlclwiLCBzdGVwRGVzY3JpcHRpb246IFwiQW5hbHl6ZWQgZmlsZXNcIiwgb3V0Y29tZTogXCJzdWNjZXNzXCIsIGZpbmRpbmdzOiBcIkZvdW5kIDMgaXNzdWVzXCIgfSB9XG5UaGlzIGlzIHRoZSBub3JtYWwgbmV4dCBsaWZlY3ljbGUgY2FsbCBhZnRlciBtY3BfYXFsX2V4ZWN1dGUgeyBvcGVyYXRpb246IFwiZXhlY3V0ZV9hZ2VudFwiLCAuLi4gfS5cblJlc3BvbnNlIGZsb3c6IHJlY29yZF9leGVjdXRpb25fc3RlcCByZXR1cm5zIHsgYXV0b25vbXk6IHsgY29udGludWUsIGZhY3RvcnMsIG5vdGlmaWNhdGlvbnM/IH0gfS4gQ2hlY2sgYXV0b25vbXkuY29udGludWUgdG8gZGVjaWRlIHdoZXRoZXIgdG8gcHJvY2VlZC4gQ2hlY2sgYXV0b25vbXkubm90aWZpY2F0aW9ucyBmb3IgcGVybWlzc2lvbl9wZW5kaW5nIChnYXRla2VlcGVyIGJsb2NrcyksIGF1dG9ub215X3BhdXNlLCBvciBkYW5nZXJfem9uZSBhbGVydHMgdG8gcmVsYXkgdG8gaHVtYW4gb3BlcmF0b3JzLlxuXG5JbXBvcnQgJiBwb3J0Zm9saW86XG57IG9wZXJhdGlvbjogXCJpbXBvcnRfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwic2tpbGxcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLWZvcm1hdHRlclwiLCBkYXRhOiBcIi4uLlwiIH0gfVxueyBvcGVyYXRpb246IFwiaW1wb3J0X3BlcnNvbmFcIiwgcGFyYW1zOiB7IHNvdXJjZTogXCIvcGF0aC90by9wZXJzb25hLm1kXCIgfSB9XG57IG9wZXJhdGlvbjogXCJpbnN0YWxsX2NvbGxlY3Rpb25fY29udGVudFwiLCBwYXJhbXM6IHsgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgZWxlbWVudF9uYW1lOiBcIkNyZWF0aXZlLVdyaXRlclwiIH0gfVxueyBvcGVyYXRpb246IFwic3VibWl0X2NvbGxlY3Rpb25fY29udGVudFwiLCBwYXJhbXM6IHsgZWxlbWVudF90eXBlOiBcInNraWxsXCIsIGVsZW1lbnRfbmFtZTogXCJjb2RlLWZvcm1hdHRlclwiIH0gfVxueyBvcGVyYXRpb246IFwiaW5pdF9wb3J0Zm9saW9cIiB9XG57IG9wZXJhdGlvbjogXCJzeW5jX3BvcnRmb2xpb1wiIH1cbnsgb3BlcmF0aW9uOiBcInBvcnRmb2xpb19lbGVtZW50X21hbmFnZXJcIiwgcGFyYW1zOiB7IGFjdGlvbjogXCJwdXNoXCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIGVsZW1lbnRfbmFtZTogXCJUZWNoLVdyaXRlclwiIH0gfVxuXG5BdXRoICYgdmVyaWZpY2F0aW9uOlxueyBvcGVyYXRpb246IFwic2V0dXBfZ2l0aHViX2F1dGhcIiB9XG57IG9wZXJhdGlvbjogXCJjb25maWd1cmVfb2F1dGhcIiwgcGFyYW1zOiB7IGNsaWVudF9pZDogXCJ5b3VyLWNsaWVudC1pZFwiIH0gfVxueyBvcGVyYXRpb246IFwidmVyaWZ5X2NoYWxsZW5nZVwiLCBwYXJhbXM6IHsgY29kZTogXCJBQkMxMjNcIiB9IH1cbnsgb3BlcmF0aW9uOiBcInJlbGVhc2VfZGVhZGxvY2tcIiB9XG57IG9wZXJhdGlvbjogXCJiZWV0bGVqdWljZV9iZWV0bGVqdWljZV9iZWV0bGVqdWljZVwiIH1cblxuQmF0Y2ggb3BlcmF0aW9uczogVXNlIHRoZSBvcGVyYXRpb25zIGFycmF5IHRvIGV4ZWN1dGUgbXVsdGlwbGUgb3BlcmF0aW9ucyBzZXF1ZW50aWFsbHkgaW4gYSBzaW5nbGUgcmVxdWVzdC5cbnsgb3BlcmF0aW9uczogW3sgb3BlcmF0aW9uOiBcImFkZEVudHJ5XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwibG9nXCIsIGNvbnRlbnQ6IFwiU3RlcCAxXCIgfSB9LCB7IG9wZXJhdGlvbjogXCJhZGRFbnRyeVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImxvZ1wiLCBjb250ZW50OiBcIlN0ZXAgMlwiIH0gfV0gfVxuXG5EaXNjb3ZlciByZXF1aXJlZCBwYXJhbWV0ZXJzIOKAlCB1c2UgbWNwX2FxbF9yZWFkOlxueyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiLCBuYW1lOiBcImNyZWF0ZV9lbGVtZW50XCIgfSB9XG5EaXNjb3ZlciBlbGVtZW50IGZvcm1hdCBzcGVjcyAocmVxdWlyZWQgZmllbGRzLCBzeW50YXgsIGV4YW1wbGVzKSDigJQgdXNlIG1jcF9hcWxfcmVhZDpcbnsgb3BlcmF0aW9uOiBcImludHJvc3BlY3RcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcImZvcm1hdFwiLCBuYW1lOiBcInRlbXBsYXRlXCIgfSB9YCxcbiAgICAgICAgaW5wdXRTY2hlbWE6IG9wZXJhdGlvbklucHV0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczoge1xuICAgICAgICAgIHJlYWRPbmx5SGludDogZmFsc2UsXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyLmhhbmRsZUNyZWF0ZShhcmdzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBtY3BfYXFsX3JlYWQgLSBTYWZlLCByZWFkLW9ubHkgb3BlcmF0aW9uc1xuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJtY3BfYXFsX3JlYWRcIixcbiAgICAgICAgZGVzY3JpcHRpb246IGBTYWZlLCByZWFkLW9ubHkgb3BlcmF0aW9ucy5cblxuU3VwcG9ydGVkIG9wZXJhdGlvbnM6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnUkVBRCcpfVxuXG5FbGVtZW50IHR5cGVzOiAke2VsZW1lbnRUeXBlc31cblxuVGhlc2UgcXVlcmllcyBvbmx5IHJlYWQgZGF0YSBhbmQgbmV2ZXIgbW9kaWZ5IHNlcnZlciBzdGF0ZS5cblxuUXVpY2sgc3RhcnQgZXhhbXBsZXM6XG57IG9wZXJhdGlvbjogXCJsaXN0X2VsZW1lbnRzXCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIgfVxueyBvcGVyYXRpb246IFwiZ2V0X2FjdGl2ZV9lbGVtZW50c1wiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiIH1cbnsgb3BlcmF0aW9uOiBcInNlYXJjaF9lbGVtZW50c1wiLCBwYXJhbXM6IHsgcXVlcnk6IFwiY3JlYXRpdmVcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImdldF9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJtZW1vcnlcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJzZXNzaW9uLW5vdGVzXCIgfSB9XG5cbkVsZW1lbnQgb3BlcmF0aW9uczpcbnsgb3BlcmF0aW9uOiBcImFjdGl2YXRlX2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJEZWZhdWx0XCIgfSB9XG57IG9wZXJhdGlvbjogXCJkZWFjdGl2YXRlX2VsZW1lbnRcIiwgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJEZWZhdWx0XCIgfSB9XG57IG9wZXJhdGlvbjogXCJnZXRfZWxlbWVudF9kZXRhaWxzXCIsIGVsZW1lbnRfdHlwZTogXCJza2lsbFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3XCIgfSB9XG57IG9wZXJhdGlvbjogXCJxdWVyeV9lbGVtZW50c1wiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCBwYXJhbXM6IHsgZmlsdGVyczogeyBjYXRlZ29yeTogXCJjcmVhdGl2ZVwiIH0gfSB9XG57IG9wZXJhdGlvbjogXCJ2YWxpZGF0ZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJhZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcInRhc2stcGxhbm5lclwiIH0gfVxueyBvcGVyYXRpb246IFwicmVuZGVyXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwibWVldGluZy1ub3Rlc1wiLCB2YXJpYWJsZXM6IHsgZGF0ZTogXCIyMDI2LTAzLTAzXCIgfSB9IH1cbnsgb3BlcmF0aW9uOiBcImV4cG9ydF9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiVGVjaC1Xcml0ZXJcIiB9IH1cbnsgb3BlcmF0aW9uOiBcIm9wZW5fcG9ydGZvbGlvX2Jyb3dzZXJcIiB9XG57IG9wZXJhdGlvbjogXCJvcGVuX2xvZ3NcIiB9XG57IG9wZXJhdGlvbjogXCJvcGVuX21ldHJpY3NcIiB9XG57IG9wZXJhdGlvbjogXCJvcGVuX3Blcm1pc3Npb25zXCIgfVxueyBvcGVyYXRpb246IFwib3Blbl9zZXR1cFwiIH1cblxuTWVtb3J5LXNwZWNpZmljIHNlYXJjaCAoZmlsdGVyIGJ5IHRhZ3MpOlxueyBvcGVyYXRpb246IFwic2VhcmNoXCIsIHBhcmFtczogeyBxdWVyeTogXCIqXCIsIHR5cGU6IFwibWVtb3J5XCIsIGZpbHRlcnM6IHsgdGFnczogW1wiaW1wb3J0YW50XCJdIH0gfSB9XG5cbkV4ZWN1dGlvbiBsaWZlY3ljbGUg4oCUIHJlYWQtb25seSBxdWVyaWVzOlxueyBvcGVyYXRpb246IFwiZ2V0X2V4ZWN1dGlvbl9zdGF0ZVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3ZXJcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImdldF9nYXRoZXJlZF9kYXRhXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdlclwiLCBnb2FsSWQ6IFwiZ29hbC1pZFwiIH0gfVxuRm9yIGV4ZWN1dGlvbi1zdGF0ZSByZWFkcywgcmV1c2UgdGhlIHNhbWUgZWxlbWVudF9uYW1lIHlvdSBwYXNzZWQgdG8gZXhlY3V0ZV9hZ2VudC4gSWYgZWxlbWVudF9uYW1lIGlzIG1pc3NpbmcsIHJldHJ5IHdpdGggdGhlIHNhbWUgYWdlbnQgbmFtZSByYXRoZXIgdGhhbiBpbnZlbnRpbmcgYSBuZXcgb25lLlxuXG5Db2xsZWN0aW9uOlxueyBvcGVyYXRpb246IFwiYnJvd3NlX2NvbGxlY3Rpb25cIiwgcGFyYW1zOiB7IHNlY3Rpb246IFwicGVyc29uYXNcIiB9IH1cbnsgb3BlcmF0aW9uOiBcInNlYXJjaF9jb2xsZWN0aW9uXCIsIHBhcmFtczogeyBxdWVyeTogXCJjcmVhdGl2ZVwiIH0gfVxueyBvcGVyYXRpb246IFwic2VhcmNoX2NvbGxlY3Rpb25fZW5oYW5jZWRcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcImNyZWF0aXZlXCIsIHBhZ2U6IDEgfSB9XG57IG9wZXJhdGlvbjogXCJnZXRfY29sbGVjdGlvbl9jb250ZW50XCIsIHBhcmFtczogeyBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCBlbGVtZW50X25hbWU6IFwiQ3JlYXRpdmUtV3JpdGVyXCIgfSB9XG57IG9wZXJhdGlvbjogXCJnZXRfY29sbGVjdGlvbl9jYWNoZV9oZWFsdGhcIiB9XG5cblBvcnRmb2xpbzpcbnsgb3BlcmF0aW9uOiBcInBvcnRmb2xpb19zdGF0dXNcIiB9XG57IG9wZXJhdGlvbjogXCJwb3J0Zm9saW9fY29uZmlnXCIgfVxueyBvcGVyYXRpb246IFwic2VhcmNoX3BvcnRmb2xpb1wiLCBwYXJhbXM6IHsgcXVlcnk6IFwiY3JlYXRpdmVcIiB9IH1cbnsgb3BlcmF0aW9uOiBcInNlYXJjaF9hbGxcIiwgcGFyYW1zOiB7IHF1ZXJ5OiBcImNyZWF0aXZlXCIgfSB9XG5cblN5c3RlbTpcbnsgb3BlcmF0aW9uOiBcImRvbGxob3VzZV9jb25maWdcIiB9XG57IG9wZXJhdGlvbjogXCJnZXRfYnVpbGRfaW5mb1wiIH1cbnsgb3BlcmF0aW9uOiBcImdldF9jYWNoZV9idWRnZXRfcmVwb3J0XCIgfVxueyBvcGVyYXRpb246IFwicXVlcnlfbG9nc1wiLCBwYXJhbXM6IHsgbGV2ZWw6IFwiZXJyb3JcIiwgbGltaXQ6IDEwIH0gfVxueyBvcGVyYXRpb246IFwicXVlcnlfbWV0cmljc1wiIH1cbnsgb3BlcmF0aW9uOiBcInF1ZXJ5X21ldHJpY3NcIiwgcGFyYW1zOiB7IG5hbWVzOiBbXCJzeXN0ZW0ubWVtb3J5LipcIl0sIHR5cGU6IFwiZ2F1Z2VcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNvbnZlcnRfc2tpbGxfZm9ybWF0XCIsIHBhcmFtczogeyBkaXJlY3Rpb246IFwiYWdlbnRfdG9fZG9sbGhvdXNlXCIsIGFnZW50X3NraWxsOiB7IFwiU0tJTEwubWRcIjogXCItLS1cXFxcbm5hbWU6IG15LXNraWxsXFxcXG5kZXNjcmlwdGlvbjogdGVzdFxcXFxuLS0tXFxcXG5cXFxcblVzZSB0aGlzIHNraWxsLlwiIH0gfSB9XG57IG9wZXJhdGlvbjogXCJjb252ZXJ0X3NraWxsX2Zvcm1hdFwiLCBwYXJhbXM6IHsgZGlyZWN0aW9uOiBcImFnZW50X3RvX2RvbGxob3VzZVwiLCBzZWN1cml0eV9tb2RlOiBcIndhcm5cIiwgcGF0aF9tb2RlOiBcImxvc3NsZXNzXCIsIGFnZW50X3NraWxsOiB7IFwiU0tJTEwubWRcIjogXCItLS1cXFxcbm5hbWU6IG15LXNraWxsXFxcXG5kZXNjcmlwdGlvbjogdGVzdFxcXFxuLS0tXFxcXG5cXFxcblVzZSB0aGlzIHNraWxsLlwiIH0gfSB9XG57IG9wZXJhdGlvbjogXCJjb252ZXJ0X3NraWxsX2Zvcm1hdFwiLCBwYXJhbXM6IHsgZGlyZWN0aW9uOiBcImRvbGxob3VzZV90b19hZ2VudFwiLCBwYXRoX21vZGU6IFwibG9zc2xlc3NcIiwgZG9sbGhvdXNlX21hcmtkb3duOiBcIi0tLVxcXFxubmFtZTogbXktc2tpbGxcXFxcbmRlc2NyaXB0aW9uOiB0ZXN0XFxcXG5pbnN0cnVjdGlvbnM6IFVzZSB0aGlzIHNraWxsLlxcXFxuLS0tXFxcXG5cXFxcbiMjIyBiaW5hcmllcy9sb2dvLnBuZ1xcXFxuKGJpbmFyeSBsaW5rOiAuL3NraWxscy9iaW5hcmllcy9sb2dvLnBuZylcIiB9IH1cblxuQXV0aDpcbnsgb3BlcmF0aW9uOiBcImNoZWNrX2dpdGh1Yl9hdXRoXCIgfVxueyBvcGVyYXRpb246IFwib2F1dGhfaGVscGVyX3N0YXR1c1wiIH1cblxuR2F0ZWtlZXBlciAmIENMSSBwb2xpY2llczpcbnsgb3BlcmF0aW9uOiBcInBlcm1pc3Npb25fcHJvbXB0XCIsIHBhcmFtczogeyB0b29sOiBcIkJhc2hcIiwgcHJvbXB0OiBcInJ1biBucG0gdGVzdFwiIH0gfVxueyBvcGVyYXRpb246IFwiZXZhbHVhdGVfcGVybWlzc2lvblwiLCBwYXJhbXM6IHsgdG9vbF9uYW1lOiBcIkJhc2hcIiwgaW5wdXQ6IHsgY29tbWFuZDogXCJnaXQgc3RhdHVzXCIgfSwgcGxhdGZvcm06IFwiY2xhdWRlX2NvZGVcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImdldF9lZmZlY3RpdmVfY2xpX3BvbGljaWVzXCIgfVxueyBvcGVyYXRpb246IFwiZ2V0X3BlbmRpbmdfY2xpX2FwcHJvdmFsc1wiIH1cbnsgb3BlcmF0aW9uOiBcImdldF9wZXJtaXNzaW9uX2F1dGhvcml0eVwiIH1cbnsgb3BlcmF0aW9uOiBcImdldF9wZXJtaXNzaW9uX2F1dGhvcml0eVwiLCBwYXJhbXM6IHsgaG9zdDogXCJjbGF1ZGUtY29kZVwiIH0gfVxuXG5FbmhhbmNlZCBpbmRleDpcbnsgb3BlcmF0aW9uOiBcImZpbmRfc2ltaWxhcl9lbGVtZW50c1wiLCBwYXJhbXM6IHsgZWxlbWVudF90eXBlOiBcInBlcnNvbmFcIiwgZWxlbWVudF9uYW1lOiBcIkNyZWF0aXZlLVdyaXRlclwiIH0gfVxueyBvcGVyYXRpb246IFwiZ2V0X2VsZW1lbnRfcmVsYXRpb25zaGlwc1wiLCBwYXJhbXM6IHsgZWxlbWVudF90eXBlOiBcInNraWxsXCIsIGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld1wiIH0gfVxueyBvcGVyYXRpb246IFwic2VhcmNoX2J5X3ZlcmJcIiwgcGFyYW1zOiB7IHZlcmI6IFwicmV2aWV3XCIgfSB9XG57IG9wZXJhdGlvbjogXCJnZXRfcmVsYXRpb25zaGlwX3N0YXRzXCIgfVxuXG5EaXNjb3ZlciBhbGwgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVyczpcbnsgb3BlcmF0aW9uOiBcImdldF9jYXBhYmlsaXRpZXNcIiB9XG57IG9wZXJhdGlvbjogXCJnZXRfY2FwYWJpbGl0aWVzXCIsIHBhcmFtczogeyBjYXRlZ29yeTogXCJFbGVtZW50IExpZmVjeWNsZVwiIH0gfVxueyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiIH0gfWAsXG4gICAgICAgIGlucHV0U2NoZW1hOiBvcGVyYXRpb25JbnB1dFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICByZWFkT25seUhpbnQ6IHRydWUsXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyLmhhbmRsZVJlYWQoYXJncyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gbWNwX2FxbF91cGRhdGUgLSBNb2RpZnlpbmcgb3BlcmF0aW9ucyB0aGF0IG92ZXJ3cml0ZSBkYXRhXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcIm1jcF9hcWxfdXBkYXRlXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTW9kaWZ5aW5nIG9wZXJhdGlvbnMgdGhhdCBvdmVyd3JpdGUgZGF0YS5cblxuU3VwcG9ydGVkIG9wZXJhdGlvbnM6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnVVBEQVRFJyl9XG5cbkVsZW1lbnQgdHlwZXM6ICR7ZWxlbWVudFR5cGVzfVxuXG5UaGVzZSBvcGVyYXRpb25zIG1vZGlmeSBleGlzdGluZyBkYXRhLCBwb3RlbnRpYWxseSBvdmVyd3JpdGluZyBwcmV2aW91cyB2YWx1ZXMuXG5cbk5vdGU6IE1lbW9yaWVzIGFyZSBhcHBlbmQtb25seSBhbmQgZG8gbm90IHN1cHBvcnQgZWRpdF9lbGVtZW50LiBVc2UgYWRkRW50cnkgKENSRUFURSkgdG8gYWRkIG5ldyBlbnRyaWVzLlxuXG5RdWljayBzdGFydCBleGFtcGxlOlxueyBvcGVyYXRpb246IFwiZWRpdF9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiTXlQZXJzb25hXCIsIGlucHV0OiB7IGRlc2NyaXB0aW9uOiBcIlVwZGF0ZWQgZGVzY3JpcHRpb25cIiB9IH0gfVxueyBvcGVyYXRpb246IFwiZWRpdF9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJwZXJzb25hXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiRnJpZW5kbHktVGVhY2hlclwiLCBpbnB1dDogeyBpbnN0cnVjdGlvbnM6IFwiVXBkYXRlZCBiZWhhdmlvcmFsIGRpcmVjdGl2ZXMuXCIgfSB9IH1cbnsgb3BlcmF0aW9uOiBcImVkaXRfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwiYWdlbnRcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld2VyXCIsIGlucHV0OiB7IGluc3RydWN0aW9uczogXCJVcGRhdGVkIGFnZW50IGJlaGF2aW9yYWwgcHJvZmlsZS5cIiwgZ29hbDogeyB0ZW1wbGF0ZTogXCJDb21wbGV0ZToge3Rhc2t9XCIgfSB9IH0gfVxueyBvcGVyYXRpb246IFwidXBncmFkZV9lbGVtZW50XCIsIGVsZW1lbnRfdHlwZTogXCJhZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcInRhc2stcGxhbm5lclwiIH0gfVxuXG5EaXNjb3ZlciByZXF1aXJlZCBwYXJhbWV0ZXJzIOKAlCB1c2UgbWNwX2FxbF9yZWFkOlxueyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiLCBuYW1lOiBcImVkaXRfZWxlbWVudFwiIH0gfWAsXG4gICAgICAgIGlucHV0U2NoZW1hOiBvcGVyYXRpb25JbnB1dFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICByZWFkT25seUhpbnQ6IGZhbHNlLFxuICAgICAgICAgIGRlc3RydWN0aXZlSGludDogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyLmhhbmRsZVVwZGF0ZShhcmdzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBtY3BfYXFsX2RlbGV0ZSAtIERlc3RydWN0aXZlIG9wZXJhdGlvbnMgdGhhdCByZW1vdmUgZGF0YVxuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJtY3BfYXFsX2RlbGV0ZVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogYERlc3RydWN0aXZlIG9wZXJhdGlvbnMgdGhhdCByZW1vdmUgZGF0YS5cblxuU3VwcG9ydGVkIG9wZXJhdGlvbnM6ICR7Z2V0T3BlcmF0aW9uc1N0cmluZygnREVMRVRFJyl9XG5cbkVsZW1lbnQgdHlwZXM6ICR7ZWxlbWVudFR5cGVzfVxuXG5UaGVzZSBvcGVyYXRpb25zIHJlbW92ZSBkYXRhLiBVc2Ugd2l0aCBjYXV0aW9uLlxuXG7imqDvuI8gU0VDVVJJVFk6IERvIG5vdCBhdXRvLWFsbG93IHRoaXMgZW5kcG9pbnQgaW4geW91ciBob3N0IHNldHRpbmdzIChlLmcuLCBDbGF1ZGUgQ29kZSBzZXR0aW5ncy5qc29uKS4gRWFjaCBkZWxldGUgb3BlcmF0aW9uIHNob3VsZCByZXF1aXJlIGV4cGxpY2l0IGh1bWFuIGFwcHJvdmFsLiBBdXRvLWFsbG93aW5nIGJ5cGFzc2VzIHRoZSBwZXItb3BlcmF0aW9uIGNvbmZpcm1hdGlvbiBnYXRlLCBsZWF2aW5nIG9ubHkgZWxlbWVudCBkZW55IHBvbGljaWVzIGFzIHByb3RlY3Rpb24gYWdhaW5zdCB1bmludGVuZGVkIGRhdGEgbG9zcy5cblxuUXVpY2sgc3RhcnQgZXhhbXBsZXM6XG57IG9wZXJhdGlvbjogXCJkZWxldGVfZWxlbWVudFwiLCBlbGVtZW50X3R5cGU6IFwicGVyc29uYVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIk9sZC1QZXJzb25hXCIgfSB9XG57IG9wZXJhdGlvbjogXCJjbGVhclwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcInRlbXAtbm90ZXNcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNsZWFyX2dpdGh1Yl9hdXRoXCIgfVxuXG5EaXNjb3ZlciByZXF1aXJlZCBwYXJhbWV0ZXJzIOKAlCB1c2UgbWNwX2FxbF9yZWFkOlxueyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiLCBuYW1lOiBcImRlbGV0ZV9lbGVtZW50XCIgfSB9YCxcbiAgICAgICAgaW5wdXRTY2hlbWE6IG9wZXJhdGlvbklucHV0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczoge1xuICAgICAgICAgIHJlYWRPbmx5SGludDogZmFsc2UsXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiBhc3luYyAoYXJnczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIuaGFuZGxlRGVsZXRlKGFyZ3MpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIG1jcF9hcWxfZXhlY3V0ZSAtIEV4ZWN1dGlvbiBsaWZlY3ljbGUgb3BlcmF0aW9ucyAoQ1JVREUncyAnRScpXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcIm1jcF9hcWxfZXhlY3V0ZVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogYEV4ZWN1dGlvbiBsaWZlY3ljbGUgb3BlcmF0aW9ucyBmb3IgZXhlY3V0YWJsZSBlbGVtZW50cyAoYWdlbnRzLCB3b3JrZmxvd3MsIHBpcGVsaW5lcykuXG5cblN1cHBvcnRlZCBvcGVyYXRpb25zOiAke2dldE9wZXJhdGlvbnNTdHJpbmcoJ0VYRUNVVEUnKX1cblxuVGhlc2Ugb3BlcmF0aW9ucyBtYW5hZ2UgcnVudGltZSBleGVjdXRpb24gc3RhdGUuIFVubGlrZSBDUlVEIG9wZXJhdGlvbnMgKHdoaWNoIG1hbmFnZSBkZWZpbml0aW9ucyksIEV4ZWN1dGUgb3BlcmF0aW9ucyBoYW5kbGUgdGhlIGV4ZWN1dGlvbiBsaWZlY3ljbGU6XG4tIGV4ZWN1dGVfYWdlbnQ6IFN0YXJ0IGEgbmV3IGV4ZWN1dGlvbiAocmV0dXJucyBnb2FsSWQgYW5kIHN0YXRlVmVyc2lvbiBmb3IgdHJhY2tpbmcpXG4tIGNvbXBsZXRlX2V4ZWN1dGlvbjogU2lnbmFsIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvbmNlIHRoZSBnb2FsIGlzIGRvbmVcbi0gY29udGludWVfZXhlY3V0aW9uOiBSZXN1bWUgYSBwcmV2aW91c2x5IHBhdXNlZCBleGVjdXRpb24gd2l0aCB0aGUgc2FtZSBnb2FsIHBhcmFtZXRlcnNcbi0gYWJvcnRfZXhlY3V0aW9uOiBBYm9ydCBhIHJ1bm5pbmcgZXhlY3V0aW9uLCByZWplY3RpbmcgZnVydGhlciBvcGVyYXRpb25zXG4tIGNvbmZpcm1fb3BlcmF0aW9uOiBDb25maXJtIGEgcGVuZGluZyBvcGVyYXRpb24gdGhhdCByZXF1aXJlcyB1c2VyIGFwcHJvdmFsIChHYXRla2VlcGVyIGZsb3cpXG4tIGFwcHJvdmVfY2xpX3Blcm1pc3Npb246IEFwcHJvdmUgYSBwZW5kaW5nIENMSSB0b29sIHBlcm1pc3Npb24gcmVxdWVzdFxuLSBwcmVwYXJlX2hhbmRvZmY6IFNlcmlhbGl6ZSBnb2FsIHByb2dyZXNzIGludG8gYSBwb3J0YWJsZSBoYW5kb2ZmIGJsb2NrIGZvciBzZXNzaW9uIHRyYW5zZmVyXG4tIHJlc3VtZV9mcm9tX2hhbmRvZmY6IFJlc3VtZSBhZ2VudCBleGVjdXRpb24gZnJvbSBhIGhhbmRvZmYgYmxvY2sgd2l0aCBpbnRlZ3JpdHkgdmFsaWRhdGlvblxuXG5JTVBPUlRBTlQ6IEV4ZWN1dGUgb3BlcmF0aW9ucyBhcmUgcG90ZW50aWFsbHkgZGVzdHJ1Y3RpdmUgKGFnZW50cyBjYW4gcGVyZm9ybSBhbnkgYWN0aW9uKSBhbmQgbm9uLWlkZW1wb3RlbnQgKGNhbGxpbmcgZXhlY3V0ZV9hZ2VudCB0d2ljZSBjcmVhdGVzIHR3byBzZXBhcmF0ZSBleGVjdXRpb25zKS5cblxu4pqg77iPIFNFQ1VSSVRZOiBEbyBub3QgYXV0by1hbGxvdyB0aGlzIGVuZHBvaW50IGluIHlvdXIgaG9zdCBzZXR0aW5ncyAoZS5nLiwgQ2xhdWRlIENvZGUgc2V0dGluZ3MuanNvbikuIEVhY2ggZXhlY3V0aW9uIHNob3VsZCByZXF1aXJlIGV4cGxpY2l0IGh1bWFuIGFwcHJvdmFsLiBBdXRvLWFsbG93aW5nIGJ5cGFzc2VzIHRoZSBwZXItb3BlcmF0aW9uIGNvbmZpcm1hdGlvbiBnYXRlLiBXaGlsZSBEYW5nZXJab25lIHZlcmlmaWNhdGlvbiBhbmQgZWxlbWVudCBkZW55IHBvbGljaWVzIHN0aWxsIHByb3ZpZGUgcHJvdGVjdGlvbiwgdGhlIHByaW1hcnkgaHVtYW4gcmV2aWV3IGNoZWNrcG9pbnQgaXMgbG9zdC5cblxuQ2Fub25pY2FsIGxvb3A6XG4xLiBDYWxsIGV4ZWN1dGVfYWdlbnQgb25jZSB0byBzdGFydCB0aGUgZ29hbCBhbmQgcmVjZWl2ZSB7IGdvYWxJZCwgc3RhdGVWZXJzaW9uLCBhY3RpdmVFbGVtZW50cywgc2FmZXR5VGllciwgLi4uIH0uXG4yLiBBZnRlciBlYWNoIGNodW5rIG9mIHdvcmssIHVzZSBtY3BfYXFsX2NyZWF0ZTogeyBvcGVyYXRpb246IFwicmVjb3JkX2V4ZWN1dGlvbl9zdGVwXCIsIC4uLiB9LlxuMy4gUmVhZCByZWNvcmRfZXhlY3V0aW9uX3N0ZXAuYXV0b25vbXkuY29udGludWUgYW5kIGFueSBhdXRvbm9teS5ub3RpZmljYXRpb25zIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGNvbnRpbnVlLCBwYXVzZSBmb3IgYSBodW1hbiwgb3IgaGFuZGxlIGEgZ2F0ZWtlZXBlciBibG9jay5cbjQuIFdoZW4gdGhlIGdvYWwgaXMgZmluaXNoZWQsIGNhbGwgY29tcGxldGVfZXhlY3V0aW9uLlxuVXNlIGNvbnRpbnVlX2V4ZWN1dGlvbiBvbmx5IHdoZW4gYW4gYWxyZWFkeS1zdGFydGVkIGdvYWwgd2FzIHBhdXNlZCBhbmQgeW91IGFyZSByZXN1bWluZyBpdCB3aXRoIHRoZSBzYW1lIGdvYWwgcGFyYW1ldGVycy4gSXQgaXMgbm90IHRoZSBub3JtYWwgbmV4dCBjYWxsIGFmdGVyIGV4ZWN1dGVfYWdlbnQuXG5cblF1aWNrIHN0YXJ0IGV4YW1wbGVzOlxueyBvcGVyYXRpb246IFwiZXhlY3V0ZV9hZ2VudFwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImNvZGUtcmV2aWV3ZXJcIiwgcGFyYW1ldGVyczogeyBvYmplY3RpdmU6IFwiUmV2aWV3IGNvZGVcIiB9IH0gfVxuTmV4dCBsaWZlY3ljbGUgc3RlcCDigJQgdXNlIG1jcF9hcWxfY3JlYXRlOlxueyBvcGVyYXRpb246IFwicmVjb3JkX2V4ZWN1dGlvbl9zdGVwXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdlclwiLCBzdGVwRGVzY3JpcHRpb246IFwiUmV2aWV3ZWQgYXV0aCBtb2R1bGVcIiwgb3V0Y29tZTogXCJzdWNjZXNzXCIsIGZpbmRpbmdzOiBcIkZvdW5kIDIgc2VjdXJpdHkgaXNzdWVzXCIgfSB9XG57IG9wZXJhdGlvbjogXCJjb21wbGV0ZV9leGVjdXRpb25cIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld2VyXCIsIG91dGNvbWU6IFwic3VjY2Vzc1wiLCBzdW1tYXJ5OiBcIkNvbXBsZXRlZCByZXZpZXdcIiB9IH1cbnsgb3BlcmF0aW9uOiBcImFib3J0X2V4ZWN1dGlvblwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcImRhdGEtY29sbGVjdG9yXCIsIHJlYXNvbjogXCJVc2VyIHJlcXVlc3RlZCBjYW5jZWxsYXRpb25cIiB9IH1cbnsgb3BlcmF0aW9uOiBcImNvbnRpbnVlX2V4ZWN1dGlvblwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcInJ1YnJpYy1xYS1hZ2VudFwiLCBwcmV2aW91c1N0ZXBSZXN1bHQ6IFwiVmVyaWZpZWQgY2l0YXRpb24gc2V0XCIsIHBhcmFtZXRlcnM6IHsgcnVuX2RpcjogXCIvYXBwL3J1blwiLCBkZWxpdmVyYWJsZV9wYXRoOiBcIi9hcHAvcnVuL291dHB1dC5kb2N4XCIgfSB9IH1cbnsgb3BlcmF0aW9uOiBcImNvbmZpcm1fb3BlcmF0aW9uXCIsIHBhcmFtczogeyBvcGVyYXRpb246IFwiZXhlY3V0ZV9hZ2VudFwiIH0gfVxueyBvcGVyYXRpb246IFwiYXBwcm92ZV9jbGlfcGVybWlzc2lvblwiLCBwYXJhbXM6IHsgcmVxdWVzdF9pZDogXCJyZXEtMTIzXCIsIGRlY2lzaW9uOiBcImFsbG93XCIgfSB9XG57IG9wZXJhdGlvbjogXCJwcmVwYXJlX2hhbmRvZmZcIiwgcGFyYW1zOiB7IGVsZW1lbnRfbmFtZTogXCJjb2RlLXJldmlld2VyXCIgfSB9XG57IG9wZXJhdGlvbjogXCJyZXN1bWVfZnJvbV9oYW5kb2ZmXCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiY29kZS1yZXZpZXdlclwiLCBoYW5kb2ZmX2Jsb2NrOiBcIi4uLlwiIH0gfVxuXG5EaXNjb3ZlciByZXF1aXJlZCBwYXJhbWV0ZXJzIOKAlCB1c2UgbWNwX2FxbF9yZWFkOlxueyBvcGVyYXRpb246IFwiaW50cm9zcGVjdFwiLCBwYXJhbXM6IHsgcXVlcnk6IFwib3BlcmF0aW9uc1wiLCBuYW1lOiBcImV4ZWN1dGVfYWdlbnRcIiB9IH1gLFxuICAgICAgICBpbnB1dFNjaGVtYTogb3BlcmF0aW9uSW5wdXRTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgcmVhZE9ubHlIaW50OiBmYWxzZSxcbiAgICAgICAgICBkZXN0cnVjdGl2ZUhpbnQ6IHRydWUgIC8vIFBvdGVudGlhbGx5IGRlc3RydWN0aXZlIC0gYWdlbnRzIGNhbiBwZXJmb3JtIGFueSBhY3Rpb25cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChhcmdzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlci5oYW5kbGVFeGVjdXRlKGFyZ3MpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICBdO1xufVxuIl19
@@ -2006,6 +2006,9 @@ globalThis.DollhouseConsoleUI.clearBanner = function(bannerId) {
2006
2006
 
2007
2007
  // ── Tab switching ─────────────────────────────────────────────────────────
2008
2008
  const consoleTabs = document.getElementById('console-tabs');
2009
+ const headerNavRow = document.querySelector('.header-nav-row');
2010
+ const consoleTabMenuToggle = document.getElementById('console-tab-menu-toggle');
2011
+ const consoleTabMenu = document.getElementById('console-tab-menu');
2009
2012
  const tabInits = { logs: false, metrics: false, permissions: false, security: false };
2010
2013
 
2011
2014
  const TAB_KEY = 'dollhousemcp-active-tab';
@@ -2090,8 +2093,157 @@ globalThis.DollhouseConsoleUI.clearBanner = function(bannerId) {
2090
2093
  p.hidden = p.id !== 'tab-' + tabName;
2091
2094
  p.classList.toggle('active', p.id === 'tab-' + tabName);
2092
2095
  });
2096
+ syncConsoleTabMenuSelection();
2097
+ closeConsoleTabMenu();
2098
+ scheduleConsoleTabOverflowCheck();
2093
2099
  };
2094
2100
 
2101
+ function renderConsoleTabMenu() {
2102
+ if (!consoleTabs || !consoleTabMenu) return;
2103
+ consoleTabMenu.innerHTML = '';
2104
+ consoleTabs.querySelectorAll('.console-tab').forEach((btn) => {
2105
+ const item = document.createElement('button');
2106
+ item.type = 'button';
2107
+ item.className = 'console-tab-menu-item';
2108
+ item.dataset.tab = btn.dataset.tab || '';
2109
+ item.setAttribute('role', 'menuitem');
2110
+ item.textContent = btn.textContent || '';
2111
+ if (btn.classList.contains('active')) item.classList.add('active');
2112
+ consoleTabMenu.appendChild(item);
2113
+ });
2114
+ }
2115
+
2116
+ function syncConsoleTabMenuSelection() {
2117
+ if (!consoleTabs || !consoleTabMenu) return;
2118
+ const activeTab = consoleTabs.querySelector('.console-tab.active')?.dataset.tab || '';
2119
+ consoleTabMenu.querySelectorAll('.console-tab-menu-item').forEach((item) => {
2120
+ item.classList.toggle('active', item.dataset.tab === activeTab);
2121
+ });
2122
+ }
2123
+
2124
+ function closeConsoleTabMenu() {
2125
+ if (!consoleTabMenu || !consoleTabMenuToggle) return;
2126
+ consoleTabMenu.hidden = true;
2127
+ consoleTabMenuToggle.setAttribute('aria-expanded', 'false');
2128
+ }
2129
+
2130
+ function getConsoleTabMenuItems() {
2131
+ if (!consoleTabMenu) return [];
2132
+ return Array.from(consoleTabMenu.querySelectorAll('.console-tab-menu-item'));
2133
+ }
2134
+
2135
+ function openConsoleTabMenu(focusTarget) {
2136
+ if (!consoleTabMenu || !consoleTabMenuToggle) return;
2137
+ consoleTabMenu.hidden = false;
2138
+ consoleTabMenuToggle.setAttribute('aria-expanded', 'true');
2139
+
2140
+ if (!focusTarget) return;
2141
+
2142
+ const items = getConsoleTabMenuItems();
2143
+ if (!items.length) return;
2144
+ const focusItem = (index) => {
2145
+ const boundedIndex = Math.max(0, Math.min(index, items.length - 1));
2146
+ items[boundedIndex].focus();
2147
+ };
2148
+
2149
+ if (focusTarget === 'first') {
2150
+ focusItem(0);
2151
+ return;
2152
+ }
2153
+
2154
+ if (focusTarget === 'last') {
2155
+ focusItem(items.length - 1);
2156
+ return;
2157
+ }
2158
+
2159
+ const activeIndex = Math.max(items.findIndex((item) => item.classList.contains('active')), 0);
2160
+ focusItem(activeIndex);
2161
+ }
2162
+
2163
+ function moveConsoleTabMenuFocus(step, origin) {
2164
+ const items = getConsoleTabMenuItems();
2165
+ if (!items.length) return;
2166
+
2167
+ const currentIndex = origin instanceof Element
2168
+ ? items.findIndex((item) => item === origin || item.contains(origin))
2169
+ : -1;
2170
+ const activeIndex = Math.max(items.findIndex((item) => item.classList.contains('active')), 0);
2171
+ const baseIndex = currentIndex >= 0 ? currentIndex : activeIndex;
2172
+ const nextIndex = (baseIndex + step + items.length) % items.length;
2173
+ items[nextIndex].focus();
2174
+ }
2175
+
2176
+ function handleConsoleTabMenuToggleKeydown(event) {
2177
+ if (event.key === 'ArrowDown') {
2178
+ event.preventDefault();
2179
+ openConsoleTabMenu('first');
2180
+ } else if (event.key === 'ArrowUp') {
2181
+ event.preventDefault();
2182
+ openConsoleTabMenu('last');
2183
+ }
2184
+ }
2185
+
2186
+ function handleConsoleTabMenuKeydown(event) {
2187
+ switch (event.key) {
2188
+ case 'ArrowDown':
2189
+ event.preventDefault();
2190
+ moveConsoleTabMenuFocus(1, event.target);
2191
+ break;
2192
+ case 'ArrowUp':
2193
+ event.preventDefault();
2194
+ moveConsoleTabMenuFocus(-1, event.target);
2195
+ break;
2196
+ case 'Home':
2197
+ event.preventDefault();
2198
+ getConsoleTabMenuItems()[0]?.focus();
2199
+ break;
2200
+ case 'End': {
2201
+ event.preventDefault();
2202
+ const items = getConsoleTabMenuItems();
2203
+ items.at(-1)?.focus();
2204
+ break;
2205
+ }
2206
+ case 'Escape':
2207
+ event.preventDefault();
2208
+ closeConsoleTabMenu();
2209
+ consoleTabMenuToggle?.focus();
2210
+ break;
2211
+ default:
2212
+ break;
2213
+ }
2214
+ }
2215
+
2216
+ function tabsNeedOverflowMenu() {
2217
+ if (!consoleTabs) return false;
2218
+ const buttons = Array.from(consoleTabs.querySelectorAll('.console-tab'));
2219
+ if (buttons.length < 2) return false;
2220
+ const firstTop = buttons[0].offsetTop;
2221
+ return buttons.some((btn) => btn.offsetTop !== firstTop);
2222
+ }
2223
+
2224
+ let consoleTabOverflowFrame = 0;
2225
+ function updateConsoleTabOverflow() {
2226
+ if (!consoleTabs || !headerNavRow || !consoleTabMenuToggle) return;
2227
+ headerNavRow.classList.remove('header-nav-row--collapsed');
2228
+ consoleTabMenuToggle.hidden = true;
2229
+ const shouldCollapse = tabsNeedOverflowMenu();
2230
+ if (shouldCollapse) {
2231
+ headerNavRow.classList.add('header-nav-row--collapsed');
2232
+ consoleTabMenuToggle.hidden = false;
2233
+ }
2234
+ if (!shouldCollapse) {
2235
+ closeConsoleTabMenu();
2236
+ }
2237
+ }
2238
+
2239
+ function scheduleConsoleTabOverflowCheck() {
2240
+ if (consoleTabOverflowFrame) cancelAnimationFrame(consoleTabOverflowFrame);
2241
+ consoleTabOverflowFrame = requestAnimationFrame(() => {
2242
+ consoleTabOverflowFrame = 0;
2243
+ updateConsoleTabOverflow();
2244
+ });
2245
+ }
2246
+
2095
2247
  /**
2096
2248
  * Parse the URL hash into tab name and query parameters.
2097
2249
  * Supports fragment-query pattern: #tab?key=value&key=value
@@ -2208,26 +2360,41 @@ globalThis.DollhouseConsoleUI.clearBanner = function(bannerId) {
2208
2360
  return false;
2209
2361
  }
2210
2362
 
2211
- if (!applyHashTab()) {
2363
+ function restoreInitialConsoleTab() {
2212
2364
  // Version check takes priority over saved tab — upgraders must see Setup
2213
2365
  // regardless of whether they have a saved tab from their previous session.
2214
2366
  if (localStorage.getItem(SETUP_SEEN_KEY) === currentServerVersion) {
2215
2367
  const savedTab = localStorage.getItem(TAB_KEY);
2216
- if (savedTab) {
2217
- switchToTab(savedTab);
2218
- lazyInitTab(savedTab, tabInits);
2219
- }
2220
- } else {
2221
- localStorage.setItem(SETUP_SEEN_KEY, currentServerVersion);
2222
- switchToTab('setup');
2368
+ if (!savedTab) return;
2369
+ switchToTab(savedTab);
2370
+ lazyInitTab(savedTab, tabInits);
2371
+ return;
2223
2372
  }
2373
+
2374
+ localStorage.setItem(SETUP_SEEN_KEY, currentServerVersion);
2375
+ switchToTab('setup');
2376
+ }
2377
+
2378
+ function initializeConsoleTabs() {
2379
+ if (applyHashTab()) return;
2380
+ restoreInitialConsoleTab();
2224
2381
  }
2225
2382
 
2226
- // Handle hash changes for deep-linking (e.g., open_logs operation)
2227
- globalThis.addEventListener('hashchange', () => applyHashTab());
2383
+ function registerConsoleTabObservers() {
2384
+ globalThis.addEventListener('hashchange', () => applyHashTab());
2385
+ renderConsoleTabMenu();
2386
+ syncConsoleTabMenuSelection();
2387
+ scheduleConsoleTabOverflowCheck();
2388
+ globalThis.addEventListener('resize', scheduleConsoleTabOverflowCheck);
2389
+
2390
+ if (typeof ResizeObserver !== 'function' || !headerNavRow) return;
2228
2391
 
2229
- if (consoleTabs) {
2230
- consoleTabs.addEventListener('click', (e) => {
2392
+ const tabOverflowObserver = new ResizeObserver(() => scheduleConsoleTabOverflowCheck());
2393
+ tabOverflowObserver.observe(headerNavRow);
2394
+ }
2395
+
2396
+ function registerConsoleTabInteractions() {
2397
+ consoleTabs?.addEventListener('click', (e) => {
2231
2398
  const btn = e.target.closest('.console-tab');
2232
2399
  if (!btn) return;
2233
2400
  const tab = btn.dataset.tab;
@@ -2238,8 +2405,42 @@ globalThis.DollhouseConsoleUI.clearBanner = function(bannerId) {
2238
2405
 
2239
2406
  lazyInitTab(tab, tabInits);
2240
2407
  });
2408
+
2409
+ consoleTabMenuToggle?.addEventListener('click', () => {
2410
+ if (!consoleTabMenu) return;
2411
+ if (consoleTabMenu.hidden) {
2412
+ openConsoleTabMenu();
2413
+ return;
2414
+ }
2415
+
2416
+ closeConsoleTabMenu();
2417
+ });
2418
+
2419
+ consoleTabMenuToggle?.addEventListener('keydown', handleConsoleTabMenuToggleKeydown);
2420
+ consoleTabMenu?.addEventListener('keydown', handleConsoleTabMenuKeydown);
2421
+ consoleTabMenu?.addEventListener('click', (e) => {
2422
+ const btn = e.target.closest('.console-tab-menu-item');
2423
+ const tab = btn?.dataset.tab;
2424
+ if (!tab) return;
2425
+ switchToTab(tab);
2426
+ localStorage.setItem(TAB_KEY, tab);
2427
+ lazyInitTab(tab, tabInits);
2428
+ });
2429
+
2430
+ globalThis.addEventListener('click', (e) => {
2431
+ if (!consoleTabMenu || !consoleTabMenuToggle) return;
2432
+ if (consoleTabMenu.hidden) return;
2433
+ const target = e.target;
2434
+ if (!(target instanceof Element)) return;
2435
+ if (consoleTabMenu.contains(target) || consoleTabMenuToggle.contains(target)) return;
2436
+ closeConsoleTabMenu();
2437
+ });
2241
2438
  }
2242
2439
 
2440
+ initializeConsoleTabs();
2441
+ registerConsoleTabObservers();
2442
+ registerConsoleTabInteractions();
2443
+
2243
2444
  function lazyInitTab(tab, tabInits, params) {
2244
2445
  const dc = globalThis.DollhouseConsole;
2245
2446
  const module = dc?.[tab];
@@ -43,7 +43,14 @@
43
43
  <p class="site-tagline">Management Console</p>
44
44
  </div>
45
45
  </div>
46
- <div class="header-right">
46
+ <div class="header-controls">
47
+ <div class="site-stats" id="stats" aria-live="polite"></div>
48
+ <button class="theme-toggle" id="theme-toggle" type="button" aria-label="Switch to dark mode" title="Switch to dark mode">
49
+ <span class="theme-toggle-icon" id="theme-toggle-icon" aria-hidden="true">&#9790;</span>
50
+ <span class="sr-only" id="theme-toggle-label">Switch to dark mode</span>
51
+ </button>
52
+ </div>
53
+ <div class="header-nav-row">
47
54
  <nav class="console-tabs" id="console-tabs" aria-label="Console tabs">
48
55
  <button class="console-tab" data-tab="setup">Setup</button>
49
56
  <button class="console-tab" data-tab="security">Auth</button>
@@ -52,12 +59,14 @@
52
59
  <button class="console-tab" data-tab="permissions">Permissions</button>
53
60
  <button class="console-tab active" data-tab="portfolio">Portfolio</button>
54
61
  </nav>
62
+ <div class="console-tab-menu-shell" id="console-tab-menu-shell">
63
+ <button class="console-tab-menu-toggle" id="console-tab-menu-toggle" type="button" hidden aria-haspopup="menu" aria-expanded="false" aria-controls="console-tab-menu">
64
+ <span class="console-tab-menu-icon" aria-hidden="true">&#9776;</span>
65
+ <span class="console-tab-menu-label">Menu</span>
66
+ </button>
67
+ <div class="console-tab-menu" id="console-tab-menu" role="menu" aria-orientation="vertical" hidden></div>
68
+ </div>
55
69
  <div class="session-indicator" id="session-indicator" title="Active sessions"></div>
56
- <div class="site-stats" id="stats" aria-live="polite"></div>
57
- <button class="theme-toggle" id="theme-toggle" type="button" aria-label="Switch to dark mode" title="Switch to dark mode">
58
- <span class="theme-toggle-icon" id="theme-toggle-icon" aria-hidden="true">&#9790;</span>
59
- <span class="sr-only" id="theme-toggle-label">Switch to dark mode</span>
60
- </button>
61
70
  </div>
62
71
  </header>
63
72
 
@@ -572,7 +581,7 @@ npm install @dollhousemcp/mcp-server</code></pre>
572
581
  <a href="https://github.com/DollhouseMCP/mcp-server" class="footer-link">GitHub Repository</a>
573
582
  <a href="./collection-index.json" class="footer-link">JSON API</a>
574
583
  <a href="https://dollhousemcp.com" class="footer-link">DollhouseMCP</a>
575
- <span class="footer-version" id="footer-version"></span>
584
+ <span class="footer-version" id="footer-version" aria-live="polite" aria-atomic="true"></span>
576
585
  <span class="footer-updated" id="footer-updated"></span>
577
586
  <span class="footer-copyright">&copy; 2026 DollhouseMCP</span>
578
587
  </div>