@dollhousemcp/mcp-server
Version:
DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.
490 lines • 56.9 kB
JavaScript
/**
* Operation Router for MCP-AQL
*
* Maps MCP operations to CRUD endpoints (CREATE, READ, UPDATE, DELETE)
* and their corresponding handler implementations.
*
* This routing table enables the unified MCP-AQL endpoint to dispatch
* operations to the appropriate handlers based on their semantic meaning.
*/
/**
* Complete mapping of MCP operations to their CRUDE endpoints and handlers.
*
* Endpoint semantics (CRUDE = CRUD + Execute):
* - CREATE: Operations that create new state (readOnly: false, destructive: false)
* - READ: Operations that only read existing state (readOnly: true, destructive: false)
* - UPDATE: Operations that modify existing state (readOnly: false, destructive: true)
* - DELETE: Operations that remove state (readOnly: false, destructive: true)
* - EXECUTE: Operations for runtime execution lifecycle (readOnly: false, destructive: false, stateful: true)
*/
export const OPERATION_ROUTES = {
// ===== CREATE endpoint (readOnly: false, destructive: false) =====
create_element: {
endpoint: 'CREATE',
handler: 'ElementCRUD.create',
description: 'Create a new element of any type',
},
import_element: {
endpoint: 'CREATE',
handler: 'ElementCRUD.import',
description: 'Import an element from exported data',
},
addEntry: {
endpoint: 'CREATE',
handler: 'Memory.addEntry',
description: 'Add a new entry to a memory element',
},
activate_element: {
endpoint: 'READ',
handler: 'Activation.activate',
description: 'Activate an element for use in the current session',
},
// Issue #774: Open portfolio browser in system browser
open_portfolio_browser: {
endpoint: 'READ',
handler: 'Browser.open',
description: 'Start the portfolio web UI and open it in the system browser',
aliases: [
'open_console',
'open_management_console',
'open_dollhouse_console',
'open_dollhouse_mcp',
'open_dollhouse_mcp_console',
'open_web_console',
],
},
// Console tab deep-link operations
open_logs: {
endpoint: 'READ',
handler: 'Browser.open',
description: 'Open the management console on the logs tab',
aliases: ['open_dollhouse_logs', 'open_dollhouse_mcp_logs', 'open_log_viewer'],
implicitParams: { tab: 'logs' },
},
open_metrics: {
endpoint: 'READ',
handler: 'Browser.open',
description: 'Open the management console on the metrics tab',
aliases: ['open_dollhouse_metrics', 'open_dollhouse_mcp_metrics', 'open_metrics_dashboard'],
implicitParams: { tab: 'metrics' },
},
open_permissions: {
endpoint: 'READ',
handler: 'Browser.open',
description: 'Open the management console on the permissions tab',
aliases: ['open_dollhouse_permissions', 'open_dollhouse_mcp_permissions'],
implicitParams: { tab: 'permissions' },
},
open_setup: {
endpoint: 'READ',
handler: 'Browser.open',
description: 'Open the management console on the setup/install tab',
aliases: ['open_dollhouse_setup', 'open_dollhouse_mcp_setup', 'open_installer'],
implicitParams: { tab: 'setup' },
},
// Issue #452: Gatekeeper confirmation flow
// Routed through EXECUTE so MCP clients can gate it separately from CREATE.
// confirm_operation is non-idempotent and acts as a human-in-the-loop checkpoint —
// it must not silently auto-approve when only CREATE is allowed.
confirm_operation: {
endpoint: 'EXECUTE',
handler: 'Gatekeeper.confirm',
description: 'Confirm a pending operation that requires user approval',
},
// Issue #625: CLI-level permission delegation via --permission-prompt-tool
// Issue #647: Moved to READ — this is a policy evaluation (read-only), not a state mutation.
// Enables --permission-prompt-tool to point at mcp_aql_read.
permission_prompt: {
endpoint: 'READ',
handler: 'Gatekeeper.permissionPrompt',
description: 'Evaluate CLI-level permission prompts for non-interactive sessions via --permission-prompt-tool',
},
// Permission evaluation for PreToolUse hooks (interactive sessions, all platforms)
evaluate_permission: {
endpoint: 'READ',
handler: 'Gatekeeper.evaluatePermission',
description: 'Evaluate CLI permission for a tool via HTTP/hook. Returns platform-formatted response (claude_code, gemini, cursor, windsurf, codex).',
},
// Issue #625 Phase 2: CLI policy visibility
get_effective_cli_policies: {
endpoint: 'READ',
handler: 'Gatekeeper.getEffectiveCliPolicies',
description: 'Get effective CLI permission policies for the current session (Issue #625 Phase 2)',
},
get_permission_authority: {
endpoint: 'READ',
handler: 'Gatekeeper.getPermissionAuthority',
description: 'Get the current host vs Dollhouse permission authority mode (read-only)',
},
// Issue #625 Phase 3: CLI approval workflow
approve_cli_permission: {
endpoint: 'EXECUTE',
handler: 'Gatekeeper.approveCliPermission',
description: 'Approve a pending CLI tool permission request (Issue #625 Phase 3)',
},
get_pending_cli_approvals: {
endpoint: 'READ',
handler: 'Gatekeeper.getPendingCliApprovals',
description: 'Get pending CLI tool approval requests for this session (Issue #625 Phase 3)',
},
// Issue #142: Danger zone verification flow
verify_challenge: {
endpoint: 'CREATE',
handler: 'Gatekeeper.verify',
description: 'Submit verification code to unblock a danger zone operation',
},
release_deadlock: {
endpoint: 'CREATE',
handler: 'Gatekeeper.releaseDeadlock',
description: 'Use out-of-band verification to deactivate all active elements and clear current-session activation state',
},
// Issue #503: Beetlejuice safe-trigger for danger zone verification testing
beetlejuice_beetlejuice_beetlejuice: {
endpoint: 'CREATE',
handler: 'Gatekeeper.beetlejuice',
description: 'Safe-trigger the full danger zone verification pipeline for testing purposes',
},
// ===== READ endpoint (readOnly: true, destructive: false) =====
// Unified search operation (Issue #243)
search: {
endpoint: 'READ',
handler: 'UnifiedSearch.search',
description: 'Unified search across local, GitHub, and collection sources with scope parameter',
},
list_elements: {
endpoint: 'READ',
handler: 'ElementCRUD.list',
description: 'List elements with pagination (default 20/page), filtering, sorting, and count aggregation. Returns structured JSON.',
},
get_element: {
endpoint: 'READ',
handler: 'ElementCRUD.get',
description: 'Get an element by name and type, returning full content and metadata',
},
get_element_details: {
endpoint: 'READ',
handler: 'ElementCRUD.getDetails',
description: 'Get detailed information about a specific element',
},
search_elements: {
endpoint: 'READ',
handler: 'Search.search',
description: 'Full-text search across element names, descriptions, and content. Returns structured JSON with pagination.',
},
query_elements: {
endpoint: 'READ',
handler: 'Search.query',
description: 'Query elements with filters, sorting, pagination, and count aggregation. Returns structured JSON.',
},
get_active_elements: {
endpoint: 'READ',
handler: 'Activation.getActive',
description: 'Get all currently active elements with rendered content, optionally filtered by type',
},
validate_element: {
endpoint: 'READ',
handler: 'ElementCRUD.validate',
description: 'Validate an existing element by name',
},
render: {
endpoint: 'READ',
handler: 'Template.render',
description: 'Render a template with provided variables',
},
export_element: {
endpoint: 'READ',
handler: 'ElementCRUD.export',
description: 'Export an element to a portable format',
},
deactivate_element: {
endpoint: 'READ',
handler: 'Activation.deactivate',
description: 'Deactivate an element, removing it from the current session',
},
introspect: {
endpoint: 'READ',
handler: 'Introspection.resolve',
description: 'Query available operations and types for discovery',
},
get_capabilities: {
endpoint: 'READ',
handler: 'Introspection.getCapabilities',
description: 'Get a high-level map of all server capabilities grouped by user intent',
},
// ===== UPDATE endpoint (readOnly: false, destructive: true) =====
edit_element: {
endpoint: 'UPDATE',
handler: 'ElementCRUD.edit',
description: 'Edit a single field on an element',
},
upgrade_element: {
endpoint: 'UPDATE',
handler: 'ElementCRUD.upgrade',
description: 'Upgrade element from v1 single-body to v2 dual-field format (instructions + content)',
},
// ===== DELETE endpoint (readOnly: false, destructive: true) =====
delete_element: {
endpoint: 'DELETE',
handler: 'ElementCRUD.delete',
description: 'Delete an element',
},
clear: {
endpoint: 'DELETE',
handler: 'Memory.clear',
description: 'Clear all entries from a memory element (irreversible)',
},
// ===== EXECUTE endpoint (runtime execution lifecycle) =====
// These operations manage the execution lifecycle of executable elements
// (agents, workflows, pipelines). Unlike CRUD which manages definitions,
// EXECUTE manages runtime state and is inherently non-idempotent.
execute_agent: {
endpoint: 'EXECUTE',
handler: 'Execute.execute',
description: 'Start execution of an agent or executable element',
},
get_execution_state: {
endpoint: 'READ',
handler: 'Execute.getState',
description: 'Query current execution state including progress and findings',
},
record_execution_step: {
endpoint: 'CREATE',
handler: 'Execute.updateState',
description: 'Record execution progress, step completion, or findings. Returns autonomy directive with continue/pause decision and notifications.',
},
complete_execution: {
endpoint: 'EXECUTE',
handler: 'Execute.complete',
description: 'Signal that execution finished successfully with summary',
},
continue_execution: {
endpoint: 'EXECUTE',
handler: 'Execute.continue',
description: 'Resume execution from saved state',
},
abort_execution: {
endpoint: 'EXECUTE',
handler: 'Execute.abort',
description: 'Abort a running agent execution, rejecting further operations for the goalId',
},
get_gathered_data: {
endpoint: 'READ',
handler: 'Execute.getGatheredData',
description: 'Get aggregated execution data (steps, decisions, findings, and summary statistics) for a specific goal. Use after record_execution_step calls to review progress.',
},
prepare_handoff: {
endpoint: 'EXECUTE',
handler: 'Execute.prepareHandoff',
description: 'Prepare a session handoff package: serializes goal progress, gathered data, and active elements into a compressed, integrity-checked block that can be copy-pasted to resume in another session.',
},
resume_from_handoff: {
endpoint: 'EXECUTE',
handler: 'Execute.resumeFromHandoff',
description: 'Resume agent execution from a handoff block. Validates integrity, verifies agent name match, restores context, and continues execution with caller-supplied parameters.',
},
// ===== COLLECTION operations =====
browse_collection: {
endpoint: 'READ',
handler: 'Collection.browse',
description: 'Browse the DollhouseMCP community collection by section and type',
},
search_collection: {
endpoint: 'READ',
handler: 'Collection.search',
description: 'Search the community collection for elements by keywords',
},
search_collection_enhanced: {
endpoint: 'READ',
handler: 'Collection.searchEnhanced',
description: 'Advanced search with pagination, filtering, and sorting',
},
get_collection_content: {
endpoint: 'READ',
handler: 'Collection.getContent',
description: 'Get detailed information about content from the collection',
},
get_collection_cache_health: {
endpoint: 'READ',
handler: 'Collection.getCacheHealth',
description: 'Get health status and statistics for the collection cache',
},
install_collection_content: {
endpoint: 'CREATE',
handler: 'Collection.install',
description: 'Install an element from the collection to your local portfolio',
},
submit_collection_content: {
endpoint: 'CREATE',
handler: 'Collection.submit',
description: 'Submit a local element to the community collection via GitHub',
},
// ===== PORTFOLIO operations =====
portfolio_status: {
endpoint: 'READ',
handler: 'Portfolio.status',
description: 'Check GitHub portfolio repository status and element counts',
},
portfolio_config: {
endpoint: 'READ',
handler: 'Portfolio.config',
description: 'Configure portfolio settings (auto-sync, visibility, etc.)',
},
search_portfolio: {
endpoint: 'READ',
handler: 'Portfolio.search',
description: 'Search local portfolio by content name, keywords, or tags',
},
search_all: {
endpoint: 'READ',
handler: 'Portfolio.searchAll',
description: 'Unified search across local, GitHub, and collection sources',
},
init_portfolio: {
endpoint: 'CREATE',
handler: 'Portfolio.init',
description: 'Initialize a new GitHub portfolio repository',
},
sync_portfolio: {
endpoint: 'CREATE',
handler: 'Portfolio.sync',
description: 'Sync local portfolio with GitHub repository',
},
portfolio_element_manager: {
endpoint: 'CREATE',
handler: 'Portfolio.elementManager',
description: 'Manage individual elements between local and GitHub',
},
// ===== AUTH operations =====
setup_github_auth: {
endpoint: 'CREATE',
handler: 'Auth.setup',
description: 'Set up GitHub authentication using device flow',
},
check_github_auth: {
endpoint: 'READ',
handler: 'Auth.check',
description: 'Check current GitHub authentication status',
},
clear_github_auth: {
endpoint: 'DELETE',
handler: 'Auth.clear',
description: 'Remove GitHub authentication and disconnect',
},
configure_oauth: {
endpoint: 'CREATE',
handler: 'Auth.configureOAuth',
description: 'Configure GitHub OAuth client ID',
},
oauth_helper_status: {
endpoint: 'READ',
handler: 'Auth.oauthHelperStatus',
description: 'Get diagnostic information about OAuth helper process',
},
// ===== CONFIG operations =====
dollhouse_config: {
endpoint: 'READ',
handler: 'Config.manage',
description: 'Manage DollhouseMCP configuration settings',
},
convert_skill_format: {
endpoint: 'READ',
handler: 'Config.convertSkillFormat',
description: 'Convert between current Agent Skill and Dollhouse Skill formats with structured warnings and roundtrip support',
},
get_build_info: {
endpoint: 'READ',
handler: 'Config.getBuildInfo',
description: 'Get comprehensive build and runtime information',
},
get_cache_budget_report: {
endpoint: 'READ',
handler: 'Config.getCacheBudgetReport',
description: 'Get global cache memory budget report with per-cache diagnostics',
},
// ===== LOGGING operations =====
query_logs: {
endpoint: 'READ',
handler: 'Logging.query',
description: 'Query recent log entries from the in-memory buffer with filtering and pagination',
},
// ===== METRICS operations =====
query_metrics: {
endpoint: 'READ',
handler: 'Metrics.query',
description: 'Query collected metrics snapshots with filtering by name, source, type, and time range',
},
// ===== ENHANCED INDEX operations =====
find_similar_elements: {
endpoint: 'READ',
handler: 'EnhancedIndex.findSimilar',
description: 'Find semantically similar elements using NLP scoring',
},
get_element_relationships: {
endpoint: 'READ',
handler: 'EnhancedIndex.getRelationships',
description: 'Get all relationships for a specific element',
},
search_by_verb: {
endpoint: 'READ',
handler: 'EnhancedIndex.searchByVerb',
description: 'Search for elements that handle a specific action verb',
},
get_relationship_stats: {
endpoint: 'READ',
handler: 'EnhancedIndex.getStats',
description: 'Get statistics about Enhanced Index relationships',
},
// ===== PERSONA operations =====
import_persona: {
endpoint: 'CREATE',
handler: 'Persona.import',
description: 'Import a persona from a file path or JSON string',
},
};
/**
* Get the route definition for a given operation name.
*
* @param operation - The operation name (e.g., 'create_element', 'list_elements')
* @returns The route definition, or undefined if the operation is not found
*
* @example
* ```typescript
* const route = getRoute('create_element');
* // { endpoint: 'CREATE', handler: 'ElementCRUD.create', description: '...' }
* ```
*/
/**
* Resolve an operation name to its canonical form, checking aliases.
* Returns the canonical operation name, or the input if no alias matches.
*/
export function resolveOperationName(operation) {
if (operation in OPERATION_ROUTES)
return operation;
for (const [canonical, route] of Object.entries(OPERATION_ROUTES)) {
if (route.aliases?.includes(operation))
return canonical;
}
return operation;
}
export function getRoute(operation) {
const canonical = resolveOperationName(operation);
return OPERATION_ROUTES[canonical];
}
/**
* Get all operations that map to a specific CRUD endpoint.
*
* @param endpoint - The CRUD endpoint ('CREATE', 'READ', 'UPDATE', 'DELETE')
* @returns Array of operation names that map to this endpoint
*
* @example
* ```typescript
* const createOps = getOperationsForEndpoint('CREATE');
* // ['create_element', 'import_element', 'addEntry']
* ```
*/
export function getOperationsForEndpoint(endpoint) {
return Object.entries(OPERATION_ROUTES)
.filter(([_, route]) => route.endpoint === endpoint)
.map(([operation, _]) => operation);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9uUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2hhbmRsZXJzL21jcC1hcWwvT3BlcmF0aW9uUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBNkJIOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFtQztJQUM5RCxvRUFBb0U7SUFDcEUsY0FBYyxFQUFFO1FBQ2QsUUFBUSxFQUFFLFFBQVE7UUFDbEIsT0FBTyxFQUFFLG9CQUFvQjtRQUM3QixXQUFXLEVBQUUsa0NBQWtDO0tBQ2hEO0lBQ0QsY0FBYyxFQUFFO1FBQ2QsUUFBUSxFQUFFLFFBQVE7UUFDbEIsT0FBTyxFQUFFLG9CQUFvQjtRQUM3QixXQUFXLEVBQUUsc0NBQXNDO0tBQ3BEO0lBQ0QsUUFBUSxFQUFFO1FBQ1IsUUFBUSxFQUFFLFFBQVE7UUFDbEIsT0FBTyxFQUFFLGlCQUFpQjtRQUMxQixXQUFXLEVBQUUscUNBQXFDO0tBQ25EO0lBQ0QsZ0JBQWdCLEVBQUU7UUFDaEIsUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLHFCQUFxQjtRQUM5QixXQUFXLEVBQUUsb0RBQW9EO0tBQ2xFO0lBQ0QsdURBQXVEO0lBQ3ZELHNCQUFzQixFQUFFO1FBQ3RCLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLE9BQU8sRUFBRSxjQUFjO1FBQ3ZCLFdBQVcsRUFBRSw4REFBOEQ7UUFDM0UsT0FBTyxFQUFFO1lBQ1AsY0FBYztZQUNkLHlCQUF5QjtZQUN6Qix3QkFBd0I7WUFDeEIsb0JBQW9CO1lBQ3BCLDRCQUE0QjtZQUM1QixrQkFBa0I7U0FDbkI7S0FDRjtJQUNELG1DQUFtQztJQUNuQyxTQUFTLEVBQUU7UUFDVCxRQUFRLEVBQUUsTUFBTTtRQUNoQixPQUFPLEVBQUUsY0FBYztRQUN2QixXQUFXLEVBQUUsNkNBQTZDO1FBQzFELE9BQU8sRUFBRSxDQUFDLHFCQUFxQixFQUFFLHlCQUF5QixFQUFFLGlCQUFpQixDQUFDO1FBQzlFLGNBQWMsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUU7S0FDaEM7SUFDRCxZQUFZLEVBQUU7UUFDWixRQUFRLEVBQUUsTUFBTTtRQUNoQixPQUFPLEVBQUUsY0FBYztRQUN2QixXQUFXLEVBQUUsZ0RBQWdEO1FBQzdELE9BQU8sRUFBRSxDQUFDLHdCQUF3QixFQUFFLDRCQUE0QixFQUFFLHdCQUF3QixDQUFDO1FBQzNGLGNBQWMsRUFBRSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUU7S0FDbkM7SUFDRCxnQkFBZ0IsRUFBRTtRQUNoQixRQUFRLEVBQUUsTUFBTTtRQUNoQixPQUFPLEVBQUUsY0FBYztRQUN2QixXQUFXLEVBQUUsb0RBQW9EO1FBQ2pFLE9BQU8sRUFBRSxDQUFDLDRCQUE0QixFQUFFLGdDQUFnQyxDQUFDO1FBQ3pFLGNBQWMsRUFBRSxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUU7S0FDdkM7SUFDRCxVQUFVLEVBQUU7UUFDVixRQUFRLEVBQUUsTUFBTTtRQUNoQixPQUFPLEVBQUUsY0FBYztRQUN2QixXQUFXLEVBQUUsc0RBQXNEO1FBQ25FLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixFQUFFLDBCQUEwQixFQUFFLGdCQUFnQixDQUFDO1FBQy9FLGNBQWMsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUU7S0FDakM7SUFDRCwyQ0FBMkM7SUFDM0MsNEVBQTRFO0lBQzVFLG1GQUFtRjtJQUNuRixpRUFBaUU7SUFDakUsaUJBQWlCLEVBQUU7UUFDakIsUUFBUSxFQUFFLFNBQVM7UUFDbkIsT0FBTyxFQUFFLG9CQUFvQjtRQUM3QixXQUFXLEVBQUUseURBQXlEO0tBQ3ZFO0lBQ0QsMkVBQTJFO0lBQzNFLDZGQUE2RjtJQUM3Riw2REFBNkQ7SUFDN0QsaUJBQWlCLEVBQUU7UUFDakIsUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLDZCQUE2QjtRQUN0QyxXQUFXLEVBQUUsaUdBQWlHO0tBQy9HO0lBQ0QsbUZBQW1GO0lBQ25GLG1CQUFtQixFQUFFO1FBQ25CLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLE9BQU8sRUFBRSwrQkFBK0I7UUFDeEMsV0FBVyxFQUFFLHVJQUF1STtLQUNySjtJQUNELDRDQUE0QztJQUM1QywwQkFBMEIsRUFBRTtRQUMxQixRQUFRLEVBQUUsTUFBTTtRQUNoQixPQUFPLEVBQUUsb0NBQW9DO1FBQzdDLFdBQVcsRUFBRSxvRkFBb0Y7S0FDbEc7SUFDRCx3QkFBd0IsRUFBRTtRQUN4QixRQUFRLEVBQUUsTUFBTTtRQUNoQixPQUFPLEVBQUUsbUNBQW1DO1FBQzVDLFdBQVcsRUFBRSx5RUFBeUU7S0FDdkY7SUFDRCw0Q0FBNEM7SUFDNUMsc0JBQXNCLEVBQUU7UUFDdEIsUUFBUSxFQUFFLFNBQVM7UUFDbkIsT0FBTyxFQUFFLGlDQUFpQztRQUMxQyxXQUFXLEVBQUUsb0VBQW9FO0tBQ2xGO0lBQ0QseUJBQXlCLEVBQUU7UUFDekIsUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLG1DQUFtQztRQUM1QyxXQUFXLEVBQUUsOEVBQThFO0tBQzVGO0lBQ0QsNENBQTRDO0lBQzVDLGdCQUFnQixFQUFFO1FBQ2hCLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLE9BQU8sRUFBRSxtQkFBbUI7UUFDNUIsV0FBVyxFQUFFLDZEQUE2RDtLQUMzRTtJQUNELGdCQUFnQixFQUFFO1FBQ2hCLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLE9BQU8sRUFBRSw0QkFBNEI7UUFDckMsV0FBVyxFQUFFLDJHQUEyRztLQUN6SDtJQUNELDRFQUE0RTtJQUM1RSxtQ0FBbUMsRUFBRTtRQUNuQyxRQUFRLEVBQUUsUUFBUTtRQUNsQixPQUFPLEVBQUUsd0JBQXdCO1FBQ2pDLFdBQVcsRUFBRSw4RUFBOEU7S0FDNUY7SUFFRCxpRUFBaUU7SUFDakUsd0NBQXdDO0lBQ3hDLE1BQU0sRUFBRTtRQUNOLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLE9BQU8sRUFBRSxzQkFBc0I7UUFDL0IsV0FBVyxFQUFFLGtGQUFrRjtLQUNoRztJQUNELGFBQWEsRUFBRTtRQUNiLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLE9BQU8sRUFBRSxrQkFBa0I7UUFDM0IsV0FBVyxFQUFFLHNIQUFzSDtLQUNwSTtJQUNELFdBQVcsRUFBRTtRQUNYLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLE9BQU8sRUFBRSxpQkFBaUI7UUFDMUIsV0FBVyxFQUFFLHNFQUFzRTtLQUNwRjtJQUNELG1CQUFtQixFQUFFO1FBQ25CLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLE9BQU8sRUFBRSx3QkFBd0I7UUFDakMsV0FBVyxFQUFFLG1EQUFtRDtLQUNqRTtJQUNELGVBQWUsRUFBRTtRQUNmLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLE9BQU8sRUFBRSxlQUFlO1FBQ3hCLFdBQVcsRUFBRSw0R0FBNEc7S0FDMUg7SUFDRCxjQUFjLEVBQUU7UUFDZCxRQUFRLEVBQUUsTUFBTTtRQUNoQixPQUFPLEVBQUUsY0FBYztRQUN2QixXQUFXLEVBQUUsbUdBQW1HO0tBQ2pIO0lBQ0QsbUJBQW1CLEVBQUU7UUFDbkIsUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLHNCQUFzQjtRQUMvQixXQUFXLEVBQUUsc0ZBQXNGO0tBQ3BHO0lBQ0QsZ0JBQWdCLEVBQUU7UUFDaEIsUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLHNCQUFzQjtRQUMvQixXQUFXLEVBQUUsc0NBQXNDO0tBQ3BEO0lBQ0QsTUFBTSxFQUFFO1FBQ04sUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLGlCQUFpQjtRQUMxQixXQUFXLEVBQUUsMkNBQTJDO0tBQ3pEO0lBQ0QsY0FBYyxFQUFFO1FBQ2QsUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLG9CQUFvQjtRQUM3QixXQUFXLEVBQUUsd0NBQXdDO0tBQ3REO0lBQ0Qsa0JBQWtCLEVBQUU7UUFDbEIsUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLHVCQUF1QjtRQUNoQyxXQUFXLEVBQUUsNkRBQTZEO0tBQzNFO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLHVCQUF1QjtRQUNoQyxXQUFXLEVBQUUsb0RBQW9EO0tBQ2xFO0lBQ0QsZ0JBQWdCLEVBQUU7UUFDaEIsUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLCtCQUErQjtRQUN4QyxXQUFXLEVBQUUsd0VBQXdFO0tBQ3RGO0lBRUQsbUVBQW1FO0lBQ25FLFlBQVksRUFBRTtRQUNaLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLE9BQU8sRUFBRSxrQkFBa0I7UUFDM0IsV0FBVyxFQUFFLG1DQUFtQztLQUNqRDtJQUNELGVBQWUsRUFBRTtRQUNmLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLE9BQU8sRUFBRSxxQkFBcUI7UUFDOUIsV0FBVyxFQUFFLHNGQUFzRjtLQUNwRztJQUVELG1FQUFtRTtJQUNuRSxjQUFjLEVBQUU7UUFDZCxRQUFRLEVBQUUsUUFBUTtRQUNsQixPQUFPLEVBQUUsb0JBQW9CO1FBQzdCLFdBQVcsRUFBRSxtQkFBbUI7S0FDakM7SUFDRCxLQUFLLEVBQUU7UUFDTCxRQUFRLEVBQUUsUUFBUTtRQUNsQixPQUFPLEVBQUUsY0FBYztRQUN2QixXQUFXLEVBQUUsd0RBQXdEO0tBQ3RFO0lBRUQsNkRBQTZEO0lBQzdELHlFQUF5RTtJQUN6RSx5RUFBeUU7SUFDekUsa0VBQWtFO0lBQ2xFLGFBQWEsRUFBRTtRQUNiLFFBQVEsRUFBRSxTQUFTO1FBQ25CLE9BQU8sRUFBRSxpQkFBaUI7UUFDMUIsV0FBVyxFQUFFLG1EQUFtRDtLQUNqRTtJQUNELG1CQUFtQixFQUFFO1FBQ25CLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLE9BQU8sRUFBRSxrQkFBa0I7UUFDM0IsV0FBVyxFQUFFLCtEQUErRDtLQUM3RTtJQUNELHFCQUFxQixFQUFFO1FBQ3JCLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLE9BQU8sRUFBRSxxQkFBcUI7UUFDOUIsV0FBVyxFQUFFLHFJQUFxSTtLQUNuSjtJQUNELGtCQUFrQixFQUFFO1FBQ2xCLFFBQVEsRUFBRSxTQUFTO1FBQ25CLE9BQU8sRUFBRSxrQkFBa0I7UUFDM0IsV0FBVyxFQUFFLDBEQUEwRDtLQUN4RTtJQUNELGtCQUFrQixFQUFFO1FBQ2xCLFFBQVEsRUFBRSxTQUFTO1FBQ25CLE9BQU8sRUFBRSxrQkFBa0I7UUFDM0IsV0FBVyxFQUFFLG1DQUFtQztLQUNqRDtJQUNELGVBQWUsRUFBRTtRQUNmLFFBQVEsRUFBRSxTQUFTO1FBQ25CLE9BQU8sRUFBRSxlQUFlO1FBQ3hCLFdBQVcsRUFBRSw4RUFBOEU7S0FDNUY7SUFDRCxpQkFBaUIsRUFBRTtRQUNqQixRQUFRLEVBQUUsTUFBTTtRQUNoQixPQUFPLEVBQUUseUJBQXlCO1FBQ2xDLFdBQVcsRUFBRSxtS0FBbUs7S0FDakw7SUFDRCxlQUFlLEVBQUU7UUFDZixRQUFRLEVBQUUsU0FBUztRQUNuQixPQUFPLEVBQUUsd0JBQXdCO1FBQ2pDLFdBQVcsRUFBRSxrTUFBa007S0FDaE47SUFDRCxtQkFBbUIsRUFBRTtRQUNuQixRQUFRLEVBQUUsU0FBUztRQUNuQixPQUFPLEVBQUUsMkJBQTJCO1FBQ3BDLFdBQVcsRUFBRSx5S0FBeUs7S0FDdkw7SUFFRCxvQ0FBb0M7SUFDcEMsaUJBQWlCLEVBQUU7UUFDakIsUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLG1CQUFtQjtRQUM1QixXQUFXLEVBQUUsa0VBQWtFO0tBQ2hGO0lBQ0QsaUJBQWlCLEVBQUU7UUFDakIsUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLG1CQUFtQjtRQUM1QixXQUFXLEVBQUUsMERBQTBEO0tBQ3hFO0lBQ0QsMEJBQTBCLEVBQUU7UUFDMUIsUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLDJCQUEyQjtRQUNwQyxXQUFXLEVBQUUseURBQXlEO0tBQ3ZFO0lBQ0Qsc0JBQXNCLEVBQUU7UUFDdEIsUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLHVCQUF1QjtRQUNoQyxXQUFXLEVBQUUsNERBQTREO0tBQzFFO0lBQ0QsMkJBQTJCLEVBQUU7UUFDM0IsUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLDJCQUEyQjtRQUNwQyxXQUFXLEVBQUUsMkRBQTJEO0tBQ3pFO0lBQ0QsMEJBQTBCLEVBQUU7UUFDMUIsUUFBUSxFQUFFLFFBQVE7UUFDbEIsT0FBTyxFQUFFLG9CQUFvQjtRQUM3QixXQUFXLEVBQUUsZ0VBQWdFO0tBQzlFO0lBQ0QseUJBQXlCLEVBQUU7UUFDekIsUUFBUSxFQUFFLFFBQVE7UUFDbEIsT0FBTyxFQUFFLG1CQUFtQjtRQUM1QixXQUFXLEVBQUUsK0RBQStEO0tBQzdFO0lBRUQsbUNBQW1DO0lBQ25DLGdCQUFnQixFQUFFO1FBQ2hCLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLE9BQU8sRUFBRSxrQkFBa0I7UUFDM0IsV0FBVyxFQUFFLDZEQUE2RDtLQUMzRTtJQUNELGdCQUFnQixFQUFFO1FBQ2hCLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLE9BQU8sRUFBRSxrQkFBa0I7UUFDM0IsV0FBVyxFQUFFLDREQUE0RDtLQUMxRTtJQUNELGdCQUFnQixFQUFFO1FBQ2hCLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLE9BQU8sRUFBRSxrQkFBa0I7UUFDM0IsV0FBVyxFQUFFLDJEQUEyRDtLQUN6RTtJQUNELFVBQVUsRUFBRTtRQUNWLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLE9BQU8sRUFBRSxxQkFBcUI7UUFDOUIsV0FBVyxFQUFFLDZEQUE2RDtLQUMzRTtJQUNELGNBQWMsRUFBRTtRQUNkLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLE9BQU8sRUFBRSxnQkFBZ0I7UUFDekIsV0FBVyxFQUFFLDhDQUE4QztLQUM1RDtJQUNELGNBQWMsRUFBRTtRQUNkLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLE9BQU8sRUFBRSxnQkFBZ0I7UUFDekIsV0FBVyxFQUFFLDZDQUE2QztLQUMzRDtJQUNELHlCQUF5QixFQUFFO1FBQ3pCLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLE9BQU8sRUFBRSwwQkFBMEI7UUFDbkMsV0FBVyxFQUFFLHFEQUFxRDtLQUNuRTtJQUVELDhCQUE4QjtJQUM5QixpQkFBaUIsRUFBRTtRQUNqQixRQUFRLEVBQUUsUUFBUTtRQUNsQixPQUFPLEVBQUUsWUFBWTtRQUNyQixXQUFXLEVBQUUsZ0RBQWdEO0tBQzlEO0lBQ0QsaUJBQWlCLEVBQUU7UUFDakIsUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLFlBQVk7UUFDckIsV0FBVyxFQUFFLDRDQUE0QztLQUMxRDtJQUNELGlCQUFpQixFQUFFO1FBQ2pCLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLE9BQU8sRUFBRSxZQUFZO1FBQ3JCLFdBQVcsRUFBRSw2Q0FBNkM7S0FDM0Q7SUFDRCxlQUFlLEVBQUU7UUFDZixRQUFRLEVBQUUsUUFBUTtRQUNsQixPQUFPLEVBQUUscUJBQXFCO1FBQzlCLFdBQVcsRUFBRSxrQ0FBa0M7S0FDaEQ7SUFDRCxtQkFBbUIsRUFBRTtRQUNuQixRQUFRLEVBQUUsTUFBTTtRQUNoQixPQUFPLEVBQUUsd0JBQXdCO1FBQ2pDLFdBQVcsRUFBRSx1REFBdUQ7S0FDckU7SUFFRCxnQ0FBZ0M7SUFDaEMsZ0JBQWdCLEVBQUU7UUFDaEIsUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLGVBQWU7UUFDeEIsV0FBVyxFQUFFLDRDQUE0QztLQUMxRDtJQUNELG9CQUFvQixFQUFFO1FBQ3BCLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLE9BQU8sRUFBRSwyQkFBMkI7UUFDcEMsV0FBVyxFQUFFLGdIQUFnSDtLQUM5SDtJQUNELGNBQWMsRUFBRTtRQUNkLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLE9BQU8sRUFBRSxxQkFBcUI7UUFDOUIsV0FBVyxFQUFFLGlEQUFpRDtLQUMvRDtJQUNELHVCQUF1QixFQUFFO1FBQ3ZCLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLE9BQU8sRUFBRSw2QkFBNkI7UUFDdEMsV0FBVyxFQUFFLGtFQUFrRTtLQUNoRjtJQUVELGlDQUFpQztJQUNqQyxVQUFVLEVBQUU7UUFDVixRQUFRLEVBQUUsTUFBTTtRQUNoQixPQUFPLEVBQUUsZUFBZTtRQUN4QixXQUFXLEVBQUUsa0ZBQWtGO0tBQ2hHO0lBRUQsaUNBQWlDO0lBQ2pDLGFBQWEsRUFBRTtRQUNiLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLE9BQU8sRUFBRSxlQUFlO1FBQ3hCLFdBQVcsRUFBRSx3RkFBd0Y7S0FDdEc7SUFFRCx3Q0FBd0M7SUFDeEMscUJBQXFCLEVBQUU7UUFDckIsUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLDJCQUEyQjtRQUNwQyxXQUFXLEVBQUUsc0RBQXNEO0tBQ3BFO0lBQ0QseUJBQXlCLEVBQUU7UUFDekIsUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLGdDQUFnQztRQUN6QyxXQUFXLEVBQUUsOENBQThDO0tBQzVEO0lBQ0QsY0FBYyxFQUFFO1FBQ2QsUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLDRCQUE0QjtRQUNyQyxXQUFXLEVBQUUsd0RBQXdEO0tBQ3RFO0lBQ0Qsc0JBQXNCLEVBQUU7UUFDdEIsUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLHdCQUF3QjtRQUNqQyxXQUFXLEVBQUUsbURBQW1EO0tBQ2pFO0lBRUQsaUNBQWlDO0lBQ2pDLGNBQWMsRUFBRTtRQUNkLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLE9BQU8sRUFBRSxnQkFBZ0I7UUFDekIsV0FBVyxFQUFFLGtEQUFrRDtLQUNoRTtDQUNPLENBQUM7QUFFWDs7Ozs7Ozs7Ozs7R0FXRztBQUNIOzs7R0FHRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxTQUFpQjtJQUNwRCxJQUFJLFNBQVMsSUFBSSxnQkFBZ0I7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNwRCxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7UUFDbEUsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMzRCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELE1BQU0sVUFBVSxRQUFRLENBQUMsU0FBaUI7SUFDeEMsTUFBTSxTQUFTLEdBQUcsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEQsT0FBTyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsUUFBc0I7SUFDN0QsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDO1NBQ3BDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQztTQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3BlcmF0aW9uIFJvdXRlciBmb3IgTUNQLUFRTFxuICpcbiAqIE1hcHMgTUNQIG9wZXJhdGlvbnMgdG8gQ1JVRCBlbmRwb2ludHMgKENSRUFURSwgUkVBRCwgVVBEQVRFLCBERUxFVEUpXG4gKiBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBoYW5kbGVyIGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBUaGlzIHJvdXRpbmcgdGFibGUgZW5hYmxlcyB0aGUgdW5pZmllZCBNQ1AtQVFMIGVuZHBvaW50IHRvIGRpc3BhdGNoXG4gKiBvcGVyYXRpb25zIHRvIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVycyBiYXNlZCBvbiB0aGVpciBzZW1hbnRpYyBtZWFuaW5nLlxuICovXG5cbmV4cG9ydCB0eXBlIENSVURFbmRwb2ludCA9ICdDUkVBVEUnIHwgJ1JFQUQnIHwgJ1VQREFURScgfCAnREVMRVRFJyB8ICdFWEVDVVRFJztcblxuLyoqXG4gKiBIYW5kbGVyIHJlZmVyZW5jZSBpbiBkb3Qgbm90YXRpb24gZm9ybWF0OiBcIk1vZHVsZS5tZXRob2RcIlxuICogRXhhbXBsZXM6IFwiRWxlbWVudENSVUQuY3JlYXRlXCIsIFwiTWVtb3J5LmFkZEVudHJ5XCIsIFwiQWdlbnQuZXhlY3V0ZVwiXG4gKlxuICogVGhlIGZvcm1hdCBpcyByZXNvbHZlZCBieSBNQ1BBUUxIYW5kbGVyIHRvIGFjdHVhbCBtYW5hZ2VyIG1ldGhvZCBjYWxscy5cbiAqIEBzZWUgc3JjL2hhbmRsZXJzL21jcC1hcWwvTUNQQVFMSGFuZGxlci50cyBmb3IgcmVzb2x1dGlvbiBsb2dpY1xuICovXG5leHBvcnQgdHlwZSBIYW5kbGVyUmVmZXJlbmNlID0gYCR7c3RyaW5nfS4ke3N0cmluZ31gO1xuXG4vKipcbiAqIFJvdXRlIGRlZmluaXRpb24gZm9yIGFuIE1DUCBvcGVyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVyYXRpb25Sb3V0ZSB7XG4gIC8qKiBDUlVEIGVuZHBvaW50IHRoaXMgb3BlcmF0aW9uIG1hcHMgdG8gKi9cbiAgZW5kcG9pbnQ6IENSVURFbmRwb2ludDtcbiAgLyoqIEhhbmRsZXIgbWV0aG9kIHJlc3BvbnNpYmxlIGZvciBleGVjdXRpbmcgdGhpcyBvcGVyYXRpb24gKGZvcm1hdDogXCJNb2R1bGUubWV0aG9kXCIpICovXG4gIGhhbmRsZXI6IEhhbmRsZXJSZWZlcmVuY2U7XG4gIC8qKiBPcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoaXMgb3BlcmF0aW9uIGRvZXMgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBBbHRlcm5hdGl2ZSBuYW1lcyB0aGF0IHJlc29sdmUgdG8gdGhpcyBvcGVyYXRpb24gKi9cbiAgYWxpYXNlcz86IHN0cmluZ1tdO1xuICAvKiogUGFyYW1ldGVycyBhdXRvbWF0aWNhbGx5IGluamVjdGVkIHdoZW4gdGhpcyBvcGVyYXRpb24gaXMgZGlzcGF0Y2hlZCAobWVyZ2VkIHVuZGVyIHVzZXIgcGFyYW1zKSAqL1xuICBpbXBsaWNpdFBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKipcbiAqIENvbXBsZXRlIG1hcHBpbmcgb2YgTUNQIG9wZXJhdGlvbnMgdG8gdGhlaXIgQ1JVREUgZW5kcG9pbnRzIGFuZCBoYW5kbGVycy5cbiAqXG4gKiBFbmRwb2ludCBzZW1hbnRpY3MgKENSVURFID0gQ1JVRCArIEV4ZWN1dGUpOlxuICogLSBDUkVBVEU6IE9wZXJhdGlvbnMgdGhhdCBjcmVhdGUgbmV3IHN0YXRlIChyZWFkT25seTogZmFsc2UsIGRlc3RydWN0aXZlOiBmYWxzZSlcbiAqIC0gUkVBRDogT3BlcmF0aW9ucyB0aGF0IG9ubHkgcmVhZCBleGlzdGluZyBzdGF0ZSAocmVhZE9ubHk6IHRydWUsIGRlc3RydWN0aXZlOiBmYWxzZSlcbiAqIC0gVVBEQVRFOiBPcGVyYXRpb25zIHRoYXQgbW9kaWZ5IGV4aXN0aW5nIHN0YXRlIChyZWFkT25seTogZmFsc2UsIGRlc3RydWN0aXZlOiB0cnVlKVxuICogLSBERUxFVEU6IE9wZXJhdGlvbnMgdGhhdCByZW1vdmUgc3RhdGUgKHJlYWRPbmx5OiBmYWxzZSwgZGVzdHJ1Y3RpdmU6IHRydWUpXG4gKiAtIEVYRUNVVEU6IE9wZXJhdGlvbnMgZm9yIHJ1bnRpbWUgZXhlY3V0aW9uIGxpZmVjeWNsZSAocmVhZE9ubHk6IGZhbHNlLCBkZXN0cnVjdGl2ZTogZmFsc2UsIHN0YXRlZnVsOiB0cnVlKVxuICovXG5leHBvcnQgY29uc3QgT1BFUkFUSU9OX1JPVVRFUzogUmVjb3JkPHN0cmluZywgT3BlcmF0aW9uUm91dGU+ID0ge1xuICAvLyA9PT09PSBDUkVBVEUgZW5kcG9pbnQgKHJlYWRPbmx5OiBmYWxzZSwgZGVzdHJ1Y3RpdmU6IGZhbHNlKSA9PT09PVxuICBjcmVhdGVfZWxlbWVudDoge1xuICAgIGVuZHBvaW50OiAnQ1JFQVRFJyxcbiAgICBoYW5kbGVyOiAnRWxlbWVudENSVUQuY3JlYXRlJyxcbiAgICBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBhIG5ldyBlbGVtZW50IG9mIGFueSB0eXBlJyxcbiAgfSxcbiAgaW1wb3J0X2VsZW1lbnQ6IHtcbiAgICBlbmRwb2ludDogJ0NSRUFURScsXG4gICAgaGFuZGxlcjogJ0VsZW1lbnRDUlVELmltcG9ydCcsXG4gICAgZGVzY3JpcHRpb246ICdJbXBvcnQgYW4gZWxlbWVudCBmcm9tIGV4cG9ydGVkIGRhdGEnLFxuICB9LFxuICBhZGRFbnRyeToge1xuICAgIGVuZHBvaW50OiAnQ1JFQVRFJyxcbiAgICBoYW5kbGVyOiAnTWVtb3J5LmFkZEVudHJ5JyxcbiAgICBkZXNjcmlwdGlvbjogJ0FkZCBhIG5ldyBlbnRyeSB0byBhIG1lbW9yeSBlbGVtZW50JyxcbiAgfSxcbiAgYWN0aXZhdGVfZWxlbWVudDoge1xuICAgIGVuZHBvaW50OiAnUkVBRCcsXG4gICAgaGFuZGxlcjogJ0FjdGl2YXRpb24uYWN0aXZhdGUnLFxuICAgIGRlc2NyaXB0aW9uOiAnQWN0aXZhdGUgYW4gZWxlbWVudCBmb3IgdXNlIGluIHRoZSBjdXJyZW50IHNlc3Npb24nLFxuICB9LFxuICAvLyBJc3N1ZSAjNzc0OiBPcGVuIHBvcnRmb2xpbyBicm93c2VyIGluIHN5c3RlbSBicm93c2VyXG4gIG9wZW5fcG9ydGZvbGlvX2Jyb3dzZXI6IHtcbiAgICBlbmRwb2ludDogJ1JFQUQnLFxuICAgIGhhbmRsZXI6ICdCcm93c2VyLm9wZW4nLFxuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgdGhlIHBvcnRmb2xpbyB3ZWIgVUkgYW5kIG9wZW4gaXQgaW4gdGhlIHN5c3RlbSBicm93c2VyJyxcbiAgICBhbGlhc2VzOiBbXG4gICAgICAnb3Blbl9jb25zb2xlJyxcbiAgICAgICdvcGVuX21hbmFnZW1lbnRfY29uc29sZScsXG4gICAgICAnb3Blbl9kb2xsaG91c2VfY29uc29sZScsXG4gICAgICAnb3Blbl9kb2xsaG91c2VfbWNwJyxcbiAgICAgICdvcGVuX2RvbGxob3VzZV9tY3BfY29uc29sZScsXG4gICAgICAnb3Blbl93ZWJfY29uc29sZScsXG4gICAgXSxcbiAgfSxcbiAgLy8gQ29uc29sZSB0YWIgZGVlcC1saW5rIG9wZXJhdGlvbnNcbiAgb3Blbl9sb2dzOiB7XG4gICAgZW5kcG9pbnQ6ICdSRUFEJyxcbiAgICBoYW5kbGVyOiAnQnJvd3Nlci5vcGVuJyxcbiAgICBkZXNjcmlwdGlvbjogJ09wZW4gdGhlIG1hbmFnZW1lbnQgY29uc29sZSBvbiB0aGUgbG9ncyB0YWInLFxuICAgIGFsaWFzZXM6IFsnb3Blbl9kb2xsaG91c2VfbG9ncycsICdvcGVuX2RvbGxob3VzZV9tY3BfbG9ncycsICdvcGVuX2xvZ192aWV3ZXInXSxcbiAgICBpbXBsaWNpdFBhcmFtczogeyB0YWI6ICdsb2dzJyB9LFxuICB9LFxuICBvcGVuX21ldHJpY3M6IHtcbiAgICBlbmRwb2ludDogJ1JFQUQnLFxuICAgIGhhbmRsZXI6ICdCcm93c2VyLm9wZW4nLFxuICAgIGRlc2NyaXB0aW9uOiAnT3BlbiB0aGUgbWFuYWdlbWVudCBjb25zb2xlIG9uIHRoZSBtZXRyaWNzIHRhYicsXG4gICAgYWxpYXNlczogWydvcGVuX2RvbGxob3VzZV9tZXRyaWNzJywgJ29wZW5fZG9sbGhvdXNlX21jcF9tZXRyaWNzJywgJ29wZW5fbWV0cmljc19kYXNoYm9hcmQnXSxcbiAgICBpbXBsaWNpdFBhcmFtczogeyB0YWI6ICdtZXRyaWNzJyB9LFxuICB9LFxuICBvcGVuX3Blcm1pc3Npb25zOiB7XG4gICAgZW5kcG9pbnQ6ICdSRUFEJyxcbiAgICBoYW5kbGVyOiAnQnJvd3Nlci5vcGVuJyxcbiAgICBkZXNjcmlwdGlvbjogJ09wZW4gdGhlIG1hbmFnZW1lbnQgY29uc29sZSBvbiB0aGUgcGVybWlzc2lvbnMgdGFiJyxcbiAgICBhbGlhc2VzOiBbJ29wZW5fZG9sbGhvdXNlX3Blcm1pc3Npb25zJywgJ29wZW5fZG9sbGhvdXNlX21jcF9wZXJtaXNzaW9ucyddLFxuICAgIGltcGxpY2l0UGFyYW1zOiB7IHRhYjogJ3Blcm1pc3Npb25zJyB9LFxuICB9LFxuICBvcGVuX3NldHVwOiB7XG4gICAgZW5kcG9pbnQ6ICdSRUFEJyxcbiAgICBoYW5kbGVyOiAnQnJvd3Nlci5vcGVuJyxcbiAgICBkZXNjcmlwdGlvbjogJ09wZW4gdGhlIG1hbmFnZW1lbnQgY29uc29sZSBvbiB0aGUgc2V0dXAvaW5zdGFsbCB0YWInLFxuICAgIGFsaWFzZXM6IFsnb3Blbl9kb2xsaG91c2Vfc2V0dXAnLCAnb3Blbl9kb2xsaG91c2VfbWNwX3NldHVwJywgJ29wZW5faW5zdGFsbGVyJ10sXG4gICAgaW1wbGljaXRQYXJhbXM6IHsgdGFiOiAnc2V0dXAnIH0sXG4gIH0sXG4gIC8vIElzc3VlICM0NTI6IEdhdGVrZWVwZXIgY29uZmlybWF0aW9uIGZsb3dcbiAgLy8gUm91dGVkIHRocm91Z2ggRVhFQ1VURSBzbyBNQ1AgY2xpZW50cyBjYW4gZ2F0ZSBpdCBzZXBhcmF0ZWx5IGZyb20gQ1JFQVRFLlxuICAvLyBjb25maXJtX29wZXJhdGlvbiBpcyBub24taWRlbXBvdGVudCBhbmQgYWN0cyBhcyBhIGh1bWFuLWluLXRoZS1sb29wIGNoZWNrcG9pbnQg4oCUXG4gIC8vIGl0IG11c3Qgbm90IHNpbGVudGx5IGF1dG8tYXBwcm92ZSB3aGVuIG9ubHkgQ1JFQVRFIGlzIGFsbG93ZWQuXG4gIGNvbmZpcm1fb3BlcmF0aW9uOiB7XG4gICAgZW5kcG9pbnQ6ICdFWEVDVVRFJyxcbiAgICBoYW5kbGVyOiAnR2F0ZWtlZXBlci5jb25maXJtJyxcbiAgICBkZXNjcmlwdGlvbjogJ0NvbmZpcm0gYSBwZW5kaW5nIG9wZXJhdGlvbiB0aGF0IHJlcXVpcmVzIHVzZXIgYXBwcm92YWwnLFxuICB9LFxuICAvLyBJc3N1ZSAjNjI1OiBDTEktbGV2ZWwgcGVybWlzc2lvbiBkZWxlZ2F0aW9uIHZpYSAtLXBlcm1pc3Npb24tcHJvbXB0LXRvb2xcbiAgLy8gSXNzdWUgIzY0NzogTW92ZWQgdG8gUkVBRCDigJQgdGhpcyBpcyBhIHBvbGljeSBldmFsdWF0aW9uIChyZWFkLW9ubHkpLCBub3QgYSBzdGF0ZSBtdXRhdGlvbi5cbiAgLy8gRW5hYmxlcyAtLXBlcm1pc3Npb24tcHJvbXB0LXRvb2wgdG8gcG9pbnQgYXQgbWNwX2FxbF9yZWFkLlxuICBwZXJtaXNzaW9uX3Byb21wdDoge1xuICAgIGVuZHBvaW50OiAnUkVBRCcsXG4gICAgaGFuZGxlcjogJ0dhdGVrZWVwZXIucGVybWlzc2lvblByb21wdCcsXG4gICAgZGVzY3JpcHRpb246ICdFdmFsdWF0ZSBDTEktbGV2ZWwgcGVybWlzc2lvbiBwcm9tcHRzIGZvciBub24taW50ZXJhY3RpdmUgc2Vzc2lvbnMgdmlhIC0tcGVybWlzc2lvbi1wcm9tcHQtdG9vbCcsXG4gIH0sXG4gIC8vIFBlcm1pc3Npb24gZXZhbHVhdGlvbiBmb3IgUHJlVG9vbFVzZSBob29rcyAoaW50ZXJhY3RpdmUgc2Vzc2lvbnMsIGFsbCBwbGF0Zm9ybXMpXG4gIGV2YWx1YXRlX3Blcm1pc3Npb246IHtcbiAgICBlbmRwb2ludDogJ1JFQUQnLFxuICAgIGhhbmRsZXI6ICdHYXRla2VlcGVyLmV2YWx1YXRlUGVybWlzc2lvbicsXG4gICAgZGVzY3JpcHRpb246ICdFdmFsdWF0ZSBDTEkgcGVybWlzc2lvbiBmb3IgYSB0b29sIHZpYSBIVFRQL2hvb2suIFJldHVybnMgcGxhdGZvcm0tZm9ybWF0dGVkIHJlc3BvbnNlIChjbGF1ZGVfY29kZSwgZ2VtaW5pLCBjdXJzb3IsIHdpbmRzdXJmLCBjb2RleCkuJyxcbiAgfSxcbiAgLy8gSXNzdWUgIzYyNSBQaGFzZSAyOiBDTEkgcG9saWN5IHZpc2liaWxpdHlcbiAgZ2V0X2VmZmVjdGl2ZV9jbGlfcG9saWNpZXM6IHtcbiAgICBlbmRwb2ludDogJ1JFQUQnLFxuICAgIGhhbmRsZXI6ICdHYXRla2VlcGVyLmdldEVmZmVjdGl2ZUNsaVBvbGljaWVzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0dldCBlZmZlY3RpdmUgQ0xJIHBlcm1pc3Npb24gcG9saWNpZXMgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24gKElzc3VlICM2MjUgUGhhc2UgMiknLFxuICB9LFxuICBnZXRfcGVybWlzc2lvbl9hdXRob3JpdHk6IHtcbiAgICBlbmRwb2ludDogJ1JFQUQnLFxuICAgIGhhbmRsZXI6ICdHYXRla2VlcGVyLmdldFBlcm1pc3Npb25BdXRob3JpdHknLFxuICAgIGRlc2NyaXB0aW9uOiAnR2V0IHRoZSBjdXJyZW50IGhvc3QgdnMgRG9sbGhvdXNlIHBlcm1pc3Npb24gYXV0aG9yaXR5IG1vZGUgKHJlYWQtb25seSknLFxuICB9LFxuICAvLyBJc3N1ZSAjNjI1IFBoYXNlIDM6IENMSSBhcHByb3ZhbCB3b3JrZmxvd1xuICBhcHByb3ZlX2NsaV9wZXJtaXNzaW9uOiB7XG4gICAgZW5kcG9pbnQ6ICdFWEVDVVRFJyxcbiAgICBoYW5kbGVyOiAnR2F0ZWtlZXBlci5hcHByb3ZlQ2xpUGVybWlzc2lvbicsXG4gICAgZGVzY3JpcHRpb246ICdBcHByb3ZlIGEgcGVuZGluZyBDTEkgdG9vbCBwZXJtaXNzaW9uIHJlcXVlc3QgKElzc3VlICM2MjUgUGhhc2UgMyknLFxuICB9LFxuICBnZXRfcGVuZGluZ19jbGlfYXBwcm92YWxzOiB7XG4gICAgZW5kcG9pbnQ6ICdSRUFEJyxcbiAgICBoYW5kbGVyOiAnR2F0ZWtlZXBlci5nZXRQZW5kaW5nQ2xpQXBwcm92YWxzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0dldCBwZW5kaW5nIENMSSB0b29sIGFwcHJvdmFsIHJlcXVlc3RzIGZvciB0aGlzIHNlc3Npb24gKElzc3VlICM2MjUgUGhhc2UgMyknLFxuICB9LFxuICAvLyBJc3N1ZSAjMTQyOiBEYW5nZXIgem9uZSB2ZXJpZmljYXRpb24gZmxvd1xuICB2ZXJpZnlfY2hhbGxlbmdlOiB7XG4gICAgZW5kcG9pbnQ6ICdDUkVBVEUnLFxuICAgIGhhbmRsZXI6ICdHYXRla2VlcGVyLnZlcmlmeScsXG4gICAgZGVzY3JpcHRpb246ICdTdWJtaXQgdmVyaWZpY2F0aW9uIGNvZGUgdG8gdW5ibG9jayBhIGRhbmdlciB6b25lIG9wZXJhdGlvbicsXG4gIH0sXG4gIHJlbGVhc2VfZGVhZGxvY2s6IHtcbiAgICBlbmRwb2ludDogJ0NSRUFURScsXG4gICAgaGFuZGxlcjogJ0dhdGVrZWVwZXIucmVsZWFzZURlYWRsb2NrJyxcbiAgICBkZXNjcmlwdGlvbjogJ1VzZSBvdXQtb2YtYmFuZCB2ZXJpZmljYXRpb24gdG8gZGVhY3RpdmF0ZSBhbGwgYWN0aXZlIGVsZW1lbnRzIGFuZCBjbGVhciBjdXJyZW50LXNlc3Npb24gYWN0aXZhdGlvbiBzdGF0ZScsXG4gIH0sXG4gIC8vIElzc3VlICM1MDM6IEJlZXRsZWp1aWNlIHNhZmUtdHJpZ2dlciBmb3IgZGFuZ2VyIHpvbmUgdmVyaWZpY2F0aW9uIHRlc3RpbmdcbiAgYmVldGxlanVpY2VfYmVldGxlanVpY2VfYmVldGxlanVpY2U6IHtcbiAgICBlbmRwb2ludDogJ0NSRUFURScsXG4gICAgaGFuZGxlcjogJ0dhdGVrZWVwZXIuYmVldGxlanVpY2UnLFxuICAgIGRlc2NyaXB0aW9uOiAnU2FmZS10cmlnZ2VyIHRoZSBmdWxsIGRhbmdlciB6b25lIHZlcmlmaWNhdGlvbiBwaXBlbGluZSBmb3IgdGVzdGluZyBwdXJwb3NlcycsXG4gIH0sXG5cbiAgLy8gPT09PT0gUkVBRCBlbmRwb2ludCAocmVhZE9ubHk6IHRydWUsIGRlc3RydWN0aXZlOiBmYWxzZSkgPT09PT1cbiAgLy8gVW5pZmllZCBzZWFyY2ggb3BlcmF0aW9uIChJc3N1ZSAjMjQzKVxuICBzZWFyY2g6IHtcbiAgICBlbmRwb2ludDogJ1JFQUQnLFxuICAgIGhhbmRsZXI6ICdVbmlmaWVkU2VhcmNoLnNlYXJjaCcsXG4gICAgZGVzY3JpcHRpb246ICdVbmlmaWVkIHNlYXJjaCBhY3Jvc3MgbG9jYWwsIEdpdEh1YiwgYW5kIGNvbGxlY3Rpb24gc291cmNlcyB3aXRoIHNjb3BlIHBhcmFtZXRlcicsXG4gIH0sXG4gIGxpc3RfZWxlbWVudHM6IHtcbiAgICBlbmRwb2ludDogJ1JFQUQnLFxuICAgIGhhbmRsZXI6ICdFbGVtZW50Q1JVRC5saXN0JyxcbiAgICBkZXNjcmlwdGlvbjogJ0xpc3QgZWxlbWVudHMgd2l0aCBwYWdpbmF0aW9uIChkZWZhdWx0IDIwL3BhZ2UpLCBmaWx0ZXJpbmcsIHNvcnRpbmcsIGFuZCBjb3VudCBhZ2dyZWdhdGlvbi4gUmV0dXJucyBzdHJ1Y3R1cmVkIEpTT04uJyxcbiAgfSxcbiAgZ2V0X2VsZW1lbnQ6IHtcbiAgICBlbmRwb2ludDogJ1JFQUQnLFxuICAgIGhhbmRsZXI6ICdFbGVtZW50Q1JVRC5nZXQnLFxuICAgIGRlc2NyaXB0aW9uOiAnR2V0IGFuIGVsZW1lbnQgYnkgbmFtZSBhbmQgdHlwZSwgcmV0dXJuaW5nIGZ1bGwgY29udGVudCBhbmQgbWV0YWRhdGEnLFxuICB9LFxuICBnZXRfZWxlbWVudF9kZXRhaWxzOiB7XG4gICAgZW5kcG9pbnQ6ICdSRUFEJyxcbiAgICBoYW5kbGVyOiAnRWxlbWVudENSVUQuZ2V0RGV0YWlscycsXG4gICAgZGVzY3JpcHRpb246ICdHZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBlbGVtZW50JyxcbiAgfSxcbiAgc2VhcmNoX2VsZW1lbnRzOiB7XG4gICAgZW5kcG9pbnQ6ICdSRUFEJyxcbiAgICBoYW5kbGVyOiAnU2VhcmNoLnNlYXJjaCcsXG4gICAgZGVzY3JpcHRpb246ICdGdWxsLXRleHQgc2VhcmNoIGFjcm9zcyBlbGVtZW50IG5hbWVzLCBkZXNjcmlwdGlvbnMsIGFuZCBjb250ZW50LiBSZXR1cm5zIHN0cnVjdHVyZWQgSlNPTiB3aXRoIHBhZ2luYXRpb24uJyxcbiAgfSxcbiAgcXVlcnlfZWxlbWVudHM6IHtcbiAgICBlbmRwb2ludDogJ1JFQUQnLFxuICAgIGhhbmRsZXI6ICdTZWFyY2gucXVlcnknLFxuICAgIGRlc2NyaXB0aW9uOiAnUXVlcnkgZWxlbWVudHMgd2l0aCBmaWx0ZXJzLCBzb3J0aW5nLCBwYWdpbmF0aW9uLCBhbmQgY291bnQgYWdncmVnYXRpb24uIFJldHVybnMgc3RydWN0dXJlZCBKU09OLicsXG4gIH0sXG4gIGdldF9hY3RpdmVfZWxlbWVudHM6IHtcbiAgICBlbmRwb2ludDogJ1JFQUQnLFxuICAgIGhhbmRsZXI6ICdBY3RpdmF0aW9uLmdldEFjdGl2ZScsXG4gICAgZGVzY3JpcHRpb246ICdHZXQgYWxsIGN1cnJlbnRseSBhY3RpdmUgZWxlbWVudHMgd2l0aCByZW5kZXJlZCBjb250ZW50LCBvcHRpb25hbGx5IGZpbHRlcmVkIGJ5IHR5cGUnLFxuICB9LFxuICB2YWxpZGF0ZV9lbGVtZW50OiB7XG4gICAgZW5kcG9pbnQ6ICdSRUFEJyxcbiAgICBoYW5kbGVyOiAnRWxlbWVudENSVUQudmFsaWRhdGUnLFxuICAgIGRlc2NyaXB0aW9uOiAnVmFsaWRhdGUgYW4gZXhpc3RpbmcgZWxlbWVudCBieSBuYW1lJyxcbiAgfSxcbiAgcmVuZGVyOiB7XG4gICAgZW5kcG9pbnQ6ICdSRUFEJyxcbiAgICBoYW5kbGVyOiAnVGVtcGxhdGUucmVuZGVyJyxcbiAgICBkZXNjcmlwdGlvbjogJ1JlbmRlciBhIHRlbXBsYXRlIHdpdGggcHJvdmlkZWQgdmFyaWFibGVzJyxcbiAgfSxcbiAgZXhwb3J0X2VsZW1lbnQ6IHtcbiAgICBlbmRwb2ludDogJ1JFQUQnLFxuICAgIGhhbmRsZXI6ICdFbGVtZW50Q1JVRC5leHBvcnQnLFxuICAgIGRlc2NyaXB0aW9uOiAnRXhwb3J0IGFuIGVsZW1lbnQgdG8gYSBwb3J0YWJsZSBmb3JtYXQnLFxuICB9LFxuICBkZWFjdGl2YXRlX2VsZW1lbnQ6IHtcbiAgICBlbmRwb2ludDogJ1JFQUQnLFxuICAgIGhhbmRsZXI6ICdBY3RpdmF0aW9uLmRlYWN0aXZhdGUnLFxuICAgIGRlc2NyaXB0aW9uOiAnRGVhY3RpdmF0ZSBhbiBlbGVtZW50LCByZW1vdmluZyBpdCBmcm9tIHRoZSBjdXJyZW50IHNlc3Npb24nLFxuICB9LFxuICBpbnRyb3NwZWN0OiB7XG4gICAgZW5kcG9pbnQ6ICdSRUFEJyxcbiAgICBoYW5kbGVyOiAnSW50cm9zcGVjdGlvbi5yZXNvbHZlJyxcbiAgICBkZXNjcmlwdGlvbjogJ1F1ZXJ5IGF2YWlsYWJsZSBvcGVyYXRpb25zIGFuZCB0eXBlcyBmb3IgZGlzY292ZXJ5JyxcbiAgfSxcbiAgZ2V0X2NhcGFiaWxpdGllczoge1xuICAgIGVuZHBvaW50OiAnUkVBRCcsXG4gICAgaGFuZGxlcjogJ0ludHJvc3BlY3Rpb24uZ2V0Q2FwYWJpbGl0aWVzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0dldCBhIGhpZ2gtbGV2ZWwgbWFwIG9mIGFsbCBzZXJ2ZXIgY2FwYWJpbGl0aWVzIGdyb3VwZWQgYnkgdXNlciBpbnRlbnQnLFxuICB9LFxuXG4gIC8vID09PT09IFVQREFURSBlbmRwb2ludCAocmVhZE9ubHk6IGZhbHNlLCBkZXN0cnVjdGl2ZTogdHJ1ZSkgPT09PT1cbiAgZWRpdF9lbGVtZW50OiB7XG4gICAgZW5kcG9pbnQ6ICdVUERBVEUnLFxuICAgIGhhbmRsZXI6ICdFbGVtZW50Q1JVRC5lZGl0JyxcbiAgICBkZXNjcmlwdGlvbjogJ0VkaXQgYSBzaW5nbGUgZmllbGQgb24gYW4gZWxlbWVudCcsXG4gIH0sXG4gIHVwZ3JhZGVfZWxlbWVudDoge1xuICAgIGVuZHBvaW50OiAnVVBEQVRFJyxcbiAgICBoYW5kbGVyOiAnRWxlbWVudENSVUQudXBncmFkZScsXG4gICAgZGVzY3JpcHRpb246ICdVcGdyYWRlIGVsZW1lbnQgZnJvbSB2MSBzaW5nbGUtYm9keSB0byB2MiBkdWFsLWZpZWxkIGZvcm1hdCAoaW5zdHJ1Y3Rpb25zICsgY29udGVudCknLFxuICB9LFxuXG4gIC8vID09PT09IERFTEVURSBlbmRwb2ludCAocmVhZE9ubHk6IGZhbHNlLCBkZXN0cnVjdGl2ZTogdHJ1ZSkgPT09PT1cbiAgZGVsZXRlX2VsZW1lbnQ6IHtcbiAgICBlbmRwb2ludDogJ0RFTEVURScsXG4gICAgaGFuZGxlcjogJ0VsZW1lbnRDUlVELmRlbGV0ZScsXG4gICAgZGVzY3JpcHRpb246ICdEZWxldGUgYW4gZWxlbWVudCcsXG4gIH0sXG4gIGNsZWFyOiB7XG4gICAgZW5kcG9pbnQ6ICdERUxFVEUnLFxuICAgIGhhbmRsZXI6ICdNZW1vcnkuY2xlYXInLFxuICAgIGRlc2NyaXB0aW9uOiAnQ2xlYXIgYWxsIGVudHJpZXMgZnJvbSBhIG1lbW9yeSBlbGVtZW50IChpcnJldmVyc2libGUpJyxcbiAgfSxcblxuICAvLyA9PT09PSBFWEVDVVRFIGVuZHBvaW50IChydW50aW1lIGV4ZWN1dGlvbiBsaWZlY3ljbGUpID09PT09XG4gIC8vIFRoZXNlIG9wZXJhdGlvbnMgbWFuYWdlIHRoZSBleGVjdXRpb24gbGlmZWN5Y2xlIG9mIGV4ZWN1dGFibGUgZWxlbWVudHNcbiAgLy8gKGFnZW50cywgd29ya2Zsb3dzLCBwaXBlbGluZXMpLiBVbmxpa2UgQ1JVRCB3aGljaCBtYW5hZ2VzIGRlZmluaXRpb25zLFxuICAvLyBFWEVDVVRFIG1hbmFnZXMgcnVudGltZSBzdGF0ZSBhbmQgaXMgaW5oZXJlbnRseSBub24taWRlbXBvdGVudC5cbiAgZXhlY3V0ZV9hZ2VudDoge1xuICAgIGVuZHBvaW50OiAnRVhFQ1VURScsXG4gICAgaGFuZGxlcjogJ0V4ZWN1dGUuZXhlY3V0ZScsXG4gICAgZGVzY3JpcHRpb246ICdTdGFydCBleGVjdXRpb24gb2YgYW4gYWdlbnQgb3IgZXhlY3V0YWJsZSBlbGVtZW50JyxcbiAgfSxcbiAgZ2V0X2V4ZWN1dGlvbl9zdGF0ZToge1xuICAgIGVuZHBvaW50OiAnUkVBRCcsXG4gICAgaGFuZGxlcjogJ0V4ZWN1dGUuZ2V0U3RhdGUnLFxuICAgIGRlc2NyaXB0aW9uOiAnUXVlcnkgY3VycmVudCBleGVjdXRpb24gc3RhdGUgaW5jbHVkaW5nIHByb2dyZXNzIGFuZCBmaW5kaW5ncycsXG4gIH0sXG4gIHJlY29yZF9leGVjdXRpb25fc3RlcDoge1xuICAgIGVuZHBvaW50OiAnQ1JFQVRFJyxcbiAgICBoYW5kbGVyOiAnRXhlY3V0ZS51cGRhdGVTdGF0ZScsXG4gICAgZGVzY3JpcHRpb246ICdSZWNvcmQgZXhlY3V0aW9uIHByb2dyZXNzLCBzdGVwIGNvbXBsZXRpb24sIG9yIGZpbmRpbmdzLiBSZXR1cm5zIGF1dG9ub215IGRpcmVjdGl2ZSB3aXRoIGNvbnRpbnVlL3BhdXNlIGRlY2lzaW9uIGFuZCBub3RpZmljYXRpb25zLicsXG4gIH0sXG4gIGNvbXBsZXRlX2V4ZWN1dGlvbjoge1xuICAgIGVuZHBvaW50OiAnRVhFQ1VURScsXG4gICAgaGFuZGxlcjogJ0V4ZWN1dGUuY29tcGxldGUnLFxuICAgIGRlc2NyaXB0aW9uOiAnU2lnbmFsIHRoYXQgZXhlY3V0aW9uIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseSB3aXRoIHN1bW1hcnknLFxuICB9LFxuICBjb250aW51ZV9leGVjdXRpb246IHtcbiAgICBlbmRwb2ludDogJ0VYRUNVVEUnLFxuICAgIGhhbmRsZXI6ICdFeGVjdXRlLmNvbnRpbnVlJyxcbiAgICBkZXNjcmlwdGlvbjogJ1Jlc3VtZSBleGVjdXRpb24gZnJvbSBzYXZlZCBzdGF0ZScsXG4gIH0sXG4gIGFib3J0X2V4ZWN1dGlvbjoge1xuICAgIGVuZHBvaW50OiAnRVhFQ1VURScsXG4gICAgaGFuZGxlcjogJ0V4ZWN1dGUuYWJvcnQnLFxuICAgIGRlc2NyaXB0aW9uOiAnQWJvcnQgYSBydW5uaW5nIGFnZW50IGV4ZWN1dGlvbiwgcmVqZWN0aW5nIGZ1cnRoZXIgb3BlcmF0aW9ucyBmb3IgdGhlIGdvYWxJZCcsXG4gIH0sXG4gIGdldF9nYXRoZXJlZF9kYXRhOiB7XG4gICAgZW5kcG9pbnQ6ICdSRUFEJyxcbiAgICBoYW5kbGVyOiAnRXhlY3V0ZS5nZXRHYXRoZXJlZERhdGEnLFxuICAgIGRlc2NyaXB0aW9uOiAnR2V0IGFnZ3JlZ2F0ZWQgZXhlY3V0aW9uIGRhdGEgKHN0ZXBzLCBkZWNpc2lvbnMsIGZpbmRpbmdzLCBhbmQgc3VtbWFyeSBzdGF0aXN0aWNzKSBmb3IgYSBzcGVjaWZpYyBnb2FsLiBVc2UgYWZ0ZXIgcmVjb3JkX2V4ZWN1dGlvbl9zdGVwIGNhbGxzIHRvIHJldmlldyBwcm9ncmVzcy4nLFxuICB9LFxuICBwcmVwYXJlX2hhbmRvZmY6IHtcbiAgICBlbmRwb2ludDogJ0VYRUNVVEUnLFxuICAgIGhhbmRsZXI6ICdFeGVjdXRlLnByZXBhcmVIYW5kb2ZmJyxcbiAgICBkZXNjcmlwdGlvbjogJ1ByZXBhcmUgYSBzZXNzaW9uIGhhbmRvZmYgcGFja2FnZTogc2VyaWFsaXplcyBnb2FsIHByb2dyZXNzLCBnYXRoZXJlZCBkYXRhLCBhbmQgYWN0aXZlIGVsZW1lbnRzIGludG8gYSBjb21wcmVzc2VkLCBpbnRlZ3JpdHktY2hlY2tlZCBibG9jayB0aGF0IGNhbiBiZSBjb3B5LXBhc3RlZCB0byByZXN1bWUgaW4gYW5vdGhlciBzZXNzaW9uLicsXG4gIH0sXG4gIHJlc3VtZV9mcm9tX2hhbmRvZmY6IHtcbiAgICBlbmRwb2ludDogJ0VYRUNVVEUnLFxuICAgIGhhbmRsZXI6ICdFeGVjdXRlLnJlc3VtZUZyb21IYW5kb2ZmJyxcbiAgICBkZXNjcmlwdGlvbjogJ1Jlc3VtZSBhZ2VudCBleGVjdXRpb24gZnJvbSBhIGhhbmRvZmYgYmxvY2suIFZhbGlkYXRlcyBpbnRlZ3JpdHksIHZlcmlmaWVzIGFnZW50IG5hbWUgbWF0Y2gsIHJlc3RvcmVzIGNvbnRleHQsIGFuZCBjb250aW51ZXMgZXhlY3V0aW9uIHdpdGggY2FsbGVyLXN1cHBsaWVkIHBhcmFtZXRlcnMuJyxcbiAgfSxcblxuICAvLyA9PT09PSBDT0xMRUNUSU9OIG9wZXJhdGlvbnMgPT09PT1cbiAgYnJvd3NlX2NvbGxlY3Rpb246IHtcbiAgICBlbmRwb2ludDogJ1JFQUQnLFxuICAgIGhhbmRsZXI6ICdDb2xsZWN0aW9uLmJyb3dzZScsXG4gICAgZGVzY3JpcHRpb246ICdCcm93c2UgdGhlIERvbGxob3VzZU1DUCBjb21tdW5pdHkgY29sbGVjdGlvbiBieSBzZWN0aW9uIGFuZCB0eXBlJyxcbiAgfSxcbiAgc2VhcmNoX2NvbGxlY3Rpb246IHtcbiAgICBlbmRwb2ludDogJ1JFQUQnLFxuICAgIGhhbmRsZXI6ICdDb2xsZWN0aW9uLnNlYXJjaCcsXG4gICAgZGVzY3JpcHRpb246ICdTZWFyY2ggdGhlIGNvbW11bml0eSBjb2xsZWN0aW9uIGZvciBlbGVtZW50cyBieSBrZXl3b3JkcycsXG4gIH0sXG4gIHNlYXJjaF9jb2xsZWN0aW9uX2VuaGFuY2VkOiB7XG4gICAgZW5kcG9pbnQ6ICdSRUFEJyxcbiAgICBoYW5kbGVyOiAnQ29sbGVjdGlvbi5zZWFyY2hFbmhhbmNlZCcsXG4gICAgZGVzY3JpcHRpb246ICdBZHZhbmNlZCBzZWFyY2ggd2l0aCBwYWdpbmF0aW9uLCBmaWx0ZXJpbmcsIGFuZCBzb3J0aW5nJyxcbiAgfSxcbiAgZ2V0X2NvbGxlY3Rpb25fY29udGVudDoge1xuICAgIGVuZHBvaW50OiAnUkVBRCcsXG4gICAgaGFuZGxlcjogJ0NvbGxlY3Rpb24uZ2V0Q29udGVudCcsXG4gICAgZGVzY3JpcHRpb246ICdHZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgY29udGVudCBmcm9tIHRoZSBjb2xsZWN0aW9uJyxcbiAgfSxcbiAgZ2V0X2NvbGxlY3Rpb25fY2FjaGVfaGVhbHRoOiB7XG4gICAgZW5kcG9pbnQ6ICdSRUFEJyxcbiAgICBoYW5kbGVyOiAnQ29sbGVjdGlvbi5nZXRDYWNoZUhlYWx0aCcsXG4gICAgZGVzY3JpcHRpb246ICdHZXQgaGVhbHRoIHN0YXR1cyBhbmQgc3RhdGlzdGljcyBmb3IgdGhlIGNvbGxlY3Rpb24gY2FjaGUnLFxuICB9LFxuICBpbnN0YWxsX2NvbGxlY3Rpb25fY29udGVudDoge1xuICAgIGVuZHBvaW50OiAnQ1JFQVRFJyxcbiAgICBoYW5kbGVyOiAnQ29sbGVjdGlvbi5pbnN0YWxsJyxcbiAgICBkZXNjcmlwdGlvbjogJ0luc3RhbGwgYW4gZWxlbWVudCBmcm9tIHRoZSBjb2xsZWN0aW9uIHRvIHlvdXIgbG9jYWwgcG9ydGZvbGlvJyxcbiAgfSxcbiAgc3VibWl0X2NvbGxlY3Rpb25fY29udGVudDoge1xuICAgIGVuZHBvaW50OiAnQ1JFQVRFJyxcbiAgICBoYW5kbGVyOiAnQ29sbGVjdGlvbi5zdWJtaXQnLFxuICAgIGRlc2NyaXB0aW9uOiAnU3VibWl0IGEgbG9jYWwgZWxlbWVudCB0byB0aGUgY29tbXVuaXR5IGNvbGxlY3Rpb24gdmlhIEdpdEh1YicsXG4gIH0sXG5cbiAgLy8gPT09PT0gUE9SVEZPTElPIG9wZXJhdGlvbnMgPT09PT1cbiAgcG9ydGZvbGlvX3N0YXR1czoge1xuICAgIGVuZHBvaW50OiAnUkVBRCcsXG4gICAgaGFuZGxlcjogJ1BvcnRmb2xpby5zdGF0dXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnQ2hlY2sgR2l0SHViIHBvcnRmb2xpbyByZXBvc2l0b3J5IHN0YXR1cyBhbmQgZWxlbWVudCBjb3VudHMnLFxuICB9LFxuICBwb3J0Zm9saW9fY29uZmlnOiB7XG4gICAgZW5kcG9pbnQ6ICdSRUFEJyxcbiAgICBoYW5kbGVyOiAnUG9ydGZvbGlvLmNvbmZpZycsXG4gICAgZGVzY3JpcHRpb246ICdDb25maWd1cmUgcG9ydGZvbGlvIHNldHRpbmdzIChhdXRvLXN5bmMsIHZpc2liaWxpdHksIGV0Yy4pJyxcbiAgfSxcbiAgc2VhcmNoX3BvcnRmb2xpbzoge1xuICAgIGVuZHBvaW50OiAnUkVBRCcsXG4gICAgaGFuZGxlcjogJ1BvcnRmb2xpby5zZWFyY2gnLFxuICAgIGRlc2NyaXB0aW9uOiAnU2VhcmNoIGxvY2FsIHBvcnRmb2xpbyBieSBjb250ZW50IG5hbWUsIGtleXdvcmRzLCBvciB0YWdzJyxcbiAgfSxcbiAgc2VhcmNoX2FsbDoge1xuICAgIGVuZHBvaW50OiAnUkVBRCcsXG4gICAgaGFuZGxlcjogJ1BvcnRmb2xpby5z