llmverify
Version:
AI Output Verification Toolkit — Local-first LLM safety, hallucination detection, PII redaction, prompt injection defense, and runtime monitoring. Zero telemetry. OWASP LLM Top 10 aligned.
263 lines • 27.4 kB
JavaScript
"use strict";
/**
* Error Codes for llmverify
*
* Standardized error codes for consistent error handling
*
* @module errors/codes
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.ERROR_METADATA = exports.ErrorSeverity = exports.ErrorCode = void 0;
exports.getErrorMetadata = getErrorMetadata;
exports.isRecoverable = isRecoverable;
exports.getErrorSuggestion = getErrorSuggestion;
/**
* Error code enum
*/
var ErrorCode;
(function (ErrorCode) {
// Input validation errors (1xxx)
ErrorCode["INVALID_INPUT"] = "LLMVERIFY_1001";
ErrorCode["EMPTY_INPUT"] = "LLMVERIFY_1002";
ErrorCode["CONTENT_TOO_LARGE"] = "LLMVERIFY_1003";
ErrorCode["INVALID_FORMAT"] = "LLMVERIFY_1004";
ErrorCode["INVALID_ENCODING"] = "LLMVERIFY_1005";
// Configuration errors (2xxx)
ErrorCode["MALFORMED_CONFIG"] = "LLMVERIFY_2001";
ErrorCode["INVALID_CONFIG"] = "LLMVERIFY_2002";
ErrorCode["CONFIG_NOT_FOUND"] = "LLMVERIFY_2003";
ErrorCode["INVALID_TIER"] = "LLMVERIFY_2004";
// Runtime errors (3xxx)
ErrorCode["TIMEOUT"] = "LLMVERIFY_3001";
ErrorCode["ENGINE_FAILURE"] = "LLMVERIFY_3002";
ErrorCode["RESOURCE_EXHAUSTED"] = "LLMVERIFY_3003";
ErrorCode["INTERNAL_ERROR"] = "LLMVERIFY_3004";
// Server errors (4xxx)
ErrorCode["PORT_IN_USE"] = "LLMVERIFY_4001";
ErrorCode["SERVER_START_FAILED"] = "LLMVERIFY_4002";
ErrorCode["INVALID_REQUEST"] = "LLMVERIFY_4003";
ErrorCode["RATE_LIMIT_EXCEEDED"] = "LLMVERIFY_4004";
// Privacy/Security errors (5xxx)
ErrorCode["PRIVACY_VIOLATION"] = "LLMVERIFY_5001";
ErrorCode["UNAUTHORIZED"] = "LLMVERIFY_5002";
ErrorCode["FORBIDDEN"] = "LLMVERIFY_5003";
// Plugin errors (6xxx)
ErrorCode["PLUGIN_NOT_FOUND"] = "LLMVERIFY_6001";
ErrorCode["PLUGIN_LOAD_FAILED"] = "LLMVERIFY_6002";
ErrorCode["PLUGIN_EXECUTION_FAILED"] = "LLMVERIFY_6003";
ErrorCode["INVALID_PLUGIN"] = "LLMVERIFY_6004";
})(ErrorCode || (exports.ErrorCode = ErrorCode = {}));
/**
* Error severity levels
*/
var ErrorSeverity;
(function (ErrorSeverity) {
ErrorSeverity["LOW"] = "low";
ErrorSeverity["MEDIUM"] = "medium";
ErrorSeverity["HIGH"] = "high";
ErrorSeverity["CRITICAL"] = "critical";
})(ErrorSeverity || (exports.ErrorSeverity = ErrorSeverity = {}));
/**
* Error code metadata mapping
*/
exports.ERROR_METADATA = {
// Input validation
[]: {
code: ErrorCode.INVALID_INPUT,
severity: ErrorSeverity.MEDIUM,
message: 'Invalid input provided',
recoverable: true,
suggestion: 'Check input format and try again'
},
[]: {
code: ErrorCode.EMPTY_INPUT,
severity: ErrorSeverity.MEDIUM,
message: 'Input content is empty',
recoverable: true,
suggestion: 'Provide non-empty content to verify'
},
[]: {
code: ErrorCode.CONTENT_TOO_LARGE,
severity: ErrorSeverity.MEDIUM,
message: 'Content exceeds maximum allowed size',
recoverable: true,
suggestion: 'Reduce content size or split into smaller chunks'
},
[]: {
code: ErrorCode.INVALID_FORMAT,
severity: ErrorSeverity.MEDIUM,
message: 'Invalid content format',
recoverable: true,
suggestion: 'Ensure content is in the expected format'
},
[]: {
code: ErrorCode.INVALID_ENCODING,
severity: ErrorSeverity.MEDIUM,
message: 'Invalid character encoding',
recoverable: true,
suggestion: 'Use UTF-8 encoding'
},
// Configuration
[]: {
code: ErrorCode.MALFORMED_CONFIG,
severity: ErrorSeverity.HIGH,
message: 'Configuration file is malformed',
recoverable: true,
suggestion: 'Check JSON syntax in config file'
},
[]: {
code: ErrorCode.INVALID_CONFIG,
severity: ErrorSeverity.HIGH,
message: 'Invalid configuration values',
recoverable: true,
suggestion: 'Review configuration documentation'
},
[]: {
code: ErrorCode.CONFIG_NOT_FOUND,
severity: ErrorSeverity.LOW,
message: 'Configuration file not found',
recoverable: true,
suggestion: 'Run "npx llmverify init" to create default config'
},
[]: {
code: ErrorCode.INVALID_TIER,
severity: ErrorSeverity.MEDIUM,
message: 'Invalid tier specified',
recoverable: true,
suggestion: 'Use: free, team, professional, or enterprise'
},
// Runtime
[]: {
code: ErrorCode.TIMEOUT,
severity: ErrorSeverity.HIGH,
message: 'Operation timed out',
recoverable: true,
suggestion: 'Increase timeout or reduce content size'
},
[]: {
code: ErrorCode.ENGINE_FAILURE,
severity: ErrorSeverity.HIGH,
message: 'Verification engine failed',
recoverable: true,
suggestion: 'Try again or disable the failing engine'
},
[]: {
code: ErrorCode.RESOURCE_EXHAUSTED,
severity: ErrorSeverity.CRITICAL,
message: 'System resources exhausted',
recoverable: false,
suggestion: 'Reduce load or increase system resources'
},
[]: {
code: ErrorCode.INTERNAL_ERROR,
severity: ErrorSeverity.CRITICAL,
message: 'Internal error occurred',
recoverable: false,
suggestion: 'Report this issue with error details'
},
// Server
[]: {
code: ErrorCode.PORT_IN_USE,
severity: ErrorSeverity.HIGH,
message: 'Port is already in use',
recoverable: true,
suggestion: 'Use a different port with --port flag'
},
[]: {
code: ErrorCode.SERVER_START_FAILED,
severity: ErrorSeverity.CRITICAL,
message: 'Failed to start server',
recoverable: false,
suggestion: 'Check logs for details'
},
[]: {
code: ErrorCode.INVALID_REQUEST,
severity: ErrorSeverity.MEDIUM,
message: 'Invalid request format',
recoverable: true,
suggestion: 'Check API documentation'
},
[]: {
code: ErrorCode.RATE_LIMIT_EXCEEDED,
severity: ErrorSeverity.MEDIUM,
message: 'Rate limit exceeded',
recoverable: true,
suggestion: 'Wait before making more requests'
},
// Privacy/Security
[]: {
code: ErrorCode.PRIVACY_VIOLATION,
severity: ErrorSeverity.CRITICAL,
message: 'Privacy policy violation detected',
recoverable: false,
suggestion: 'Review privacy settings'
},
[]: {
code: ErrorCode.UNAUTHORIZED,
severity: ErrorSeverity.HIGH,
message: 'Unauthorized access',
recoverable: true,
suggestion: 'Provide valid API key'
},
[]: {
code: ErrorCode.FORBIDDEN,
severity: ErrorSeverity.HIGH,
message: 'Access forbidden',
recoverable: false,
suggestion: 'Upgrade tier for this feature'
},
// Plugins
[]: {
code: ErrorCode.PLUGIN_NOT_FOUND,
severity: ErrorSeverity.MEDIUM,
message: 'Plugin not found',
recoverable: true,
suggestion: 'Check plugin ID and registration'
},
[]: {
code: ErrorCode.PLUGIN_LOAD_FAILED,
severity: ErrorSeverity.HIGH,
message: 'Failed to load plugin',
recoverable: true,
suggestion: 'Check plugin compatibility'
},
[]: {
code: ErrorCode.PLUGIN_EXECUTION_FAILED,
severity: ErrorSeverity.MEDIUM,
message: 'Plugin execution failed',
recoverable: true,
suggestion: 'Check plugin implementation'
},
[]: {
code: ErrorCode.INVALID_PLUGIN,
severity: ErrorSeverity.HIGH,
message: 'Invalid plugin structure',
recoverable: true,
suggestion: 'Ensure plugin implements required interface'
}
};
/**
* Get error metadata
*/
function getErrorMetadata(code, details, requestId) {
const base = exports.ERROR_METADATA[code];
return {
...base,
timestamp: new Date().toISOString(),
requestId,
details
};
}
/**
* Check if error is recoverable
*/
function isRecoverable(code) {
return exports.ERROR_METADATA[code].recoverable;
}
/**
* Get error suggestion
*/
function getErrorSuggestion(code) {
return exports.ERROR_METADATA[code].suggestion;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXJyb3JzL2NvZGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUc7OztBQStQSCw0Q0FRQztBQUtELHNDQUVDO0FBS0QsZ0RBRUM7QUFuUkQ7O0dBRUc7QUFDSCxJQUFZLFNBb0NYO0FBcENELFdBQVksU0FBUztJQUNuQixpQ0FBaUM7SUFDakMsNkNBQWdDLENBQUE7SUFDaEMsMkNBQThCLENBQUE7SUFDOUIsaURBQW9DLENBQUE7SUFDcEMsOENBQWlDLENBQUE7SUFDakMsZ0RBQW1DLENBQUE7SUFFbkMsOEJBQThCO0lBQzlCLGdEQUFtQyxDQUFBO0lBQ25DLDhDQUFpQyxDQUFBO0lBQ2pDLGdEQUFtQyxDQUFBO0lBQ25DLDRDQUErQixDQUFBO0lBRS9CLHdCQUF3QjtJQUN4Qix1Q0FBMEIsQ0FBQTtJQUMxQiw4Q0FBaUMsQ0FBQTtJQUNqQyxrREFBcUMsQ0FBQTtJQUNyQyw4Q0FBaUMsQ0FBQTtJQUVqQyx1QkFBdUI7SUFDdkIsMkNBQThCLENBQUE7SUFDOUIsbURBQXNDLENBQUE7SUFDdEMsK0NBQWtDLENBQUE7SUFDbEMsbURBQXNDLENBQUE7SUFFdEMsaUNBQWlDO0lBQ2pDLGlEQUFvQyxDQUFBO0lBQ3BDLDRDQUErQixDQUFBO0lBQy9CLHlDQUE0QixDQUFBO0lBRTVCLHVCQUF1QjtJQUN2QixnREFBbUMsQ0FBQTtJQUNuQyxrREFBcUMsQ0FBQTtJQUNyQyx1REFBMEMsQ0FBQTtJQUMxQyw4Q0FBaUMsQ0FBQTtBQUNuQyxDQUFDLEVBcENXLFNBQVMseUJBQVQsU0FBUyxRQW9DcEI7QUFFRDs7R0FFRztBQUNILElBQVksYUFLWDtBQUxELFdBQVksYUFBYTtJQUN2Qiw0QkFBVyxDQUFBO0lBQ1gsa0NBQWlCLENBQUE7SUFDakIsOEJBQWEsQ0FBQTtJQUNiLHNDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFMVyxhQUFhLDZCQUFiLGFBQWEsUUFLeEI7QUFnQkQ7O0dBRUc7QUFDVSxRQUFBLGNBQWMsR0FBa0Y7SUFDM0csbUJBQW1CO0lBQ25CLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFO1FBQ3pCLElBQUksRUFBRSxTQUFTLENBQUMsYUFBYTtRQUM3QixRQUFRLEVBQUUsYUFBYSxDQUFDLE1BQU07UUFDOUIsT0FBTyxFQUFFLHdCQUF3QjtRQUNqQyxXQUFXLEVBQUUsSUFBSTtRQUNqQixVQUFVLEVBQUUsa0NBQWtDO0tBQy9DO0lBQ0QsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUU7UUFDdkIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxXQUFXO1FBQzNCLFFBQVEsRUFBRSxhQUFhLENBQUMsTUFBTTtRQUM5QixPQUFPLEVBQUUsd0JBQXdCO1FBQ2pDLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFVBQVUsRUFBRSxxQ0FBcUM7S0FDbEQ7SUFDRCxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1FBQzdCLElBQUksRUFBRSxTQUFTLENBQUMsaUJBQWlCO1FBQ2pDLFFBQVEsRUFBRSxhQUFhLENBQUMsTUFBTTtRQUM5QixPQUFPLEVBQUUsc0NBQXNDO1FBQy9DLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFVBQVUsRUFBRSxrREFBa0Q7S0FDL0Q7SUFDRCxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRTtRQUMxQixJQUFJLEVBQUUsU0FBUyxDQUFDLGNBQWM7UUFDOUIsUUFBUSxFQUFFLGFBQWEsQ0FBQyxNQUFNO1FBQzlCLE9BQU8sRUFBRSx3QkFBd0I7UUFDakMsV0FBVyxFQUFFLElBQUk7UUFDakIsVUFBVSxFQUFFLDBDQUEwQztLQUN2RDtJQUNELENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEVBQUU7UUFDNUIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxnQkFBZ0I7UUFDaEMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxNQUFNO1FBQzlCLE9BQU8sRUFBRSw0QkFBNEI7UUFDckMsV0FBVyxFQUFFLElBQUk7UUFDakIsVUFBVSxFQUFFLG9CQUFvQjtLQUNqQztJQUVELGdCQUFnQjtJQUNoQixDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1FBQzVCLElBQUksRUFBRSxTQUFTLENBQUMsZ0JBQWdCO1FBQ2hDLFFBQVEsRUFBRSxhQUFhLENBQUMsSUFBSTtRQUM1QixPQUFPLEVBQUUsaUNBQWlDO1FBQzFDLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFVBQVUsRUFBRSxrQ0FBa0M7S0FDL0M7SUFDRCxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRTtRQUMxQixJQUFJLEVBQUUsU0FBUyxDQUFDLGNBQWM7UUFDOUIsUUFBUSxFQUFFLGFBQWEsQ0FBQyxJQUFJO1FBQzVCLE9BQU8sRUFBRSw4QkFBOEI7UUFDdkMsV0FBVyxFQUFFLElBQUk7UUFDakIsVUFBVSxFQUFFLG9DQUFvQztLQUNqRDtJQUNELENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEVBQUU7UUFDNUIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxnQkFBZ0I7UUFDaEMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxHQUFHO1FBQzNCLE9BQU8sRUFBRSw4QkFBOEI7UUFDdkMsV0FBVyxFQUFFLElBQUk7UUFDakIsVUFBVSxFQUFFLG1EQUFtRDtLQUNoRTtJQUNELENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFO1FBQ3hCLElBQUksRUFBRSxTQUFTLENBQUMsWUFBWTtRQUM1QixRQUFRLEVBQUUsYUFBYSxDQUFDLE1BQU07UUFDOUIsT0FBTyxFQUFFLHdCQUF3QjtRQUNqQyxXQUFXLEVBQUUsSUFBSTtRQUNqQixVQUFVLEVBQUUsOENBQThDO0tBQzNEO0lBRUQsVUFBVTtJQUNWLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ25CLElBQUksRUFBRSxTQUFTLENBQUMsT0FBTztRQUN2QixRQUFRLEVBQUUsYUFBYSxDQUFDLElBQUk7UUFDNUIsT0FBTyxFQUFFLHFCQUFxQjtRQUM5QixXQUFXLEVBQUUsSUFBSTtRQUNqQixVQUFVLEVBQUUseUNBQXlDO0tBQ3REO0lBQ0QsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUU7UUFDMUIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxjQUFjO1FBQzlCLFFBQVEsRUFBRSxhQUFhLENBQUMsSUFBSTtRQUM1QixPQUFPLEVBQUUsNEJBQTRCO1FBQ3JDLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFVBQVUsRUFBRSx5Q0FBeUM7S0FDdEQ7SUFDRCxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFO1FBQzlCLElBQUksRUFBRSxTQUFTLENBQUMsa0JBQWtCO1FBQ2xDLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUTtRQUNoQyxPQUFPLEVBQUUsNEJBQTRCO1FBQ3JDLFdBQVcsRUFBRSxLQUFLO1FBQ2xCLFVBQVUsRUFBRSwwQ0FBMEM7S0FDdkQ7SUFDRCxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRTtRQUMxQixJQUFJLEVBQUUsU0FBUyxDQUFDLGNBQWM7UUFDOUIsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRO1FBQ2hDLE9BQU8sRUFBRSx5QkFBeUI7UUFDbEMsV0FBVyxFQUFFLEtBQUs7UUFDbEIsVUFBVSxFQUFFLHNDQUFzQztLQUNuRDtJQUVELFNBQVM7SUFDVCxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRTtRQUN2QixJQUFJLEVBQUUsU0FBUyxDQUFDLFdBQVc7UUFDM0IsUUFBUSxFQUFFLGFBQWEsQ0FBQyxJQUFJO1FBQzVCLE9BQU8sRUFBRSx3QkFBd0I7UUFDakMsV0FBVyxFQUFFLElBQUk7UUFDakIsVUFBVSxFQUFFLHVDQUF1QztLQUNwRDtJQUNELENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLEVBQUU7UUFDL0IsSUFBSSxFQUFFLFNBQVMsQ0FBQyxtQkFBbUI7UUFDbkMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRO1FBQ2hDLE9BQU8sRUFBRSx3QkFBd0I7UUFDakMsV0FBVyxFQUFFLEtBQUs7UUFDbEIsVUFBVSxFQUFFLHdCQUF3QjtLQUNyQztJQUNELENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQzNCLElBQUksRUFBRSxTQUFTLENBQUMsZUFBZTtRQUMvQixRQUFRLEVBQUUsYUFBYSxDQUFDLE1BQU07UUFDOUIsT0FBTyxFQUFFLHdCQUF3QjtRQUNqQyxXQUFXLEVBQUUsSUFBSTtRQUNqQixVQUFVLEVBQUUseUJBQXlCO0tBQ3RDO0lBQ0QsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsRUFBRTtRQUMvQixJQUFJLEVBQUUsU0FBUyxDQUFDLG1CQUFtQjtRQUNuQyxRQUFRLEVBQUUsYUFBYSxDQUFDLE1BQU07UUFDOUIsT0FBTyxFQUFFLHFCQUFxQjtRQUM5QixXQUFXLEVBQUUsSUFBSTtRQUNqQixVQUFVLEVBQUUsa0NBQWtDO0tBQy9DO0lBRUQsbUJBQW1CO0lBQ25CLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLEVBQUU7UUFDN0IsSUFBSSxFQUFFLFNBQVMsQ0FBQyxpQkFBaUI7UUFDakMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRO1FBQ2hDLE9BQU8sRUFBRSxtQ0FBbUM7UUFDNUMsV0FBVyxFQUFFLEtBQUs7UUFDbEIsVUFBVSxFQUFFLHlCQUF5QjtLQUN0QztJQUNELENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFO1FBQ3hCLElBQUksRUFBRSxTQUFTLENBQUMsWUFBWTtRQUM1QixRQUFRLEVBQUUsYUFBYSxDQUFDLElBQUk7UUFDNUIsT0FBTyxFQUFFLHFCQUFxQjtRQUM5QixXQUFXLEVBQUUsSUFBSTtRQUNqQixVQUFVLEVBQUUsdUJBQXVCO0tBQ3BDO0lBQ0QsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUU7UUFDckIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxTQUFTO1FBQ3pCLFFBQVEsRUFBRSxhQUFhLENBQUMsSUFBSTtRQUM1QixPQUFPLEVBQUUsa0JBQWtCO1FBQzNCLFdBQVcsRUFBRSxLQUFLO1FBQ2xCLFVBQVUsRUFBRSwrQkFBK0I7S0FDNUM7SUFFRCxVQUFVO0lBQ1YsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtRQUM1QixJQUFJLEVBQUUsU0FBUyxDQUFDLGdCQUFnQjtRQUNoQyxRQUFRLEVBQUUsYUFBYSxDQUFDLE1BQU07UUFDOUIsT0FBTyxFQUFFLGtCQUFrQjtRQUMzQixXQUFXLEVBQUUsSUFBSTtRQUNqQixVQUFVLEVBQUUsa0NBQWtDO0tBQy9DO0lBQ0QsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsRUFBRTtRQUM5QixJQUFJLEVBQUUsU0FBUyxDQUFDLGtCQUFrQjtRQUNsQyxRQUFRLEVBQUUsYUFBYSxDQUFDLElBQUk7UUFDNUIsT0FBTyxFQUFFLHVCQUF1QjtRQUNoQyxXQUFXLEVBQUUsSUFBSTtRQUNqQixVQUFVLEVBQUUsNEJBQTRCO0tBQ3pDO0lBQ0QsQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsRUFBRTtRQUNuQyxJQUFJLEVBQUUsU0FBUyxDQUFDLHVCQUF1QjtRQUN2QyxRQUFRLEVBQUUsYUFBYSxDQUFDLE1BQU07UUFDOUIsT0FBTyxFQUFFLHlCQUF5QjtRQUNsQyxXQUFXLEVBQUUsSUFBSTtRQUNqQixVQUFVLEVBQUUsNkJBQTZCO0tBQzFDO0lBQ0QsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUU7UUFDMUIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxjQUFjO1FBQzlCLFFBQVEsRUFBRSxhQUFhLENBQUMsSUFBSTtRQUM1QixPQUFPLEVBQUUsMEJBQTBCO1FBQ25DLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFVBQVUsRUFBRSw2Q0FBNkM7S0FDMUQ7Q0FDRixDQUFDO0FBRUY7O0dBRUc7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxJQUFlLEVBQUUsT0FBYSxFQUFFLFNBQWtCO0lBQ2pGLE1BQU0sSUFBSSxHQUFHLHNCQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsT0FBTztRQUNMLEdBQUcsSUFBSTtRQUNQLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtRQUNuQyxTQUFTO1FBQ1QsT0FBTztLQUNSLENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixhQUFhLENBQUMsSUFBZTtJQUMzQyxPQUFPLHNCQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDO0FBQzFDLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLElBQWU7SUFDaEQsT0FBTyxzQkFBYyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQztBQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFcnJvciBDb2RlcyBmb3IgbGxtdmVyaWZ5XG4gKiBcbiAqIFN0YW5kYXJkaXplZCBlcnJvciBjb2RlcyBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICogXG4gKiBAbW9kdWxlIGVycm9ycy9jb2Rlc1xuICovXG5cbi8qKlxuICogRXJyb3IgY29kZSBlbnVtXG4gKi9cbmV4cG9ydCBlbnVtIEVycm9yQ29kZSB7XG4gIC8vIElucHV0IHZhbGlkYXRpb24gZXJyb3JzICgxeHh4KVxuICBJTlZBTElEX0lOUFVUID0gJ0xMTVZFUklGWV8xMDAxJyxcbiAgRU1QVFlfSU5QVVQgPSAnTExNVkVSSUZZXzEwMDInLFxuICBDT05URU5UX1RPT19MQVJHRSA9ICdMTE1WRVJJRllfMTAwMycsXG4gIElOVkFMSURfRk9STUFUID0gJ0xMTVZFUklGWV8xMDA0JyxcbiAgSU5WQUxJRF9FTkNPRElORyA9ICdMTE1WRVJJRllfMTAwNScsXG4gIFxuICAvLyBDb25maWd1cmF0aW9uIGVycm9ycyAoMnh4eClcbiAgTUFMRk9STUVEX0NPTkZJRyA9ICdMTE1WRVJJRllfMjAwMScsXG4gIElOVkFMSURfQ09ORklHID0gJ0xMTVZFUklGWV8yMDAyJyxcbiAgQ09ORklHX05PVF9GT1VORCA9ICdMTE1WRVJJRllfMjAwMycsXG4gIElOVkFMSURfVElFUiA9ICdMTE1WRVJJRllfMjAwNCcsXG4gIFxuICAvLyBSdW50aW1lIGVycm9ycyAoM3h4eClcbiAgVElNRU9VVCA9ICdMTE1WRVJJRllfMzAwMScsXG4gIEVOR0lORV9GQUlMVVJFID0gJ0xMTVZFUklGWV8zMDAyJyxcbiAgUkVTT1VSQ0VfRVhIQVVTVEVEID0gJ0xMTVZFUklGWV8zMDAzJyxcbiAgSU5URVJOQUxfRVJST1IgPSAnTExNVkVSSUZZXzMwMDQnLFxuICBcbiAgLy8gU2VydmVyIGVycm9ycyAoNHh4eClcbiAgUE9SVF9JTl9VU0UgPSAnTExNVkVSSUZZXzQwMDEnLFxuICBTRVJWRVJfU1RBUlRfRkFJTEVEID0gJ0xMTVZFUklGWV80MDAyJyxcbiAgSU5WQUxJRF9SRVFVRVNUID0gJ0xMTVZFUklGWV80MDAzJyxcbiAgUkFURV9MSU1JVF9FWENFRURFRCA9ICdMTE1WRVJJRllfNDAwNCcsXG4gIFxuICAvLyBQcml2YWN5L1NlY3VyaXR5IGVycm9ycyAoNXh4eClcbiAgUFJJVkFDWV9WSU9MQVRJT04gPSAnTExNVkVSSUZZXzUwMDEnLFxuICBVTkFVVEhPUklaRUQgPSAnTExNVkVSSUZZXzUwMDInLFxuICBGT1JCSURERU4gPSAnTExNVkVSSUZZXzUwMDMnLFxuICBcbiAgLy8gUGx1Z2luIGVycm9ycyAoNnh4eClcbiAgUExVR0lOX05PVF9GT1VORCA9ICdMTE1WRVJJRllfNjAwMScsXG4gIFBMVUdJTl9MT0FEX0ZBSUxFRCA9ICdMTE1WRVJJRllfNjAwMicsXG4gIFBMVUdJTl9FWEVDVVRJT05fRkFJTEVEID0gJ0xMTVZFUklGWV82MDAzJyxcbiAgSU5WQUxJRF9QTFVHSU4gPSAnTExNVkVSSUZZXzYwMDQnXG59XG5cbi8qKlxuICogRXJyb3Igc2V2ZXJpdHkgbGV2ZWxzXG4gKi9cbmV4cG9ydCBlbnVtIEVycm9yU2V2ZXJpdHkge1xuICBMT1cgPSAnbG93JyxcbiAgTUVESVVNID0gJ21lZGl1bScsXG4gIEhJR0ggPSAnaGlnaCcsXG4gIENSSVRJQ0FMID0gJ2NyaXRpY2FsJ1xufVxuXG4vKipcbiAqIEVycm9yIG1ldGFkYXRhIGludGVyZmFjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yTWV0YWRhdGEge1xuICBjb2RlOiBFcnJvckNvZGU7XG4gIHNldmVyaXR5OiBFcnJvclNldmVyaXR5O1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRldGFpbHM/OiBhbnk7XG4gIHRpbWVzdGFtcDogc3RyaW5nO1xuICByZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gIHJlY292ZXJhYmxlOiBib29sZWFuO1xuICBzdWdnZXN0aW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVycm9yIGNvZGUgbWV0YWRhdGEgbWFwcGluZ1xuICovXG5leHBvcnQgY29uc3QgRVJST1JfTUVUQURBVEE6IFJlY29yZDxFcnJvckNvZGUsIE9taXQ8RXJyb3JNZXRhZGF0YSwgJ3RpbWVzdGFtcCcgfCAncmVxdWVzdElkJyB8ICdkZXRhaWxzJz4+ID0ge1xuICAvLyBJbnB1dCB2YWxpZGF0aW9uXG4gIFtFcnJvckNvZGUuSU5WQUxJRF9JTlBVVF06IHtcbiAgICBjb2RlOiBFcnJvckNvZGUuSU5WQUxJRF9JTlBVVCxcbiAgICBzZXZlcml0eTogRXJyb3JTZXZlcml0eS5NRURJVU0sXG4gICAgbWVzc2FnZTogJ0ludmFsaWQgaW5wdXQgcHJvdmlkZWQnLFxuICAgIHJlY292ZXJhYmxlOiB0cnVlLFxuICAgIHN1Z2dlc3Rpb246ICdDaGVjayBpbnB1dCBmb3JtYXQgYW5kIHRyeSBhZ2FpbidcbiAgfSxcbiAgW0Vycm9yQ29kZS5FTVBUWV9JTlBVVF06IHtcbiAgICBjb2RlOiBFcnJvckNvZGUuRU1QVFlfSU5QVVQsXG4gICAgc2V2ZXJpdHk6IEVycm9yU2V2ZXJpdHkuTUVESVVNLFxuICAgIG1lc3NhZ2U6ICdJbnB1dCBjb250ZW50IGlzIGVtcHR5JyxcbiAgICByZWNvdmVyYWJsZTogdHJ1ZSxcbiAgICBzdWdnZXN0aW9uOiAnUHJvdmlkZSBub24tZW1wdHkgY29udGVudCB0byB2ZXJpZnknXG4gIH0sXG4gIFtFcnJvckNvZGUuQ09OVEVOVF9UT09fTEFSR0VdOiB7XG4gICAgY29kZTogRXJyb3JDb2RlLkNPTlRFTlRfVE9PX0xBUkdFLFxuICAgIHNldmVyaXR5OiBFcnJvclNldmVyaXR5Lk1FRElVTSxcbiAgICBtZXNzYWdlOiAnQ29udGVudCBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBzaXplJyxcbiAgICByZWNvdmVyYWJsZTogdHJ1ZSxcbiAgICBzdWdnZXN0aW9uOiAnUmVkdWNlIGNvbnRlbnQgc2l6ZSBvciBzcGxpdCBpbnRvIHNtYWxsZXIgY2h1bmtzJ1xuICB9LFxuICBbRXJyb3JDb2RlLklOVkFMSURfRk9STUFUXToge1xuICAgIGNvZGU6IEVycm9yQ29kZS5JTlZBTElEX0ZPUk1BVCxcbiAgICBzZXZlcml0eTogRXJyb3JTZXZlcml0eS5NRURJVU0sXG4gICAgbWVzc2FnZTogJ0ludmFsaWQgY29udGVudCBmb3JtYXQnLFxuICAgIHJlY292ZXJhYmxlOiB0cnVlLFxuICAgIHN1Z2dlc3Rpb246ICdFbnN1cmUgY29udGVudCBpcyBpbiB0aGUgZXhwZWN0ZWQgZm9ybWF0J1xuICB9LFxuICBbRXJyb3JDb2RlLklOVkFMSURfRU5DT0RJTkddOiB7XG4gICAgY29kZTogRXJyb3JDb2RlLklOVkFMSURfRU5DT0RJTkcsXG4gICAgc2V2ZXJpdHk6IEVycm9yU2V2ZXJpdHkuTUVESVVNLFxuICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGNoYXJhY3RlciBlbmNvZGluZycsXG4gICAgcmVjb3ZlcmFibGU6IHRydWUsXG4gICAgc3VnZ2VzdGlvbjogJ1VzZSBVVEYtOCBlbmNvZGluZydcbiAgfSxcbiAgXG4gIC8vIENvbmZpZ3VyYXRpb25cbiAgW0Vycm9yQ29kZS5NQUxGT1JNRURfQ09ORklHXToge1xuICAgIGNvZGU6IEVycm9yQ29kZS5NQUxGT1JNRURfQ09ORklHLFxuICAgIHNldmVyaXR5OiBFcnJvclNldmVyaXR5LkhJR0gsXG4gICAgbWVzc2FnZTogJ0NvbmZpZ3VyYXRpb24gZmlsZSBpcyBtYWxmb3JtZWQnLFxuICAgIHJlY292ZXJhYmxlOiB0cnVlLFxuICAgIHN1Z2dlc3Rpb246ICdDaGVjayBKU09OIHN5bnRheCBpbiBjb25maWcgZmlsZSdcbiAgfSxcbiAgW0Vycm9yQ29kZS5JTlZBTElEX0NPTkZJR106IHtcbiAgICBjb2RlOiBFcnJvckNvZGUuSU5WQUxJRF9DT05GSUcsXG4gICAgc2V2ZXJpdHk6IEVycm9yU2V2ZXJpdHkuSElHSCxcbiAgICBtZXNzYWdlOiAnSW52YWxpZCBjb25maWd1cmF0aW9uIHZhbHVlcycsXG4gICAgcmVjb3ZlcmFibGU6IHRydWUsXG4gICAgc3VnZ2VzdGlvbjogJ1JldmlldyBjb25maWd1cmF0aW9uIGRvY3VtZW50YXRpb24nXG4gIH0sXG4gIFtFcnJvckNvZGUuQ09ORklHX05PVF9GT1VORF06IHtcbiAgICBjb2RlOiBFcnJvckNvZGUuQ09ORklHX05PVF9GT1VORCxcbiAgICBzZXZlcml0eTogRXJyb3JTZXZlcml0eS5MT1csXG4gICAgbWVzc2FnZTogJ0NvbmZpZ3VyYXRpb24gZmlsZSBub3QgZm91bmQnLFxuICAgIHJlY292ZXJhYmxlOiB0cnVlLFxuICAgIHN1Z2dlc3Rpb246ICdSdW4gXCJucHggbGxtdmVyaWZ5IGluaXRcIiB0byBjcmVhdGUgZGVmYXVsdCBjb25maWcnXG4gIH0sXG4gIFtFcnJvckNvZGUuSU5WQUxJRF9USUVSXToge1xuICAgIGNvZGU6IEVycm9yQ29kZS5JTlZBTElEX1RJRVIsXG4gICAgc2V2ZXJpdHk6IEVycm9yU2V2ZXJpdHkuTUVESVVNLFxuICAgIG1lc3NhZ2U6ICdJbnZhbGlkIHRpZXIgc3BlY2lmaWVkJyxcbiAgICByZWNvdmVyYWJsZTogdHJ1ZSxcbiAgICBzdWdnZXN0aW9uOiAnVXNlOiBmcmVlLCB0ZWFtLCBwcm9mZXNzaW9uYWwsIG9yIGVudGVycHJpc2UnXG4gIH0sXG4gIFxuICAvLyBSdW50aW1lXG4gIFtFcnJvckNvZGUuVElNRU9VVF06IHtcbiAgICBjb2RlOiBFcnJvckNvZGUuVElNRU9VVCxcbiAgICBzZXZlcml0eTogRXJyb3JTZXZlcml0eS5ISUdILFxuICAgIG1lc3NhZ2U6ICdPcGVyYXRpb24gdGltZWQgb3V0JyxcbiAgICByZWNvdmVyYWJsZTogdHJ1ZSxcbiAgICBzdWdnZXN0aW9uOiAnSW5jcmVhc2UgdGltZW91dCBvciByZWR1Y2UgY29udGVudCBzaXplJ1xuICB9LFxuICBbRXJyb3JDb2RlLkVOR0lORV9GQUlMVVJFXToge1xuICAgIGNvZGU6IEVycm9yQ29kZS5FTkdJTkVfRkFJTFVSRSxcbiAgICBzZXZlcml0eTogRXJyb3JTZXZlcml0eS5ISUdILFxuICAgIG1lc3NhZ2U6ICdWZXJpZmljYXRpb24gZW5naW5lIGZhaWxlZCcsXG4gICAgcmVjb3ZlcmFibGU6IHRydWUsXG4gICAgc3VnZ2VzdGlvbjogJ1RyeSBhZ2FpbiBvciBkaXNhYmxlIHRoZSBmYWlsaW5nIGVuZ2luZSdcbiAgfSxcbiAgW0Vycm9yQ29kZS5SRVNPVVJDRV9FWEhBVVNURURdOiB7XG4gICAgY29kZTogRXJyb3JDb2RlLlJFU09VUkNFX0VYSEFVU1RFRCxcbiAgICBzZXZlcml0eTogRXJyb3JTZXZlcml0eS5DUklUSUNBTCxcbiAgICBtZXNzYWdlOiAnU3lzdGVtIHJlc291cmNlcyBleGhhdXN0ZWQnLFxuICAgIHJlY292ZXJhYmxlOiBmYWxzZSxcbiAgICBzdWdnZXN0aW9uOiAnUmVkdWNlIGxvYWQgb3IgaW5jcmVhc2Ugc3lzdGVtIHJlc291cmNlcydcbiAgfSxcbiAgW0Vycm9yQ29kZS5JTlRFUk5BTF9FUlJPUl06IHtcbiAgICBjb2RlOiBFcnJvckNvZGUuSU5URVJOQUxfRVJST1IsXG4gICAgc2V2ZXJpdHk6IEVycm9yU2V2ZXJpdHkuQ1JJVElDQUwsXG4gICAgbWVzc2FnZTogJ0ludGVybmFsIGVycm9yIG9jY3VycmVkJyxcbiAgICByZWNvdmVyYWJsZTogZmFsc2UsXG4gICAgc3VnZ2VzdGlvbjogJ1JlcG9ydCB0aGlzIGlzc3VlIHdpdGggZXJyb3IgZGV0YWlscydcbiAgfSxcbiAgXG4gIC8vIFNlcnZlclxuICBbRXJyb3JDb2RlLlBPUlRfSU5fVVNFXToge1xuICAgIGNvZGU6IEVycm9yQ29kZS5QT1JUX0lOX1VTRSxcbiAgICBzZXZlcml0eTogRXJyb3JTZXZlcml0eS5ISUdILFxuICAgIG1lc3NhZ2U6ICdQb3J0IGlzIGFscmVhZHkgaW4gdXNlJyxcbiAgICByZWNvdmVyYWJsZTogdHJ1ZSxcbiAgICBzdWdnZXN0aW9uOiAnVXNlIGEgZGlmZmVyZW50IHBvcnQgd2l0aCAtLXBvcnQgZmxhZydcbiAgfSxcbiAgW0Vycm9yQ29kZS5TRVJWRVJfU1RBUlRfRkFJTEVEXToge1xuICAgIGNvZGU6IEVycm9yQ29kZS5TRVJWRVJfU1RBUlRfRkFJTEVELFxuICAgIHNldmVyaXR5OiBFcnJvclNldmVyaXR5LkNSSVRJQ0FMLFxuICAgIG1lc3NhZ2U6ICdGYWlsZWQgdG8gc3RhcnQgc2VydmVyJyxcbiAgICByZWNvdmVyYWJsZTogZmFsc2UsXG4gICAgc3VnZ2VzdGlvbjogJ0NoZWNrIGxvZ3MgZm9yIGRldGFpbHMnXG4gIH0sXG4gIFtFcnJvckNvZGUuSU5WQUxJRF9SRVFVRVNUXToge1xuICAgIGNvZGU6IEVycm9yQ29kZS5JTlZBTElEX1JFUVVFU1QsXG4gICAgc2V2ZXJpdHk6IEVycm9yU2V2ZXJpdHkuTUVESVVNLFxuICAgIG1lc3NhZ2U6ICdJbnZhbGlkIHJlcXVlc3QgZm9ybWF0JyxcbiAgICByZWNvdmVyYWJsZTogdHJ1ZSxcbiAgICBzdWdnZXN0aW9uOiAnQ2hlY2sgQVBJIGRvY3VtZW50YXRpb24nXG4gIH0sXG4gIFtFcnJvckNvZGUuUkFURV9MSU1JVF9FWENFRURFRF06IHtcbiAgICBjb2RlOiBFcnJvckNvZGUuUkFURV9MSU1JVF9FWENFRURFRCxcbiAgICBzZXZlcml0eTogRXJyb3JTZXZlcml0eS5NRURJVU0sXG4gICAgbWVzc2FnZTogJ1JhdGUgbGltaXQgZXhjZWVkZWQnLFxuICAgIHJlY292ZXJhYmxlOiB0cnVlLFxuICAgIHN1Z2dlc3Rpb246ICdXYWl0IGJlZm9yZSBtYWtpbmcgbW9yZSByZXF1ZXN0cydcbiAgfSxcbiAgXG4gIC8vIFByaXZhY3kvU2VjdXJpdHlcbiAgW0Vycm9yQ29kZS5QUklWQUNZX1ZJT0xBVElPTl06IHtcbiAgICBjb2RlOiBFcnJvckNvZGUuUFJJVkFDWV9WSU9MQVRJT04sXG4gICAgc2V2ZXJpdHk6IEVycm9yU2V2ZXJpdHkuQ1JJVElDQUwsXG4gICAgbWVzc2FnZTogJ1ByaXZhY3kgcG9saWN5IHZpb2xhdGlvbiBkZXRlY3RlZCcsXG4gICAgcmVjb3ZlcmFibGU6IGZhbHNlLFxuICAgIHN1Z2dlc3Rpb246ICdSZXZpZXcgcHJpdmFjeSBzZXR0aW5ncydcbiAgfSxcbiAgW0Vycm9yQ29kZS5VTkFVVEhPUklaRURdOiB7XG4gICAgY29kZTogRXJyb3JDb2RlLlVOQVVUSE9SSVpFRCxcbiAgICBzZXZlcml0eTogRXJyb3JTZXZlcml0eS5ISUdILFxuICAgIG1lc3NhZ2U6ICdVbmF1dGhvcml6ZWQgYWNjZXNzJyxcbiAgICByZWNvdmVyYWJsZTogdHJ1ZSxcbiAgICBzdWdnZXN0aW9uOiAnUHJvdmlkZSB2YWxpZCBBUEkga2V5J1xuICB9LFxuICBbRXJyb3JDb2RlLkZPUkJJRERFTl06IHtcbiAgICBjb2RlOiBFcnJvckNvZGUuRk9SQklEREVOLFxuICAgIHNldmVyaXR5OiBFcnJvclNldmVyaXR5LkhJR0gsXG4gICAgbWVzc2FnZTogJ0FjY2VzcyBmb3JiaWRkZW4nLFxuICAgIHJlY292ZXJhYmxlOiBmYWxzZSxcbiAgICBzdWdnZXN0aW9uOiAnVXBncmFkZSB0aWVyIGZvciB0aGlzIGZlYXR1cmUnXG4gIH0sXG4gIFxuICAvLyBQbHVnaW5zXG4gIFtFcnJvckNvZGUuUExVR0lOX05PVF9GT1VORF06IHtcbiAgICBjb2RlOiBFcnJvckNvZGUuUExVR0lOX05PVF9GT1VORCxcbiAgICBzZXZlcml0eTogRXJyb3JTZXZlcml0eS5NRURJVU0sXG4gICAgbWVzc2FnZTogJ1BsdWdpbiBub3QgZm91bmQnLFxuICAgIHJlY292ZXJhYmxlOiB0cnVlLFxuICAgIHN1Z2dlc3Rpb246ICdDaGVjayBwbHVnaW4gSUQgYW5kIHJlZ2lzdHJhdGlvbidcbiAgfSxcbiAgW0Vycm9yQ29kZS5QTFVHSU5fTE9BRF9GQUlMRURdOiB7XG4gICAgY29kZTogRXJyb3JDb2RlLlBMVUdJTl9MT0FEX0ZBSUxFRCxcbiAgICBzZXZlcml0eTogRXJyb3JTZXZlcml0eS5ISUdILFxuICAgIG1lc3NhZ2U6ICdGYWlsZWQgdG8gbG9hZCBwbHVnaW4nLFxuICAgIHJlY292ZXJhYmxlOiB0cnVlLFxuICAgIHN1Z2dlc3Rpb246ICdDaGVjayBwbHVnaW4gY29tcGF0aWJpbGl0eSdcbiAgfSxcbiAgW0Vycm9yQ29kZS5QTFVHSU5fRVhFQ1VUSU9OX0ZBSUxFRF06IHtcbiAgICBjb2RlOiBFcnJvckNvZGUuUExVR0lOX0VYRUNVVElPTl9GQUlMRUQsXG4gICAgc2V2ZXJpdHk6IEVycm9yU2V2ZXJpdHkuTUVESVVNLFxuICAgIG1lc3NhZ2U6ICdQbHVnaW4gZXhlY3V0aW9uIGZhaWxlZCcsXG4gICAgcmVjb3ZlcmFibGU6IHRydWUsXG4gICAgc3VnZ2VzdGlvbjogJ0NoZWNrIHBsdWdpbiBpbXBsZW1lbnRhdGlvbidcbiAgfSxcbiAgW0Vycm9yQ29kZS5JTlZBTElEX1BMVUdJTl06IHtcbiAgICBjb2RlOiBFcnJvckNvZGUuSU5WQUxJRF9QTFVHSU4sXG4gICAgc2V2ZXJpdHk6IEVycm9yU2V2ZXJpdHkuSElHSCxcbiAgICBtZXNzYWdlOiAnSW52YWxpZCBwbHVnaW4gc3RydWN0dXJlJyxcbiAgICByZWNvdmVyYWJsZTogdHJ1ZSxcbiAgICBzdWdnZXN0aW9uOiAnRW5zdXJlIHBsdWdpbiBpbXBsZW1lbnRzIHJlcXVpcmVkIGludGVyZmFjZSdcbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgZXJyb3IgbWV0YWRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVycm9yTWV0YWRhdGEoY29kZTogRXJyb3JDb2RlLCBkZXRhaWxzPzogYW55LCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBFcnJvck1ldGFkYXRhIHtcbiAgY29uc3QgYmFzZSA9IEVSUk9SX01FVEFEQVRBW2NvZGVdO1xuICByZXR1cm4ge1xuICAgIC4uLmJhc2UsXG4gICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgcmVxdWVzdElkLFxuICAgIGRldGFpbHNcbiAgfTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBlcnJvciBpcyByZWNvdmVyYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWNvdmVyYWJsZShjb2RlOiBFcnJvckNvZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIEVSUk9SX01FVEFEQVRBW2NvZGVdLnJlY292ZXJhYmxlO1xufVxuXG4vKipcbiAqIEdldCBlcnJvciBzdWdnZXN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFcnJvclN1Z2dlc3Rpb24oY29kZTogRXJyb3JDb2RlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIEVSUk9SX01FVEFEQVRBW2NvZGVdLnN1Z2dlc3Rpb247XG59XG4iXX0=