UNPKG

@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.

126 lines 16 kB
/** * Constants for Memory element implementation * Extracted for reusability and maintainability * * MEMORY ARCHITECTURE DESIGN: * - Memories are stored as small, sharded YAML files for fast loading * - Each memory file should be <256KB for optimal parse performance * - Larger content referenced via external documents (PDFs, images, etc) * - Index-of-indexes pattern for O(log n) search performance * * SECURITY NOTE: This file contains only constants and type definitions. * It does not process any user input. The security scanner may flag this * for missing Unicode normalization, but this is a false positive as no * input processing occurs here. * * @module MemoryConstants */ // security-audit-ignore: DMCP-SEC-004 // Reason: Constants file - no user input processing // Memory size limits export const MEMORY_CONSTANTS = { // Size limits MAX_MEMORY_SIZE: 1024 * 1024, // 1MB total memory size MAX_ENTRY_SIZE: 100 * 1024, // 100KB per entry MAX_ENTRIES_DEFAULT: 1000, // Maximum number of entries // Entry limits MAX_TAGS_PER_ENTRY: 20, // Maximum tags per memory entry MAX_TAG_LENGTH: 50, // Maximum length of each tag MAX_METADATA_KEYS: 20, // Maximum metadata keys per entry MAX_METADATA_KEY_LENGTH: 50, // Maximum metadata key length MAX_METADATA_VALUE_LENGTH: 200, // Maximum metadata value length // Retention defaults // Memories are PERMANENT by default. Use retentionDays only when you // explicitly need expiring data (temporary caches, session context, etc.) DEFAULT_RETENTION_DAYS: 999999, // Permanent by default (~2739 years) MIN_RETENTION_DAYS: 1, // Minimum retention period MAX_RETENTION_DAYS: 999999, // Allows permanent retention // Search limits DEFAULT_SEARCH_LIMIT: 100, // Default search result limit /** * YAML Size Limit Rationale: * 256KB is optimal for YAML parsing performance while preventing DoS attacks. * - YAML parsing is CPU-intensive; large files can block the event loop * - 256KB accommodates ~5000 lines of typical memory content * - Larger memories should be sharded across multiple files * - External references used for binary data (images, PDFs, etc) * * Performance benchmarks: * - <256KB: Parse time <10ms on average hardware * - 1MB: Parse time ~50-100ms (acceptable but not ideal) * - >5MB: Parse time >500ms (unacceptable, blocks UI) */ MAX_YAML_SIZE: 256 * 1024, // 256KB max YAML size for import /** * Privacy Level Hierarchy: * * 'public' - Lowest restriction level * - Available to all contexts and users * - Can be shared across sessions * - Suitable for general knowledge, documentation * - Example: Project conventions, public APIs * * 'private' - Default level, moderate restriction * - Restricted to current user/session * - Not shared with other users * - Suitable for personal preferences, user-specific data * - Example: User's coding style, personal notes * * 'sensitive' - Highest restriction level * - Requires explicit permission to access * - Extra logging and audit trail * - Automatic deletion after retention period * - Suitable for credentials, PII, confidential data * - Example: API keys (temporary), personal information * * Access rules cascade: sensitive ⊂ private ⊂ public */ PRIVACY_LEVELS: ['public', 'private', 'sensitive'], DEFAULT_PRIVACY_LEVEL: 'private', // Storage backends DEFAULT_STORAGE_BACKEND: 'memory', SUPPORTED_STORAGE_BACKENDS: ['memory', 'file', 'indexed'], }; /** * Trust Levels for Memory Security Architecture (Issue #1314, #1320, #1321) * * UNTRUSTED: Default - all content starts as untrusted until validated * VALIDATED: Content has passed security validation (no dangerous patterns) * TRUSTED: Manually marked as trusted by user (highest trust) * FLAGGED: Contains dangerous patterns, sanitized display required * QUARANTINED: Content failed validation, isolated from normal use */ export const TRUST_LEVELS = { UNTRUSTED: 'untrusted', VALIDATED: 'validated', TRUSTED: 'trusted', FLAGGED: 'flagged', QUARANTINED: 'quarantined' }; // Security event types for memory operations export const MEMORY_SECURITY_EVENTS = { MEMORY_CREATED: 'MEMORY_CREATED', MEMORY_ADDED: 'MEMORY_ADDED', MEMORY_SEARCHED: 'MEMORY_SEARCHED', SENSITIVE_MEMORY_DELETED: 'SENSITIVE_MEMORY_DELETED', RETENTION_POLICY_ENFORCED: 'RETENTION_POLICY_ENFORCED', MEMORY_CLEARED: 'MEMORY_CLEARED', MEMORY_LOADED: 'MEMORY_LOADED', MEMORY_SAVED: 'MEMORY_SAVED', MEMORY_DELETED: 'MEMORY_DELETED', MEMORY_LOAD_FAILED: 'MEMORY_LOAD_FAILED', MEMORY_SAVE_FAILED: 'MEMORY_SAVE_FAILED', MEMORY_DESERIALIZE_FAILED: 'MEMORY_DESERIALIZE_FAILED', MEMORY_LIST_ITEM_FAILED: 'MEMORY_LIST_ITEM_FAILED', MEMORY_IMPORT_FAILED: 'MEMORY_IMPORT_FAILED', MEMORY_INTEGRITY_VIOLATION: 'MEMORY_INTEGRITY_VIOLATION', MEMORY_UNICODE_VALIDATION_FAILED: 'MEMORY_UNICODE_VALIDATION_FAILED', MEMORY_DUPLICATE_DETECTED: 'MEMORY_DUPLICATE_DETECTED', // FIX #1269: Prompt injection protection events MEMORY_INJECTION_BLOCKED: 'MEMORY_INJECTION_BLOCKED', MEMORY_INJECTION_DETECTED_ON_READ: 'MEMORY_INJECTION_DETECTED_ON_READ', // FIX #1430: Seed memory installation events SEED_MEMORY_INSTALLED: 'SEED_MEMORY_INSTALLED', SEED_MEMORY_INSTALLATION_FAILED: 'SEED_MEMORY_INSTALLATION_FAILED', }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL21lbW9yaWVzL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVILHNDQUFzQztBQUN0QyxvREFBb0Q7QUFFcEQscUJBQXFCO0FBQ3JCLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzlCLGNBQWM7SUFDZCxlQUFlLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBUyx3QkFBd0I7SUFDN0QsY0FBYyxFQUFFLEdBQUcsR0FBRyxJQUFJLEVBQVcsa0JBQWtCO0lBQ3ZELG1CQUFtQixFQUFFLElBQUksRUFBWSw0QkFBNEI7SUFFakUsZUFBZTtJQUNmLGtCQUFrQixFQUFFLEVBQUUsRUFBZSxnQ0FBZ0M7SUFDckUsY0FBYyxFQUFFLEVBQUUsRUFBbUIsNkJBQTZCO0lBQ2xFLGlCQUFpQixFQUFFLEVBQUUsRUFBZ0Isa0NBQWtDO0lBQ3ZFLHVCQUF1QixFQUFFLEVBQUUsRUFBVSw4QkFBOEI7SUFDbkUseUJBQXlCLEVBQUUsR0FBRyxFQUFPLGdDQUFnQztJQUVyRSxxQkFBcUI7SUFDckIscUVBQXFFO0lBQ3JFLDBFQUEwRTtJQUMxRSxzQkFBc0IsRUFBRSxNQUFNLEVBQU8scUNBQXFDO0lBQzFFLGtCQUFrQixFQUFFLENBQUMsRUFBZ0IsMkJBQTJCO0lBQ2hFLGtCQUFrQixFQUFFLE1BQU0sRUFBVyw2QkFBNkI7SUFFbEUsZ0JBQWdCO0lBQ2hCLG9CQUFvQixFQUFFLEdBQUcsRUFBWSw4QkFBOEI7SUFFbkU7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsYUFBYSxFQUFFLEdBQUcsR0FBRyxJQUFJLEVBQVksaUNBQWlDO0lBRXRFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXVCRztJQUNILGNBQWMsRUFBRSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFVO0lBQzNELHFCQUFxQixFQUFFLFNBQWtCO0lBRXpDLG1CQUFtQjtJQUNuQix1QkFBdUIsRUFBRSxRQUFpQjtJQUMxQywwQkFBMEIsRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFVO0NBQzFELENBQUM7QUFNWDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRztJQUMxQixTQUFTLEVBQUUsV0FBVztJQUN0QixTQUFTLEVBQUUsV0FBVztJQUN0QixPQUFPLEVBQUUsU0FBUztJQUNsQixPQUFPLEVBQUUsU0FBUztJQUNsQixXQUFXLEVBQUUsYUFBYTtDQUNsQixDQUFDO0FBSVgsNkNBQTZDO0FBQzdDLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHO0lBQ3BDLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsWUFBWSxFQUFFLGNBQWM7SUFDNUIsZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyx3QkFBd0IsRUFBRSwwQkFBMEI7SUFDcEQseUJBQXlCLEVBQUUsMkJBQTJCO0lBQ3RELGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsYUFBYSxFQUFFLGVBQWU7SUFDOUIsWUFBWSxFQUFFLGNBQWM7SUFDNUIsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxrQkFBa0IsRUFBRSxvQkFBb0I7SUFDeEMsa0JBQWtCLEVBQUUsb0JBQW9CO0lBQ3hDLHlCQUF5QixFQUFFLDJCQUEyQjtJQUN0RCx1QkFBdUIsRUFBRSx5QkFBeUI7SUFDbEQsb0JBQW9CLEVBQUUsc0JBQXNCO0lBQzVDLDBCQUEwQixFQUFFLDRCQUE0QjtJQUN4RCxnQ0FBZ0MsRUFBRSxrQ0FBa0M7SUFDcEUseUJBQXlCLEVBQUUsMkJBQTJCO0lBQ3RELGdEQUFnRDtJQUNoRCx3QkFBd0IsRUFBRSwwQkFBMEI7SUFDcEQsaUNBQWlDLEVBQUUsbUNBQW1DO0lBQ3RFLDZDQUE2QztJQUM3QyxxQkFBcUIsRUFBRSx1QkFBdUI7SUFDOUMsK0JBQStCLEVBQUUsaUNBQWlDO0NBQzFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnN0YW50cyBmb3IgTWVtb3J5IGVsZW1lbnQgaW1wbGVtZW50YXRpb25cbiAqIEV4dHJhY3RlZCBmb3IgcmV1c2FiaWxpdHkgYW5kIG1haW50YWluYWJpbGl0eVxuICpcbiAqIE1FTU9SWSBBUkNISVRFQ1RVUkUgREVTSUdOOlxuICogLSBNZW1vcmllcyBhcmUgc3RvcmVkIGFzIHNtYWxsLCBzaGFyZGVkIFlBTUwgZmlsZXMgZm9yIGZhc3QgbG9hZGluZ1xuICogLSBFYWNoIG1lbW9yeSBmaWxlIHNob3VsZCBiZSA8MjU2S0IgZm9yIG9wdGltYWwgcGFyc2UgcGVyZm9ybWFuY2VcbiAqIC0gTGFyZ2VyIGNvbnRlbnQgcmVmZXJlbmNlZCB2aWEgZXh0ZXJuYWwgZG9jdW1lbnRzIChQREZzLCBpbWFnZXMsIGV0YylcbiAqIC0gSW5kZXgtb2YtaW5kZXhlcyBwYXR0ZXJuIGZvciBPKGxvZyBuKSBzZWFyY2ggcGVyZm9ybWFuY2VcbiAqXG4gKiBTRUNVUklUWSBOT1RFOiBUaGlzIGZpbGUgY29udGFpbnMgb25seSBjb25zdGFudHMgYW5kIHR5cGUgZGVmaW5pdGlvbnMuXG4gKiBJdCBkb2VzIG5vdCBwcm9jZXNzIGFueSB1c2VyIGlucHV0LiBUaGUgc2VjdXJpdHkgc2Nhbm5lciBtYXkgZmxhZyB0aGlzXG4gKiBmb3IgbWlzc2luZyBVbmljb2RlIG5vcm1hbGl6YXRpb24sIGJ1dCB0aGlzIGlzIGEgZmFsc2UgcG9zaXRpdmUgYXMgbm9cbiAqIGlucHV0IHByb2Nlc3Npbmcgb2NjdXJzIGhlcmUuXG4gKlxuICogQG1vZHVsZSBNZW1vcnlDb25zdGFudHNcbiAqL1xuXG4vLyBzZWN1cml0eS1hdWRpdC1pZ25vcmU6IERNQ1AtU0VDLTAwNFxuLy8gUmVhc29uOiBDb25zdGFudHMgZmlsZSAtIG5vIHVzZXIgaW5wdXQgcHJvY2Vzc2luZ1xuXG4vLyBNZW1vcnkgc2l6ZSBsaW1pdHNcbmV4cG9ydCBjb25zdCBNRU1PUllfQ09OU1RBTlRTID0ge1xuICAvLyBTaXplIGxpbWl0c1xuICBNQVhfTUVNT1JZX1NJWkU6IDEwMjQgKiAxMDI0LCAgICAgICAgLy8gMU1CIHRvdGFsIG1lbW9yeSBzaXplXG4gIE1BWF9FTlRSWV9TSVpFOiAxMDAgKiAxMDI0LCAgICAgICAgICAvLyAxMDBLQiBwZXIgZW50cnlcbiAgTUFYX0VOVFJJRVNfREVGQVVMVDogMTAwMCwgICAgICAgICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGVudHJpZXNcblxuICAvLyBFbnRyeSBsaW1pdHNcbiAgTUFYX1RBR1NfUEVSX0VOVFJZOiAyMCwgICAgICAgICAgICAgIC8vIE1heGltdW0gdGFncyBwZXIgbWVtb3J5IGVudHJ5XG4gIE1BWF9UQUdfTEVOR1RIOiA1MCwgICAgICAgICAgICAgICAgICAvLyBNYXhpbXVtIGxlbmd0aCBvZiBlYWNoIHRhZ1xuICBNQVhfTUVUQURBVEFfS0VZUzogMjAsICAgICAgICAgICAgICAgLy8gTWF4aW11bSBtZXRhZGF0YSBrZXlzIHBlciBlbnRyeVxuICBNQVhfTUVUQURBVEFfS0VZX0xFTkdUSDogNTAsICAgICAgICAgLy8gTWF4aW11bSBtZXRhZGF0YSBrZXkgbGVuZ3RoXG4gIE1BWF9NRVRBREFUQV9WQUxVRV9MRU5HVEg6IDIwMCwgICAgICAvLyBNYXhpbXVtIG1ldGFkYXRhIHZhbHVlIGxlbmd0aFxuXG4gIC8vIFJldGVudGlvbiBkZWZhdWx0c1xuICAvLyBNZW1vcmllcyBhcmUgUEVSTUFORU5UIGJ5IGRlZmF1bHQuIFVzZSByZXRlbnRpb25EYXlzIG9ubHkgd2hlbiB5b3VcbiAgLy8gZXhwbGljaXRseSBuZWVkIGV4cGlyaW5nIGRhdGEgKHRlbXBvcmFyeSBjYWNoZXMsIHNlc3Npb24gY29udGV4dCwgZXRjLilcbiAgREVGQVVMVF9SRVRFTlRJT05fREFZUzogOTk5OTk5LCAgICAgIC8vIFBlcm1hbmVudCBieSBkZWZhdWx0ICh+MjczOSB5ZWFycylcbiAgTUlOX1JFVEVOVElPTl9EQVlTOiAxLCAgICAgICAgICAgICAgIC8vIE1pbmltdW0gcmV0ZW50aW9uIHBlcmlvZFxuICBNQVhfUkVURU5USU9OX0RBWVM6IDk5OTk5OSwgICAgICAgICAgLy8gQWxsb3dzIHBlcm1hbmVudCByZXRlbnRpb25cblxuICAvLyBTZWFyY2ggbGltaXRzXG4gIERFRkFVTFRfU0VBUkNIX0xJTUlUOiAxMDAsICAgICAgICAgICAvLyBEZWZhdWx0IHNlYXJjaCByZXN1bHQgbGltaXRcblxuICAvKipcbiAgICogWUFNTCBTaXplIExpbWl0IFJhdGlvbmFsZTpcbiAgICogMjU2S0IgaXMgb3B0aW1hbCBmb3IgWUFNTCBwYXJzaW5nIHBlcmZvcm1hbmNlIHdoaWxlIHByZXZlbnRpbmcgRG9TIGF0dGFja3MuXG4gICAqIC0gWUFNTCBwYXJzaW5nIGlzIENQVS1pbnRlbnNpdmU7IGxhcmdlIGZpbGVzIGNhbiBibG9jayB0aGUgZXZlbnQgbG9vcFxuICAgKiAtIDI1NktCIGFjY29tbW9kYXRlcyB+NTAwMCBsaW5lcyBvZiB0eXBpY2FsIG1lbW9yeSBjb250ZW50XG4gICAqIC0gTGFyZ2VyIG1lbW9yaWVzIHNob3VsZCBiZSBzaGFyZGVkIGFjcm9zcyBtdWx0aXBsZSBmaWxlc1xuICAgKiAtIEV4dGVybmFsIHJlZmVyZW5jZXMgdXNlZCBmb3IgYmluYXJ5IGRhdGEgKGltYWdlcywgUERGcywgZXRjKVxuICAgKlxuICAgKiBQZXJmb3JtYW5jZSBiZW5jaG1hcmtzOlxuICAgKiAtIDwyNTZLQjogUGFyc2UgdGltZSA8MTBtcyBvbiBhdmVyYWdlIGhhcmR3YXJlXG4gICAqIC0gMU1COiBQYXJzZSB0aW1lIH41MC0xMDBtcyAoYWNjZXB0YWJsZSBidXQgbm90IGlkZWFsKVxuICAgKiAtID41TUI6IFBhcnNlIHRpbWUgPjUwMG1zICh1bmFjY2VwdGFibGUsIGJsb2NrcyBVSSlcbiAgICovXG4gIE1BWF9ZQU1MX1NJWkU6IDI1NiAqIDEwMjQsICAgICAgICAgICAvLyAyNTZLQiBtYXggWUFNTCBzaXplIGZvciBpbXBvcnRcblxuICAvKipcbiAgICogUHJpdmFjeSBMZXZlbCBIaWVyYXJjaHk6XG4gICAqXG4gICAqICdwdWJsaWMnIC0gTG93ZXN0IHJlc3RyaWN0aW9uIGxldmVsXG4gICAqICAgLSBBdmFpbGFibGUgdG8gYWxsIGNvbnRleHRzIGFuZCB1c2Vyc1xuICAgKiAgIC0gQ2FuIGJlIHNoYXJlZCBhY3Jvc3Mgc2Vzc2lvbnNcbiAgICogICAtIFN1aXRhYmxlIGZvciBnZW5lcmFsIGtub3dsZWRnZSwgZG9jdW1lbnRhdGlvblxuICAgKiAgIC0gRXhhbXBsZTogUHJvamVjdCBjb252ZW50aW9ucywgcHVibGljIEFQSXNcbiAgICpcbiAgICogJ3ByaXZhdGUnIC0gRGVmYXVsdCBsZXZlbCwgbW9kZXJhdGUgcmVzdHJpY3Rpb25cbiAgICogICAtIFJlc3RyaWN0ZWQgdG8gY3VycmVudCB1c2VyL3Nlc3Npb25cbiAgICogICAtIE5vdCBzaGFyZWQgd2l0aCBvdGhlciB1c2Vyc1xuICAgKiAgIC0gU3VpdGFibGUgZm9yIHBlcnNvbmFsIHByZWZlcmVuY2VzLCB1c2VyLXNwZWNpZmljIGRhdGFcbiAgICogICAtIEV4YW1wbGU6IFVzZXIncyBjb2Rpbmcgc3R5bGUsIHBlcnNvbmFsIG5vdGVzXG4gICAqXG4gICAqICdzZW5zaXRpdmUnIC0gSGlnaGVzdCByZXN0cmljdGlvbiBsZXZlbFxuICAgKiAgIC0gUmVxdWlyZXMgZXhwbGljaXQgcGVybWlzc2lvbiB0byBhY2Nlc3NcbiAgICogICAtIEV4dHJhIGxvZ2dpbmcgYW5kIGF1ZGl0IHRyYWlsXG4gICAqICAgLSBBdXRvbWF0aWMgZGVsZXRpb24gYWZ0ZXIgcmV0ZW50aW9uIHBlcmlvZFxuICAgKiAgIC0gU3VpdGFibGUgZm9yIGNyZWRlbnRpYWxzLCBQSUksIGNvbmZpZGVudGlhbCBkYXRhXG4gICAqICAgLSBFeGFtcGxlOiBBUEkga2V5cyAodGVtcG9yYXJ5KSwgcGVyc29uYWwgaW5mb3JtYXRpb25cbiAgICpcbiAgICogQWNjZXNzIHJ1bGVzIGNhc2NhZGU6IHNlbnNpdGl2ZSDiioIgcHJpdmF0ZSDiioIgcHVibGljXG4gICAqL1xuICBQUklWQUNZX0xFVkVMUzogWydwdWJsaWMnLCAncHJpdmF0ZScsICdzZW5zaXRpdmUnXSBhcyBjb25zdCxcbiAgREVGQVVMVF9QUklWQUNZX0xFVkVMOiAncHJpdmF0ZScgYXMgY29uc3QsXG4gIFxuICAvLyBTdG9yYWdlIGJhY2tlbmRzXG4gIERFRkFVTFRfU1RPUkFHRV9CQUNLRU5EOiAnbWVtb3J5JyBhcyBjb25zdCxcbiAgU1VQUE9SVEVEX1NUT1JBR0VfQkFDS0VORFM6IFsnbWVtb3J5JywgJ2ZpbGUnLCAnaW5kZXhlZCddIGFzIGNvbnN0LFxufSBhcyBjb25zdDtcblxuLy8gVHlwZSBleHBvcnRzIGZvciBwcml2YWN5IGxldmVscyBhbmQgc3RvcmFnZSBiYWNrZW5kc1xuZXhwb3J0IHR5cGUgUHJpdmFjeUxldmVsID0gdHlwZW9mIE1FTU9SWV9DT05TVEFOVFMuUFJJVkFDWV9MRVZFTFNbbnVtYmVyXTtcbmV4cG9ydCB0eXBlIFN0b3JhZ2VCYWNrZW5kID0gdHlwZW9mIE1FTU9SWV9DT05TVEFOVFMuU1VQUE9SVEVEX1NUT1JBR0VfQkFDS0VORFNbbnVtYmVyXTtcblxuLyoqXG4gKiBUcnVzdCBMZXZlbHMgZm9yIE1lbW9yeSBTZWN1cml0eSBBcmNoaXRlY3R1cmUgKElzc3VlICMxMzE0LCAjMTMyMCwgIzEzMjEpXG4gKlxuICogVU5UUlVTVEVEOiBEZWZhdWx0IC0gYWxsIGNvbnRlbnQgc3RhcnRzIGFzIHVudHJ1c3RlZCB1bnRpbCB2YWxpZGF0ZWRcbiAqIFZBTElEQVRFRDogQ29udGVudCBoYXMgcGFzc2VkIHNlY3VyaXR5IHZhbGlkYXRpb24gKG5vIGRhbmdlcm91cyBwYXR0ZXJucylcbiAqIFRSVVNURUQ6IE1hbnVhbGx5IG1hcmtlZCBhcyB0cnVzdGVkIGJ5IHVzZXIgKGhpZ2hlc3QgdHJ1c3QpXG4gKiBGTEFHR0VEOiBDb250YWlucyBkYW5nZXJvdXMgcGF0dGVybnMsIHNhbml0aXplZCBkaXNwbGF5IHJlcXVpcmVkXG4gKiBRVUFSQU5USU5FRDogQ29udGVudCBmYWlsZWQgdmFsaWRhdGlvbiwgaXNvbGF0ZWQgZnJvbSBub3JtYWwgdXNlXG4gKi9cbmV4cG9ydCBjb25zdCBUUlVTVF9MRVZFTFMgPSB7XG4gIFVOVFJVU1RFRDogJ3VudHJ1c3RlZCcsXG4gIFZBTElEQVRFRDogJ3ZhbGlkYXRlZCcsXG4gIFRSVVNURUQ6ICd0cnVzdGVkJyxcbiAgRkxBR0dFRDogJ2ZsYWdnZWQnLFxuICBRVUFSQU5USU5FRDogJ3F1YXJhbnRpbmVkJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVHJ1c3RMZXZlbCA9IHR5cGVvZiBUUlVTVF9MRVZFTFNba2V5b2YgdHlwZW9mIFRSVVNUX0xFVkVMU107XG5cbi8vIFNlY3VyaXR5IGV2ZW50IHR5cGVzIGZvciBtZW1vcnkgb3BlcmF0aW9uc1xuZXhwb3J0IGNvbnN0IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMgPSB7XG4gIE1FTU9SWV9DUkVBVEVEOiAnTUVNT1JZX0NSRUFURUQnLFxuICBNRU1PUllfQURERUQ6ICdNRU1PUllfQURERUQnLFxuICBNRU1PUllfU0VBUkNIRUQ6ICdNRU1PUllfU0VBUkNIRUQnLFxuICBTRU5TSVRJVkVfTUVNT1JZX0RFTEVURUQ6ICdTRU5TSVRJVkVfTUVNT1JZX0RFTEVURUQnLFxuICBSRVRFTlRJT05fUE9MSUNZX0VORk9SQ0VEOiAnUkVURU5USU9OX1BPTElDWV9FTkZPUkNFRCcsXG4gIE1FTU9SWV9DTEVBUkVEOiAnTUVNT1JZX0NMRUFSRUQnLFxuICBNRU1PUllfTE9BREVEOiAnTUVNT1JZX0xPQURFRCcsXG4gIE1FTU9SWV9TQVZFRDogJ01FTU9SWV9TQVZFRCcsXG4gIE1FTU9SWV9ERUxFVEVEOiAnTUVNT1JZX0RFTEVURUQnLFxuICBNRU1PUllfTE9BRF9GQUlMRUQ6ICdNRU1PUllfTE9BRF9GQUlMRUQnLFxuICBNRU1PUllfU0FWRV9GQUlMRUQ6ICdNRU1PUllfU0FWRV9GQUlMRUQnLFxuICBNRU1PUllfREVTRVJJQUxJWkVfRkFJTEVEOiAnTUVNT1JZX0RFU0VSSUFMSVpFX0ZBSUxFRCcsXG4gIE1FTU9SWV9MSVNUX0lURU1fRkFJTEVEOiAnTUVNT1JZX0xJU1RfSVRFTV9GQUlMRUQnLFxuICBNRU1PUllfSU1QT1JUX0ZBSUxFRDogJ01FTU9SWV9JTVBPUlRfRkFJTEVEJyxcbiAgTUVNT1JZX0lOVEVHUklUWV9WSU9MQVRJT046ICdNRU1PUllfSU5URUdSSVRZX1ZJT0xBVElPTicsXG4gIE1FTU9SWV9VTklDT0RFX1ZBTElEQVRJT05fRkFJTEVEOiAnTUVNT1JZX1VOSUNPREVfVkFMSURBVElPTl9GQUlMRUQnLFxuICBNRU1PUllfRFVQTElDQVRFX0RFVEVDVEVEOiAnTUVNT1JZX0RVUExJQ0FURV9ERVRFQ1RFRCcsXG4gIC8vIEZJWCAjMTI2OTogUHJvbXB0IGluamVjdGlvbiBwcm90ZWN0aW9uIGV2ZW50c1xuICBNRU1PUllfSU5KRUNUSU9OX0JMT0NLRUQ6ICdNRU1PUllfSU5KRUNUSU9OX0JMT0NLRUQnLFxuICBNRU1PUllfSU5KRUNUSU9OX0RFVEVDVEVEX09OX1JFQUQ6ICdNRU1PUllfSU5KRUNUSU9OX0RFVEVDVEVEX09OX1JFQUQnLFxuICAvLyBGSVggIzE0MzA6IFNlZWQgbWVtb3J5IGluc3RhbGxhdGlvbiBldmVudHNcbiAgU0VFRF9NRU1PUllfSU5TVEFMTEVEOiAnU0VFRF9NRU1PUllfSU5TVEFMTEVEJyxcbiAgU0VFRF9NRU1PUllfSU5TVEFMTEFUSU9OX0ZBSUxFRDogJ1NFRURfTUVNT1JZX0lOU1RBTExBVElPTl9GQUlMRUQnLFxufSBhcyBjb25zdDtcbiJdfQ==