@dollhousemcp/mcp-server 1.3.2 → 1.3.3

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.
Files changed (64) hide show
  1. package/README.md +87 -5
  2. package/dist/collection/ElementInstaller.d.ts.map +1 -1
  3. package/dist/collection/ElementInstaller.js +3 -7
  4. package/dist/elements/index.d.ts +0 -2
  5. package/dist/elements/index.d.ts.map +1 -1
  6. package/dist/elements/index.js +1 -3
  7. package/dist/elements/skills/Skill.d.ts.map +1 -1
  8. package/dist/elements/skills/Skill.js +3 -2
  9. package/dist/elements/skills/SkillManager.d.ts +83 -0
  10. package/dist/elements/skills/SkillManager.d.ts.map +1 -0
  11. package/dist/elements/skills/SkillManager.js +383 -0
  12. package/dist/elements/skills/index.d.ts +1 -0
  13. package/dist/elements/skills/index.d.ts.map +1 -1
  14. package/dist/elements/skills/index.js +2 -1
  15. package/dist/index.d.ts +51 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +577 -3
  18. package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
  19. package/dist/portfolio/PortfolioManager.js +1 -3
  20. package/dist/portfolio/types.d.ts +1 -3
  21. package/dist/portfolio/types.d.ts.map +1 -1
  22. package/dist/portfolio/types.js +1 -3
  23. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  24. package/dist/security/audit/config/suppressions.js +6 -1
  25. package/dist/server/ServerSetup.d.ts.map +1 -1
  26. package/dist/server/ServerSetup.js +5 -2
  27. package/dist/server/tools/CollectionTools.js +6 -6
  28. package/dist/server/tools/ElementTools.d.ts +11 -0
  29. package/dist/server/tools/ElementTools.d.ts.map +1 -0
  30. package/dist/server/tools/ElementTools.js +174 -0
  31. package/dist/server/tools/index.d.ts +1 -0
  32. package/dist/server/tools/index.d.ts.map +1 -1
  33. package/dist/server/tools/index.js +2 -1
  34. package/dist/server/types.d.ts +8 -0
  35. package/dist/server/types.d.ts.map +1 -1
  36. package/dist/server/types.js +1 -1
  37. package/package.json +1 -1
  38. package/dist/elements/ensembles/Ensemble.d.ts +0 -144
  39. package/dist/elements/ensembles/Ensemble.d.ts.map +0 -1
  40. package/dist/elements/ensembles/Ensemble.js +0 -860
  41. package/dist/elements/ensembles/EnsembleManager.d.ts +0 -85
  42. package/dist/elements/ensembles/EnsembleManager.d.ts.map +0 -1
  43. package/dist/elements/ensembles/EnsembleManager.js +0 -378
  44. package/dist/elements/ensembles/constants.d.ts +0 -73
  45. package/dist/elements/ensembles/constants.d.ts.map +0 -1
  46. package/dist/elements/ensembles/constants.js +0 -92
  47. package/dist/elements/ensembles/index.d.ts +0 -8
  48. package/dist/elements/ensembles/index.d.ts.map +0 -1
  49. package/dist/elements/ensembles/index.js +0 -8
  50. package/dist/elements/ensembles/types.d.ts +0 -92
  51. package/dist/elements/ensembles/types.d.ts.map +0 -1
  52. package/dist/elements/ensembles/types.js +0 -8
  53. package/dist/elements/memories/Memory.d.ts +0 -110
  54. package/dist/elements/memories/Memory.d.ts.map +0 -1
  55. package/dist/elements/memories/Memory.js +0 -470
  56. package/dist/elements/memories/MemoryManager.d.ts +0 -86
  57. package/dist/elements/memories/MemoryManager.d.ts.map +0 -1
  58. package/dist/elements/memories/MemoryManager.js +0 -435
  59. package/dist/elements/memories/constants.d.ts +0 -42
  60. package/dist/elements/memories/constants.d.ts.map +0 -1
  61. package/dist/elements/memories/constants.js +0 -49
  62. package/dist/elements/memories/index.d.ts +0 -6
  63. package/dist/elements/memories/index.d.ts.map +0 -1
  64. package/dist/elements/memories/index.js +0 -6
@@ -1,435 +0,0 @@
1
- /**
2
- * MemoryManager - Implementation of IElementManager for Memory elements
3
- * Handles CRUD operations and lifecycle management for memories implementing IElement
4
- *
5
- * FIXES IMPLEMENTED:
6
- * 1. CRITICAL: Fixed race conditions in file operations by using FileLockManager for atomic reads/writes
7
- * 2. HIGH: Fixed unvalidated YAML parsing vulnerability by using SecureYamlParser
8
- * 3. MEDIUM: All user inputs are now validated and sanitized
9
- * 4. MEDIUM: Audit logging added for security operations
10
- * 5. MEDIUM: Path validation prevents directory traversal attacks
11
- */
12
- import { Memory } from './Memory.js';
13
- import { ElementType } from '../../portfolio/types.js';
14
- import { PortfolioManager } from '../../portfolio/PortfolioManager.js';
15
- import { FileLockManager } from '../../security/fileLockManager.js';
16
- import { SecureYamlParser } from '../../security/secureYamlParser.js';
17
- import { SecurityMonitor } from '../../security/securityMonitor.js';
18
- import { sanitizeInput } from '../../security/InputValidator.js';
19
- import { MEMORY_CONSTANTS, MEMORY_SECURITY_EVENTS } from './constants.js';
20
- import * as path from 'path';
21
- import * as fs from 'fs/promises';
22
- import * as yaml from 'js-yaml';
23
- export class MemoryManager {
24
- portfolioManager;
25
- memoriesDir;
26
- memoryCache = new Map();
27
- constructor() {
28
- this.portfolioManager = PortfolioManager.getInstance();
29
- this.memoriesDir = this.portfolioManager.getElementDir(ElementType.MEMORY);
30
- }
31
- /**
32
- * Load a memory from file
33
- * SECURITY FIX #1: Uses FileLockManager.atomicReadFile() instead of fs.readFile()
34
- * to prevent race conditions and ensure atomic file operations
35
- */
36
- async load(filePath) {
37
- try {
38
- // Validate and resolve path
39
- const fullPath = await this.validateAndResolvePath(filePath);
40
- // Check cache first
41
- const cached = this.memoryCache.get(fullPath);
42
- if (cached) {
43
- return cached;
44
- }
45
- // CRITICAL FIX: Use atomic file read to prevent race conditions
46
- // Previously: const content = await fs.readFile(fullPath, 'utf-8');
47
- // Now: Uses FileLockManager with proper encoding object format
48
- const content = await FileLockManager.atomicReadFile(fullPath, { encoding: 'utf-8' });
49
- // HIGH SEVERITY FIX: Use SecureYamlParser to prevent YAML injection attacks
50
- // Previously: Could use unsafe YAML parsing
51
- // Now: Uses SecureYamlParser which validates content and prevents malicious patterns
52
- const parsed = SecureYamlParser.parse(content, {
53
- maxYamlSize: MEMORY_CONSTANTS.MAX_YAML_SIZE,
54
- validateContent: true
55
- });
56
- // Extract metadata and content
57
- const { metadata, content: memoryContent } = this.parseMemoryFile(parsed);
58
- // Create memory instance
59
- const memory = new Memory(metadata);
60
- // Load saved entries if present
61
- if (parsed.data && parsed.data.entries) {
62
- memory.deserialize(JSON.stringify({
63
- id: memory.id,
64
- type: memory.type,
65
- version: memory.version,
66
- metadata: memory.metadata,
67
- extensions: memory.extensions,
68
- entries: parsed.data.entries
69
- }));
70
- }
71
- // Cache the loaded memory
72
- this.memoryCache.set(fullPath, memory);
73
- // Log successful load
74
- SecurityMonitor.logSecurityEvent({
75
- type: MEMORY_SECURITY_EVENTS.MEMORY_LOADED,
76
- severity: 'LOW',
77
- source: 'MemoryManager.load',
78
- details: `Loaded memory from ${path.basename(fullPath)}`
79
- });
80
- return memory;
81
- }
82
- catch (error) {
83
- SecurityMonitor.logSecurityEvent({
84
- type: MEMORY_SECURITY_EVENTS.MEMORY_LOAD_FAILED,
85
- severity: 'MEDIUM',
86
- source: 'MemoryManager.load',
87
- details: `Failed to load memory from ${filePath}: ${error}`
88
- });
89
- throw new Error(`Failed to load memory: ${error}`);
90
- }
91
- }
92
- /**
93
- * Save a memory to file
94
- * SECURITY FIX #1: Uses FileLockManager.atomicWriteFile() for atomic operations
95
- */
96
- async save(element, filePath) {
97
- try {
98
- // Validate element
99
- const validation = element.validate();
100
- if (!validation.valid) {
101
- throw new Error(`Invalid memory: ${validation.errors?.map(e => e.message).join(', ')}`);
102
- }
103
- // Validate and resolve path
104
- const fullPath = await this.validateAndResolvePath(filePath);
105
- // Get memory statistics
106
- const stats = element.getStats();
107
- // Prepare data for saving
108
- const data = {
109
- metadata: element.metadata,
110
- extensions: element.extensions,
111
- stats: {
112
- totalEntries: stats.totalEntries,
113
- totalSize: stats.totalSize,
114
- oldestEntry: stats.oldestEntry?.toISOString(),
115
- newestEntry: stats.newestEntry?.toISOString(),
116
- topTags: Array.from(stats.tagFrequency.entries())
117
- .sort((a, b) => b[1] - a[1])
118
- .slice(0, 10)
119
- .map(([tag, count]) => ({ tag, count }))
120
- },
121
- entries: JSON.parse(element.serialize()).entries
122
- };
123
- // SECURITY FIX: Use secure YAML dumping with safety options
124
- // Previously: Could allow dangerous YAML features
125
- // Now: Uses FAILSAFE_SCHEMA and security options to prevent code execution
126
- const yamlContent = yaml.dump(data, {
127
- schema: yaml.FAILSAFE_SCHEMA,
128
- noRefs: true,
129
- skipInvalid: true,
130
- sortKeys: true
131
- });
132
- // CRITICAL FIX: Use atomic file write to prevent corruption
133
- // Previously: await fs.writeFile(fullPath, yamlContent, 'utf-8');
134
- // Now: Uses FileLockManager for atomic write with proper encoding
135
- await FileLockManager.atomicWriteFile(fullPath, yamlContent, { encoding: 'utf-8' });
136
- // Update cache
137
- this.memoryCache.set(fullPath, element);
138
- // Log successful save
139
- SecurityMonitor.logSecurityEvent({
140
- type: MEMORY_SECURITY_EVENTS.MEMORY_SAVED,
141
- severity: 'LOW',
142
- source: 'MemoryManager.save',
143
- details: `Saved memory to ${path.basename(fullPath)} with ${stats.totalEntries} entries`
144
- });
145
- }
146
- catch (error) {
147
- SecurityMonitor.logSecurityEvent({
148
- type: MEMORY_SECURITY_EVENTS.MEMORY_SAVE_FAILED,
149
- severity: 'HIGH',
150
- source: 'MemoryManager.save',
151
- details: `Failed to save memory to ${filePath}: ${error}`
152
- });
153
- throw new Error(`Failed to save memory: ${error}`);
154
- }
155
- }
156
- /**
157
- * List all available memories
158
- */
159
- async list() {
160
- try {
161
- const files = await fs.readdir(this.memoriesDir);
162
- const memories = [];
163
- for (const file of files) {
164
- if (file.endsWith('.md') || file.endsWith('.yaml') || file.endsWith('.yml')) {
165
- try {
166
- const memory = await this.load(file);
167
- memories.push(memory);
168
- }
169
- catch (error) {
170
- // Log but continue with other files
171
- SecurityMonitor.logSecurityEvent({
172
- type: MEMORY_SECURITY_EVENTS.MEMORY_LIST_ITEM_FAILED,
173
- severity: 'LOW',
174
- source: 'MemoryManager.list',
175
- details: `Failed to load ${file}: ${error}`
176
- });
177
- }
178
- }
179
- }
180
- return memories;
181
- }
182
- catch (error) {
183
- if (error.code === 'ENOENT') {
184
- // Directory doesn't exist yet
185
- return [];
186
- }
187
- throw error;
188
- }
189
- }
190
- /**
191
- * Find memories matching a predicate
192
- */
193
- async find(predicate) {
194
- const memories = await this.list();
195
- return memories.find(predicate);
196
- }
197
- /**
198
- * Find multiple memories matching a predicate
199
- */
200
- async findMany(predicate) {
201
- const memories = await this.list();
202
- return memories.filter(predicate);
203
- }
204
- /**
205
- * Delete a memory file
206
- * SECURITY: Validates path and logs deletion
207
- */
208
- async delete(filePath) {
209
- try {
210
- const fullPath = await this.validateAndResolvePath(filePath);
211
- // Check if file exists
212
- await fs.access(fullPath);
213
- // Delete the file
214
- await fs.unlink(fullPath);
215
- // Remove from cache
216
- this.memoryCache.delete(fullPath);
217
- SecurityMonitor.logSecurityEvent({
218
- type: MEMORY_SECURITY_EVENTS.MEMORY_DELETED,
219
- severity: 'MEDIUM',
220
- source: 'MemoryManager.delete',
221
- details: `Deleted memory file: ${path.basename(fullPath)}`
222
- });
223
- }
224
- catch (error) {
225
- if (error.code === 'ENOENT') {
226
- // File doesn't exist, not an error for delete operation
227
- return;
228
- }
229
- throw error;
230
- }
231
- }
232
- /**
233
- * Check if a memory file exists
234
- */
235
- async exists(filePath) {
236
- try {
237
- const fullPath = await this.validateAndResolvePath(filePath);
238
- await fs.access(fullPath);
239
- return true;
240
- }
241
- catch {
242
- return false;
243
- }
244
- }
245
- /**
246
- * Create a new memory with metadata
247
- */
248
- async create(metadata) {
249
- return new Memory(metadata);
250
- }
251
- /**
252
- * Import a memory from JSON/YAML string
253
- * SECURITY: Full validation of imported content
254
- */
255
- async importElement(data, format = 'yaml') {
256
- try {
257
- let parsed;
258
- if (format === 'json') {
259
- parsed = JSON.parse(data);
260
- }
261
- else {
262
- // HIGH SEVERITY FIX: Use secure YAML parsing
263
- // Memory import expects pure YAML (not frontmatter), so we parse it securely
264
- try {
265
- // First validate the YAML content size
266
- if (data.length > MEMORY_CONSTANTS.MAX_YAML_SIZE) {
267
- throw new Error('YAML content exceeds maximum allowed size');
268
- }
269
- // Create a wrapper to use SecureYamlParser with pure YAML
270
- // Add minimal frontmatter markers to satisfy parser
271
- const wrappedYaml = `---\n${data}\n---\n`;
272
- const parseResult = SecureYamlParser.parse(wrappedYaml, {
273
- maxYamlSize: MEMORY_CONSTANTS.MAX_YAML_SIZE,
274
- validateContent: true
275
- });
276
- // Extract the parsed data (will be in the 'data' property)
277
- parsed = parseResult.data;
278
- }
279
- catch (yamlError) {
280
- throw new Error(`Invalid YAML: ${yamlError}`);
281
- }
282
- // Validate it's an object
283
- if (!parsed || typeof parsed !== 'object') {
284
- throw new Error('YAML must contain an object');
285
- }
286
- }
287
- // Handle different structures from YAML parsing
288
- let metadata = parsed.metadata;
289
- let entries = parsed.entries || (parsed.data && parsed.data.entries);
290
- // Validate required fields
291
- if (!metadata || !metadata.name) {
292
- throw new Error('Memory must have metadata with name');
293
- }
294
- // Create memory instance
295
- const memory = new Memory(metadata);
296
- // Load entries if present
297
- if (entries) {
298
- memory.deserialize(JSON.stringify({
299
- id: memory.id,
300
- type: memory.type,
301
- version: memory.version,
302
- metadata: memory.metadata,
303
- extensions: memory.extensions,
304
- entries: entries
305
- }));
306
- }
307
- return memory;
308
- }
309
- catch (error) {
310
- SecurityMonitor.logSecurityEvent({
311
- type: MEMORY_SECURITY_EVENTS.MEMORY_IMPORT_FAILED,
312
- severity: 'MEDIUM',
313
- source: 'MemoryManager.importElement',
314
- details: `Failed to import memory: ${error}`
315
- });
316
- throw new Error(`Failed to import memory: ${error}`);
317
- }
318
- }
319
- /**
320
- * Export a memory to YAML string
321
- */
322
- async exportElement(element) {
323
- const stats = element.getStats();
324
- const data = {
325
- metadata: element.metadata,
326
- extensions: element.extensions,
327
- stats: {
328
- totalEntries: stats.totalEntries,
329
- totalSize: stats.totalSize,
330
- oldestEntry: stats.oldestEntry?.toISOString(),
331
- newestEntry: stats.newestEntry?.toISOString()
332
- },
333
- entries: JSON.parse(element.serialize()).entries
334
- };
335
- // SECURITY FIX: Use secure YAML dumping
336
- return yaml.dump(data, {
337
- schema: yaml.FAILSAFE_SCHEMA,
338
- noRefs: true,
339
- skipInvalid: true,
340
- sortKeys: true
341
- });
342
- }
343
- /**
344
- * Validate a memory element
345
- */
346
- validate(element) {
347
- return element.validate();
348
- }
349
- /**
350
- * Validate and resolve a file path
351
- * SECURITY: Prevents directory traversal attacks
352
- */
353
- validatePath(filePath) {
354
- try {
355
- // Perform synchronous validation checks
356
- const normalized = path.normalize(filePath);
357
- // Check for path traversal attempts
358
- if (normalized.includes('..') || path.isAbsolute(normalized)) {
359
- return false;
360
- }
361
- // Ensure proper extension
362
- if (!normalized.endsWith('.md') && !normalized.endsWith('.yaml') && !normalized.endsWith('.yml')) {
363
- return false;
364
- }
365
- return true;
366
- }
367
- catch {
368
- return false;
369
- }
370
- }
371
- /**
372
- * Get the element type this manager handles
373
- */
374
- getElementType() {
375
- return ElementType.MEMORY;
376
- }
377
- /**
378
- * Get the file extension for memory files
379
- */
380
- getFileExtension() {
381
- return '.yaml';
382
- }
383
- // Private helper methods
384
- async validateAndResolvePath(filePath) {
385
- // SECURITY FIX: Comprehensive path validation
386
- const normalized = path.normalize(filePath);
387
- // Check for path traversal attempts
388
- if (normalized.includes('..') || path.isAbsolute(normalized)) {
389
- SecurityMonitor.logSecurityEvent({
390
- type: 'PATH_TRAVERSAL_ATTEMPT',
391
- severity: 'HIGH',
392
- source: 'MemoryManager.validateAndResolvePath',
393
- details: `Blocked path traversal attempt: ${filePath}`
394
- });
395
- throw new Error('Invalid file path: Path traversal detected');
396
- }
397
- // Ensure proper extension
398
- if (!normalized.endsWith('.md') && !normalized.endsWith('.yaml') && !normalized.endsWith('.yml')) {
399
- throw new Error('Memory files must have .md, .yaml, or .yml extension');
400
- }
401
- // Construct full path
402
- const fullPath = path.join(this.memoriesDir, normalized);
403
- // Verify it's within memories directory
404
- const relative = path.relative(this.memoriesDir, fullPath);
405
- if (relative.startsWith('..') || path.isAbsolute(relative)) {
406
- throw new Error('File path must be within memories directory');
407
- }
408
- return fullPath;
409
- }
410
- parseMemoryFile(parsed) {
411
- // Extract metadata with validation
412
- const metadata = {
413
- name: sanitizeInput(parsed.metadata?.name || 'Unnamed Memory', 100),
414
- description: parsed.metadata?.description ?
415
- sanitizeInput(parsed.metadata.description, 500) :
416
- '',
417
- version: parsed.metadata?.version || '1.0.0',
418
- author: parsed.metadata?.author,
419
- created: parsed.metadata?.created,
420
- modified: new Date().toISOString(),
421
- tags: Array.isArray(parsed.metadata?.tags) ?
422
- parsed.metadata.tags.map((tag) => sanitizeInput(tag, 50)) :
423
- [],
424
- storageBackend: parsed.metadata?.storageBackend || MEMORY_CONSTANTS.DEFAULT_STORAGE_BACKEND,
425
- retentionDays: parsed.metadata?.retentionDays || MEMORY_CONSTANTS.DEFAULT_RETENTION_DAYS,
426
- privacyLevel: parsed.metadata?.privacyLevel || MEMORY_CONSTANTS.DEFAULT_PRIVACY_LEVEL,
427
- searchable: parsed.metadata?.searchable !== false,
428
- maxEntries: parsed.metadata?.maxEntries || MEMORY_CONSTANTS.MAX_ENTRIES_DEFAULT
429
- };
430
- // Extract content (if any)
431
- const content = parsed.content || '';
432
- return { metadata, content };
433
- }
434
- }
435
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5TWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnlNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUErQixNQUFNLGFBQWEsQ0FBQztBQUdsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUUsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsTUFBTSxPQUFPLGFBQWE7SUFDaEIsZ0JBQWdCLENBQW1CO0lBQ25DLFdBQVcsQ0FBUztJQUNwQixXQUFXLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFckQ7UUFDRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FB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Z0JBQWdCLENBQUMsbUJBQW1CO1NBQ2hGLENBQUM7UUFFRiwyQkFBMkI7UUFDM0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFFckMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMvQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1lbW9yeU1hbmFnZXIgLSBJbXBsZW1lbnRhdGlvbiBvZiBJRWxlbWVudE1hbmFnZXIgZm9yIE1lbW9yeSBlbGVtZW50c1xuICogSGFuZGxlcyBDUlVEIG9wZXJhdGlvbnMgYW5kIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGZvciBtZW1vcmllcyBpbXBsZW1lbnRpbmcgSUVsZW1lbnRcbiAqIFxuICogRklYRVMgSU1QTEVNRU5URUQ6XG4gKiAxLiBDUklUSUNBTDogRml4ZWQgcmFjZSBjb25kaXRpb25zIGluIGZpbGUgb3BlcmF0aW9ucyBieSB1c2luZyBGaWxlTG9ja01hbmFnZXIgZm9yIGF0b21pYyByZWFkcy93cml0ZXNcbiAqIDIuIEhJR0g6IEZpeGVkIHVudmFsaWRhdGVkIFlBTUwgcGFyc2luZyB2dWxuZXJhYmlsaXR5IGJ5IHVzaW5nIFNlY3VyZVlhbWxQYXJzZXJcbiAqIDMuIE1FRElVTTogQWxsIHVzZXIgaW5wdXRzIGFyZSBub3cgdmFsaWRhdGVkIGFuZCBzYW5pdGl6ZWRcbiAqIDQuIE1FRElVTTogQXVkaXQgbG9nZ2luZyBhZGRlZCBmb3Igc2VjdXJpdHkgb3BlcmF0aW9uc1xuICogNS4gTUVESVVNOiBQYXRoIHZhbGlkYXRpb24gcHJldmVudHMgZGlyZWN0b3J5IHRyYXZlcnNhbCBhdHRhY2tzXG4gKi9cblxuaW1wb3J0IHsgTWVtb3J5LCBNZW1vcnlNZXRhZGF0YSwgTWVtb3J5RW50cnkgfSBmcm9tICcuL01lbW9yeS5qcyc7XG5pbXBvcnQgeyBJRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBNRU1PUllfQ09OU1RBTlRTLCBNRU1PUllfU0VDVVJJVFlfRVZFTlRTIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmV4cG9ydCBjbGFzcyBNZW1vcnlNYW5hZ2VyIGltcGxlbWVudHMgSUVsZW1lbnRNYW5hZ2VyPE1lbW9yeT4ge1xuICBwcml2YXRlIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXI7XG4gIHByaXZhdGUgbWVtb3JpZXNEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSBtZW1vcnlDYWNoZTogTWFwPHN0cmluZywgTWVtb3J5PiA9IG5ldyBNYXAoKTtcbiAgXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IFBvcnRmb2xpb01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICB0aGlzLm1lbW9yaWVzRGlyID0gdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoRWxlbWVudFR5cGUuTUVNT1JZKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIExvYWQgYSBtZW1vcnkgZnJvbSBmaWxlXG4gICAqIFNFQ1VSSVRZIEZJWCAjMTogVXNlcyBGaWxlTG9ja01hbmFnZXIuYXRvbWljUmVhZEZpbGUoKSBpbnN0ZWFkIG9mIGZzLnJlYWRGaWxlKClcbiAgICogdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgYW5kIGVuc3VyZSBhdG9taWMgZmlsZSBvcGVyYXRpb25zXG4gICAqL1xuICBhc3luYyBsb2FkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPE1lbW9yeT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSBhbmQgcmVzb2x2ZSBwYXRoXG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGF3YWl0IHRoaXMudmFsaWRhdGVBbmRSZXNvbHZlUGF0aChmaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGNhY2hlIGZpcnN0XG4gICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLm1lbW9yeUNhY2hlLmdldChmdWxsUGF0aCk7XG4gICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENSSVRJQ0FMIEZJWDogVXNlIGF0b21pYyBmaWxlIHJlYWQgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICAgIC8vIFByZXZpb3VzbHk6IGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmdWxsUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAvLyBOb3c6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyIHdpdGggcHJvcGVyIGVuY29kaW5nIG9iamVjdCBmb3JtYXRcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljUmVhZEZpbGUoZnVsbFBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICBcbiAgICAgIC8vIEhJR0ggU0VWRVJJVFkgRklYOiBVc2UgU2VjdXJlWWFtbFBhcnNlciB0byBwcmV2ZW50IFlBTUwgaW5qZWN0aW9uIGF0dGFja3NcbiAgICAgIC8vIFByZXZpb3VzbHk6IENvdWxkIHVzZSB1bnNhZmUgWUFNTCBwYXJzaW5nXG4gICAgICAvLyBOb3c6IFVzZXMgU2VjdXJlWWFtbFBhcnNlciB3aGljaCB2YWxpZGF0ZXMgY29udGVudCBhbmQgcHJldmVudHMgbWFsaWNpb3VzIHBhdHRlcm5zXG4gICAgICBjb25zdCBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKGNvbnRlbnQsIHtcbiAgICAgICAgbWF4WWFtbFNpemU6IE1FTU9SWV9DT05TVEFOVFMuTUFYX1lBTUxfU0laRSxcbiAgICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gRXh0cmFjdCBtZXRhZGF0YSBhbmQgY29udGVudFxuICAgICAgY29uc3QgeyBtZXRhZGF0YSwgY29udGVudDogbWVtb3J5Q29udGVudCB9ID0gdGhpcy5wYXJzZU1lbW9yeUZpbGUocGFyc2VkKTtcbiAgICAgIFxuICAgICAgLy8gQ3JlYXRlIG1lbW9yeSBpbnN0YW5jZVxuICAgICAgY29uc3QgbWVtb3J5ID0gbmV3IE1lbW9yeShtZXRhZGF0YSk7XG4gICAgICBcbiAgICAgIC8vIExvYWQgc2F2ZWQgZW50cmllcyBpZiBwcmVzZW50XG4gICAgICBpZiAocGFyc2VkLmRhdGEgJiYgcGFyc2VkLmRhdGEuZW50cmllcykge1xuICAgICAgICBtZW1vcnkuZGVzZXJpYWxpemUoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGlkOiBtZW1vcnkuaWQsXG4gICAgICAgICAgdHlwZTogbWVtb3J5LnR5cGUsXG4gICAgICAgICAgdmVyc2lvbjogbWVtb3J5LnZlcnNpb24sXG4gICAgICAgICAgbWV0YWRhdGE6IG1lbW9yeS5tZXRhZGF0YSxcbiAgICAgICAgICBleHRlbnNpb25zOiBtZW1vcnkuZXh0ZW5zaW9ucyxcbiAgICAgICAgICBlbnRyaWVzOiBwYXJzZWQuZGF0YS5lbnRyaWVzXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2FjaGUgdGhlIGxvYWRlZCBtZW1vcnlcbiAgICAgIHRoaXMubWVtb3J5Q2FjaGUuc2V0KGZ1bGxQYXRoLCBtZW1vcnkpO1xuICAgICAgXG4gICAgICAvLyBMb2cgc3VjY2Vzc2Z1bCBsb2FkXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX0xPQURFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmxvYWQnLFxuICAgICAgICBkZXRhaWxzOiBgTG9hZGVkIG1lbW9yeSBmcm9tICR7cGF0aC5iYXNlbmFtZShmdWxsUGF0aCl9YFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiBtZW1vcnk7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9MT0FEX0ZBSUxFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmxvYWQnLFxuICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIGxvYWQgbWVtb3J5IGZyb20gJHtmaWxlUGF0aH06ICR7ZXJyb3J9YFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIG1lbW9yeTogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTYXZlIGEgbWVtb3J5IHRvIGZpbGVcbiAgICogU0VDVVJJVFkgRklYICMxOiBVc2VzIEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoKSBmb3IgYXRvbWljIG9wZXJhdGlvbnNcbiAgICovXG4gIGFzeW5jIHNhdmUoZWxlbWVudDogTWVtb3J5LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIGVsZW1lbnRcbiAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSBlbGVtZW50LnZhbGlkYXRlKCk7XG4gICAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG1lbW9yeTogJHt2YWxpZGF0aW9uLmVycm9ycz8ubWFwKGUgPT4gZS5tZXNzYWdlKS5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBWYWxpZGF0ZSBhbmQgcmVzb2x2ZSBwYXRoXG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGF3YWl0IHRoaXMudmFsaWRhdGVBbmRSZXNvbHZlUGF0aChmaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIEdldCBtZW1vcnkgc3RhdGlzdGljc1xuICAgICAgY29uc3Qgc3RhdHMgPSBlbGVtZW50LmdldFN0YXRzKCk7XG4gICAgICBcbiAgICAgIC8vIFByZXBhcmUgZGF0YSBmb3Igc2F2aW5nXG4gICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICBtZXRhZGF0YTogZWxlbWVudC5tZXRhZGF0YSxcbiAgICAgICAgZXh0ZW5zaW9uczogZWxlbWVudC5leHRlbnNpb25zLFxuICAgICAgICBzdGF0czoge1xuICAgICAgICAgIHRvdGFsRW50cmllczogc3RhdHMudG90YWxFbnRyaWVzLFxuICAgICAgICAgIHRvdGFsU2l6ZTogc3RhdHMudG90YWxTaXplLFxuICAgICAgICAgIG9sZGVzdEVudHJ5OiBzdGF0cy5vbGRlc3RFbnRyeT8udG9JU09TdHJpbmcoKSxcbiAgICAgICAgICBuZXdlc3RFbnRyeTogc3RhdHMubmV3ZXN0RW50cnk/LnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgdG9wVGFnczogQXJyYXkuZnJvbShzdGF0cy50YWdGcmVxdWVuY3kuZW50cmllcygpKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGJbMV0gLSBhWzFdKVxuICAgICAgICAgICAgLnNsaWNlKDAsIDEwKVxuICAgICAgICAgICAgLm1hcCgoW3RhZywgY291bnRdKSA9PiAoeyB0YWcsIGNvdW50IH0pKVxuICAgICAgICB9LFxuICAgICAgICBlbnRyaWVzOiBKU09OLnBhcnNlKGVsZW1lbnQuc2VyaWFsaXplKCkpLmVudHJpZXNcbiAgICAgIH07XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZIEZJWDogVXNlIHNlY3VyZSBZQU1MIGR1bXBpbmcgd2l0aCBzYWZldHkgb3B0aW9uc1xuICAgICAgLy8gUHJldmlvdXNseTogQ291bGQgYWxsb3cgZGFuZ2Vyb3VzIFlBTUwgZmVhdHVyZXNcbiAgICAgIC8vIE5vdzogVXNlcyBGQUlMU0FGRV9TQ0hFTUEgYW5kIHNlY3VyaXR5IG9wdGlvbnMgdG8gcHJldmVudCBjb2RlIGV4ZWN1dGlvblxuICAgICAgY29uc3QgeWFtbENvbnRlbnQgPSB5YW1sLmR1bXAoZGF0YSwge1xuICAgICAgICBzY2hlbWE6IHlhbWwuRkFJTFNBRkVfU0NIRU1BLFxuICAgICAgICBub1JlZnM6IHRydWUsXG4gICAgICAgIHNraXBJbnZhbGlkOiB0cnVlLFxuICAgICAgICBzb3J0S2V5czogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIENSSVRJQ0FMIEZJWDogVXNlIGF0b21pYyBmaWxlIHdyaXRlIHRvIHByZXZlbnQgY29ycnVwdGlvblxuICAgICAgLy8gUHJldmlvdXNseTogYXdhaXQgZnMud3JpdGVGaWxlKGZ1bGxQYXRoLCB5YW1sQ29udGVudCwgJ3V0Zi04Jyk7XG4gICAgICAvLyBOb3c6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgd3JpdGUgd2l0aCBwcm9wZXIgZW5jb2RpbmdcbiAgICAgIGF3YWl0IEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoZnVsbFBhdGgsIHlhbWxDb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICAgICAgXG4gICAgICAvLyBVcGRhdGUgY2FjaGVcbiAgICAgIHRoaXMubWVtb3J5Q2FjaGUuc2V0KGZ1bGxQYXRoLCBlbGVtZW50KTtcbiAgICAgIFxuICAgICAgLy8gTG9nIHN1Y2Nlc3NmdWwgc2F2ZVxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9TQVZFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLnNhdmUnLFxuICAgICAgICBkZXRhaWxzOiBgU2F2ZWQgbWVtb3J5IHRvICR7cGF0aC5iYXNlbmFtZShmdWxsUGF0aCl9IHdpdGggJHtzdGF0cy50b3RhbEVudHJpZXN9IGVudHJpZXNgXG4gICAgICB9KTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX1NBVkVfRkFJTEVELFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLnNhdmUnLFxuICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIHNhdmUgbWVtb3J5IHRvICR7ZmlsZVBhdGh9OiAke2Vycm9yfWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc2F2ZSBtZW1vcnk6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogTGlzdCBhbGwgYXZhaWxhYmxlIG1lbW9yaWVzXG4gICAqL1xuICBhc3luYyBsaXN0KCk6IFByb21pc2U8TWVtb3J5W10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHRoaXMubWVtb3JpZXNEaXIpO1xuICAgICAgY29uc3QgbWVtb3JpZXM6IE1lbW9yeVtdID0gW107XG4gICAgICBcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBpZiAoZmlsZS5lbmRzV2l0aCgnLm1kJykgfHwgZmlsZS5lbmRzV2l0aCgnLnlhbWwnKSB8fCBmaWxlLmVuZHNXaXRoKCcueW1sJykpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbWVtb3J5ID0gYXdhaXQgdGhpcy5sb2FkKGZpbGUpO1xuICAgICAgICAgICAgbWVtb3JpZXMucHVzaChtZW1vcnkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBMb2cgYnV0IGNvbnRpbnVlIHdpdGggb3RoZXIgZmlsZXNcbiAgICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfTElTVF9JVEVNX0ZBSUxFRCxcbiAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmxpc3QnLFxuICAgICAgICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIGxvYWQgJHtmaWxlfTogJHtlcnJvcn1gXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIG1lbW9yaWVzO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICAvLyBEaXJlY3RvcnkgZG9lc24ndCBleGlzdCB5ZXRcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogRmluZCBtZW1vcmllcyBtYXRjaGluZyBhIHByZWRpY2F0ZVxuICAgKi9cbiAgYXN5bmMgZmluZChwcmVkaWNhdGU6IChlbGVtZW50OiBNZW1vcnkpID0+IGJvb2xlYW4pOiBQcm9taXNlPE1lbW9yeSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG1lbW9yaWVzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIG1lbW9yaWVzLmZpbmQocHJlZGljYXRlKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEZpbmQgbXVsdGlwbGUgbWVtb3JpZXMgbWF0Y2hpbmcgYSBwcmVkaWNhdGVcbiAgICovXG4gIGFzeW5jIGZpbmRNYW55KHByZWRpY2F0ZTogKGVsZW1lbnQ6IE1lbW9yeSkgPT4gYm9vbGVhbik6IFByb21pc2U8TWVtb3J5W10+IHtcbiAgICBjb25zdCBtZW1vcmllcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiBtZW1vcmllcy5maWx0ZXIocHJlZGljYXRlKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERlbGV0ZSBhIG1lbW9yeSBmaWxlXG4gICAqIFNFQ1VSSVRZOiBWYWxpZGF0ZXMgcGF0aCBhbmQgbG9ncyBkZWxldGlvblxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBhd2FpdCB0aGlzLnZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgoZmlsZVBhdGgpO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBpZiBmaWxlIGV4aXN0c1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZ1bGxQYXRoKTtcbiAgICAgIFxuICAgICAgLy8gRGVsZXRlIHRoZSBmaWxlXG4gICAgICBhd2FpdCBmcy51bmxpbmsoZnVsbFBhdGgpO1xuICAgICAgXG4gICAgICAvLyBSZW1vdmUgZnJvbSBjYWNoZVxuICAgICAgdGhpcy5tZW1vcnlDYWNoZS5kZWxldGUoZnVsbFBhdGgpO1xuICAgICAgXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX0RFTEVURUQsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5kZWxldGUnLFxuICAgICAgICBkZXRhaWxzOiBgRGVsZXRlZCBtZW1vcnkgZmlsZTogJHtwYXRoLmJhc2VuYW1lKGZ1bGxQYXRoKX1gXG4gICAgICB9KTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBub3QgYW4gZXJyb3IgZm9yIGRlbGV0ZSBvcGVyYXRpb25cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBtZW1vcnkgZmlsZSBleGlzdHNcbiAgICovXG4gIGFzeW5jIGV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gYXdhaXQgdGhpcy52YWxpZGF0ZUFuZFJlc29sdmVQYXRoKGZpbGVQYXRoKTtcbiAgICAgIGF3YWl0IGZzLmFjY2VzcyhmdWxsUGF0aCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgbWVtb3J5IHdpdGggbWV0YWRhdGFcbiAgICovXG4gIGFzeW5jIGNyZWF0ZShtZXRhZGF0YTogUGFydGlhbDxNZW1vcnlNZXRhZGF0YT4pOiBQcm9taXNlPE1lbW9yeT4ge1xuICAgIHJldHVybiBuZXcgTWVtb3J5KG1ldGFkYXRhKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEltcG9ydCBhIG1lbW9yeSBmcm9tIEpTT04vWUFNTCBzdHJpbmdcbiAgICogU0VDVVJJVFk6IEZ1bGwgdmFsaWRhdGlvbiBvZiBpbXBvcnRlZCBjb250ZW50XG4gICAqL1xuICBhc3luYyBpbXBvcnRFbGVtZW50KGRhdGE6IHN0cmluZywgZm9ybWF0OiAnanNvbicgfCAneWFtbCcgPSAneWFtbCcpOiBQcm9taXNlPE1lbW9yeT4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgcGFyc2VkOiBhbnk7XG4gICAgICBcbiAgICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSElHSCBTRVZFUklUWSBGSVg6IFVzZSBzZWN1cmUgWUFNTCBwYXJzaW5nXG4gICAgICAgIC8vIE1lbW9yeSBpbXBvcnQgZXhwZWN0cyBwdXJlIFlBTUwgKG5vdCBmcm9udG1hdHRlciksIHNvIHdlIHBhcnNlIGl0IHNlY3VyZWx5XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gRmlyc3QgdmFsaWRhdGUgdGhlIFlBTUwgY29udGVudCBzaXplXG4gICAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gTUVNT1JZX0NPTlNUQU5UUy5NQVhfWUFNTF9TSVpFKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lBTUwgY29udGVudCBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBzaXplJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIENyZWF0ZSBhIHdyYXBwZXIgdG8gdXNlIFNlY3VyZVlhbWxQYXJzZXIgd2l0aCBwdXJlIFlBTUxcbiAgICAgICAgICAvLyBBZGQgbWluaW1hbCBmcm9udG1hdHRlciBtYXJrZXJzIHRvIHNhdGlzZnkgcGFyc2VyXG4gICAgICAgICAgY29uc3Qgd3JhcHBlZFlhbWwgPSBgLS0tXFxuJHtkYXRhfVxcbi0tLVxcbmA7XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgcGFyc2VSZXN1bHQgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKHdyYXBwZWRZYW1sLCB7XG4gICAgICAgICAgICBtYXhZYW1sU2l6ZTogTUVNT1JZX0NPTlNUQU5UUy5NQVhfWUFNTF9TSVpFLFxuICAgICAgICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRXh0cmFjdCB0aGUgcGFyc2VkIGRhdGEgKHdpbGwgYmUgaW4gdGhlICdkYXRhJyBwcm9wZXJ0eSlcbiAgICAgICAgICBwYXJzZWQgPSBwYXJzZVJlc3VsdC5kYXRhO1xuICAgICAgICAgIFxuICAgICAgICB9IGNhdGNoICh5YW1sRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgWUFNTDogJHt5YW1sRXJyb3J9YCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFZhbGlkYXRlIGl0J3MgYW4gb2JqZWN0XG4gICAgICAgIGlmICghcGFyc2VkIHx8IHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZQU1MIG11c3QgY29udGFpbiBhbiBvYmplY3QnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBIYW5kbGUgZGlmZmVyZW50IHN0cnVjdHVyZXMgZnJvbSBZQU1MIHBhcnNpbmdcbiAgICAgIGxldCBtZXRhZGF0YSA9IHBhcnNlZC5tZXRhZGF0YTtcbiAgICAgIGxldCBlbnRyaWVzID0gcGFyc2VkLmVudHJpZXMgfHwgKHBhcnNlZC5kYXRhICYmIHBhcnNlZC5kYXRhLmVudHJpZXMpO1xuICAgICAgXG4gICAgICAvLyBWYWxpZGF0ZSByZXF1aXJlZCBmaWVsZHNcbiAgICAgIGlmICghbWV0YWRhdGEgfHwgIW1ldGFkYXRhLm5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vcnkgbXVzdCBoYXZlIG1ldGFkYXRhIHdpdGggbmFtZScpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDcmVhdGUgbWVtb3J5IGluc3RhbmNlXG4gICAgICBjb25zdCBtZW1vcnkgPSBuZXcgTWVtb3J5KG1ldGFkYXRhKTtcbiAgICAgIFxuICAgICAgLy8gTG9hZCBlbnRyaWVzIGlmIHByZXNlbnRcbiAgICAgIGlmIChlbnRyaWVzKSB7XG4gICAgICAgIG1lbW9yeS5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgaWQ6IG1lbW9yeS5pZCxcbiAgICAgICAgICB0eXBlOiBtZW1vcnkudHlwZSxcbiAgICAgICAgICB2ZXJzaW9uOiBtZW1vcnkudmVyc2lvbixcbiAgICAgICAgICBtZXRhZGF0YTogbWVtb3J5Lm1ldGFkYXRhLFxuICAgICAgICAgIGV4dGVuc2lvbnM6IG1lbW9yeS5leHRlbnNpb25zLFxuICAgICAgICAgIGVudHJpZXM6IGVudHJpZXNcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gbWVtb3J5O1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfSU1QT1JUX0ZBSUxFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmltcG9ydEVsZW1lbnQnLFxuICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIGltcG9ydCBtZW1vcnk6ICR7ZXJyb3J9YFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBpbXBvcnQgbWVtb3J5OiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEV4cG9ydCBhIG1lbW9yeSB0byBZQU1MIHN0cmluZ1xuICAgKi9cbiAgYXN5bmMgZXhwb3J0RWxlbWVudChlbGVtZW50OiBNZW1vcnkpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHN0YXRzID0gZWxlbWVudC5nZXRTdGF0cygpO1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBtZXRhZGF0YTogZWxlbWVudC5tZXRhZGF0YSxcbiAgICAgIGV4dGVuc2lvbnM6IGVsZW1lbnQuZXh0ZW5zaW9ucyxcbiAgICAgIHN0YXRzOiB7XG4gICAgICAgIHRvdGFsRW50cmllczogc3RhdHMudG90YWxFbnRyaWVzLFxuICAgICAgICB0b3RhbFNpemU6IHN0YXRzLnRvdGFsU2l6ZSxcbiAgICAgICAgb2xkZXN0RW50cnk6IHN0YXRzLm9sZGVzdEVudHJ5Py50b0lTT1N0cmluZygpLFxuICAgICAgICBuZXdlc3RFbnRyeTogc3RhdHMubmV3ZXN0RW50cnk/LnRvSVNPU3RyaW5nKClcbiAgICAgIH0sXG4gICAgICBlbnRyaWVzOiBKU09OLnBhcnNlKGVsZW1lbnQuc2VyaWFsaXplKCkpLmVudHJpZXNcbiAgICB9O1xuICAgIFxuICAgIC8vIFNFQ1VSSVRZIEZJWDogVXNlIHNlY3VyZSBZQU1MIGR1bXBpbmdcbiAgICByZXR1cm4geWFtbC5kdW1wKGRhdGEsIHtcbiAgICAgIHNjaGVtYTogeWFtbC5GQUlMU0FGRV9TQ0hFTUEsXG4gICAgICBub1JlZnM6IHRydWUsXG4gICAgICBza2lwSW52YWxpZDogdHJ1ZSxcbiAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIG1lbW9yeSBlbGVtZW50XG4gICAqL1xuICB2YWxpZGF0ZShlbGVtZW50OiBNZW1vcnkpOiBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gICAgcmV0dXJuIGVsZW1lbnQudmFsaWRhdGUoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuZCByZXNvbHZlIGEgZmlsZSBwYXRoXG4gICAqIFNFQ1VSSVRZOiBQcmV2ZW50cyBkaXJlY3RvcnkgdHJhdmVyc2FsIGF0dGFja3NcbiAgICovXG4gIHZhbGlkYXRlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFBlcmZvcm0gc3luY2hyb25vdXMgdmFsaWRhdGlvbiBjaGVja3NcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBwYXRoLm5vcm1hbGl6ZShmaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGZvciBwYXRoIHRyYXZlcnNhbCBhdHRlbXB0c1xuICAgICAgaWYgKG5vcm1hbGl6ZWQuaW5jbHVkZXMoJy4uJykgfHwgcGF0aC5pc0Fic29sdXRlKG5vcm1hbGl6ZWQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRW5zdXJlIHByb3BlciBleHRlbnNpb25cbiAgICAgIGlmICghbm9ybWFsaXplZC5lbmRzV2l0aCgnLm1kJykgJiYgIW5vcm1hbGl6ZWQuZW5kc1dpdGgoJy55YW1sJykgJiYgIW5vcm1hbGl6ZWQuZW5kc1dpdGgoJy55bWwnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB0aGUgZWxlbWVudCB0eXBlIHRoaXMgbWFuYWdlciBoYW5kbGVzXG4gICAqL1xuICBnZXRFbGVtZW50VHlwZSgpOiBFbGVtZW50VHlwZSB7XG4gICAgcmV0dXJuIEVsZW1lbnRUeXBlLk1FTU9SWTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB0aGUgZmlsZSBleHRlbnNpb24gZm9yIG1lbW9yeSBmaWxlc1xuICAgKi9cbiAgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnLnlhbWwnO1xuICB9XG4gIFxuICAvLyBQcml2YXRlIGhlbHBlciBtZXRob2RzXG4gIFxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYOiBDb21wcmVoZW5zaXZlIHBhdGggdmFsaWRhdGlvblxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBwYXRoLm5vcm1hbGl6ZShmaWxlUGF0aCk7XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIHBhdGggdHJhdmVyc2FsIGF0dGVtcHRzXG4gICAgaWYgKG5vcm1hbGl6ZWQuaW5jbHVkZXMoJy4uJykgfHwgcGF0aC5pc0Fic29sdXRlKG5vcm1hbGl6ZWQpKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci52YWxpZGF0ZUFuZFJlc29sdmVQYXRoJyxcbiAgICAgICAgZGV0YWlsczogYEJsb2NrZWQgcGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdDogJHtmaWxlUGF0aH1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmaWxlIHBhdGg6IFBhdGggdHJhdmVyc2FsIGRldGVjdGVkJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIEVuc3VyZSBwcm9wZXIgZXh0ZW5zaW9uXG4gICAgaWYgKCFub3JtYWxpemVkLmVuZHNXaXRoKCcubWQnKSAmJiAhbm9ybWFsaXplZC5lbmRzV2l0aCgnLnlhbWwnKSAmJiAhbm9ybWFsaXplZC5lbmRzV2l0aCgnLnltbCcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lbW9yeSBmaWxlcyBtdXN0IGhhdmUgLm1kLCAueWFtbCwgb3IgLnltbCBleHRlbnNpb24nKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ29uc3RydWN0IGZ1bGwgcGF0aFxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsIG5vcm1hbGl6ZWQpO1xuICAgIFxuICAgIC8vIFZlcmlmeSBpdCdzIHdpdGhpbiBtZW1vcmllcyBkaXJlY3RvcnlcbiAgICBjb25zdCByZWxhdGl2ZSA9IHBhdGgucmVsYXRpdmUodGhpcy5tZW1vcmllc0RpciwgZnVsbFBhdGgpO1xuICAgIGlmIChyZWxhdGl2ZS5zdGFydHNXaXRoKCcuLicpIHx8IHBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmlsZSBwYXRoIG11c3QgYmUgd2l0aGluIG1lbW9yaWVzIGRpcmVjdG9yeScpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZnVsbFBhdGg7XG4gIH1cbiAgXG4gIHByaXZhdGUgcGFyc2VNZW1vcnlGaWxlKHBhcnNlZDogYW55KTogeyBtZXRhZGF0YTogTWVtb3J5TWV0YWRhdGE7IGNvbnRlbnQ6IHN0cmluZyB9IHtcbiAgICAvLyBFeHRyYWN0IG1ldGFkYXRhIHdpdGggdmFsaWRhdGlvblxuICAgIGNvbnN0IG1ldGFkYXRhOiBNZW1vcnlNZXRhZGF0YSA9IHtcbiAgICAgIG5hbWU6IHNhbml0aXplSW5wdXQocGFyc2VkLm1ldGFkYXRhPy5uYW1lIHx8ICdVbm5hbWVkIE1lbW9yeScsIDEwMCksXG4gICAgICBkZXNjcmlwdGlvbjogcGFyc2VkLm1ldGFkYXRhPy5kZXNjcmlwdGlvbiA/IFxuICAgICAgICBzYW5pdGl6ZUlucHV0KHBhcnNlZC5tZXRhZGF0YS5kZXNjcmlwdGlvbiwgNTAwKSA6IFxuICAgICAgICAnJyxcbiAgICAgIHZlcnNpb246IHBhcnNlZC5tZXRhZGF0YT8udmVyc2lvbiB8fCAnMS4wLjAnLFxuICAgICAgYXV0aG9yOiBwYXJzZWQubWV0YWRhdGE/LmF1dGhvcixcbiAgICAgIGNyZWF0ZWQ6IHBhcnNlZC5tZXRhZGF0YT8uY3JlYXRlZCxcbiAgICAgIG1vZGlmaWVkOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB0YWdzOiBBcnJheS5pc0FycmF5KHBhcnNlZC5tZXRhZGF0YT8udGFncykgPyBcbiAgICAgICAgcGFyc2VkLm1ldGFkYXRhLnRhZ3MubWFwKCh0YWc6IHN0cmluZykgPT4gc2FuaXRpemVJbnB1dCh0YWcsIDUwKSkgOiBcbiAgICAgICAgW10sXG4gICAgICBzdG9yYWdlQmFja2VuZDogcGFyc2VkLm1ldGFkYXRhPy5zdG9yYWdlQmFja2VuZCB8fCBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfU1RPUkFHRV9CQUNLRU5ELFxuICAgICAgcmV0ZW50aW9uRGF5czogcGFyc2VkLm1ldGFkYXRhPy5yZXRlbnRpb25EYXlzIHx8IE1FTU9SWV9DT05TVEFOVFMuREVGQVVMVF9SRVRFTlRJT05fREFZUyxcbiAgICAgIHByaXZhY3lMZXZlbDogcGFyc2VkLm1ldGFkYXRhPy5wcml2YWN5TGV2ZWwgfHwgTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1BSSVZBQ1lfTEVWRUwsXG4gICAgICBzZWFyY2hhYmxlOiBwYXJzZWQubWV0YWRhdGE/LnNlYXJjaGFibGUgIT09IGZhbHNlLFxuICAgICAgbWF4RW50cmllczogcGFyc2VkLm1ldGFkYXRhPy5tYXhFbnRyaWVzIHx8IE1FTU9SWV9DT05TVEFOVFMuTUFYX0VOVFJJRVNfREVGQVVMVFxuICAgIH07XG4gICAgXG4gICAgLy8gRXh0cmFjdCBjb250ZW50IChpZiBhbnkpXG4gICAgY29uc3QgY29udGVudCA9IHBhcnNlZC5jb250ZW50IHx8ICcnO1xuICAgIFxuICAgIHJldHVybiB7IG1ldGFkYXRhLCBjb250ZW50IH07XG4gIH1cbn0iXX0=
@@ -1,42 +0,0 @@
1
- /**
2
- * Constants for Memory element implementation
3
- * Extracted for reusability and maintainability
4
- */
5
- export declare const MEMORY_CONSTANTS: {
6
- readonly MAX_MEMORY_SIZE: number;
7
- readonly MAX_ENTRY_SIZE: number;
8
- readonly MAX_ENTRIES_DEFAULT: 1000;
9
- readonly MAX_TAGS_PER_ENTRY: 20;
10
- readonly MAX_TAG_LENGTH: 50;
11
- readonly MAX_METADATA_KEYS: 20;
12
- readonly MAX_METADATA_KEY_LENGTH: 50;
13
- readonly MAX_METADATA_VALUE_LENGTH: 200;
14
- readonly DEFAULT_RETENTION_DAYS: 30;
15
- readonly MIN_RETENTION_DAYS: 1;
16
- readonly MAX_RETENTION_DAYS: 365;
17
- readonly DEFAULT_SEARCH_LIMIT: 100;
18
- readonly MAX_YAML_SIZE: number;
19
- readonly PRIVACY_LEVELS: readonly ["public", "private", "sensitive"];
20
- readonly DEFAULT_PRIVACY_LEVEL: "private";
21
- readonly DEFAULT_STORAGE_BACKEND: "memory";
22
- readonly SUPPORTED_STORAGE_BACKENDS: readonly ["memory", "file", "indexed"];
23
- };
24
- export type PrivacyLevel = typeof MEMORY_CONSTANTS.PRIVACY_LEVELS[number];
25
- export type StorageBackend = typeof MEMORY_CONSTANTS.SUPPORTED_STORAGE_BACKENDS[number];
26
- export declare const MEMORY_SECURITY_EVENTS: {
27
- readonly MEMORY_CREATED: "MEMORY_CREATED";
28
- readonly MEMORY_ADDED: "MEMORY_ADDED";
29
- readonly MEMORY_SEARCHED: "MEMORY_SEARCHED";
30
- readonly SENSITIVE_MEMORY_DELETED: "SENSITIVE_MEMORY_DELETED";
31
- readonly RETENTION_POLICY_ENFORCED: "RETENTION_POLICY_ENFORCED";
32
- readonly MEMORY_CLEARED: "MEMORY_CLEARED";
33
- readonly MEMORY_LOADED: "MEMORY_LOADED";
34
- readonly MEMORY_SAVED: "MEMORY_SAVED";
35
- readonly MEMORY_DELETED: "MEMORY_DELETED";
36
- readonly MEMORY_LOAD_FAILED: "MEMORY_LOAD_FAILED";
37
- readonly MEMORY_SAVE_FAILED: "MEMORY_SAVE_FAILED";
38
- readonly MEMORY_DESERIALIZE_FAILED: "MEMORY_DESERIALIZE_FAILED";
39
- readonly MEMORY_LIST_ITEM_FAILED: "MEMORY_LIST_ITEM_FAILED";
40
- readonly MEMORY_IMPORT_FAILED: "MEMORY_IMPORT_FAILED";
41
- };
42
- //# sourceMappingURL=constants.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/elements/memories/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;CA+BnB,CAAC;AAGX,MAAM,MAAM,YAAY,GAAG,OAAO,gBAAgB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC1E,MAAM,MAAM,cAAc,GAAG,OAAO,gBAAgB,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;AAGxF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;CAezB,CAAC"}
@@ -1,49 +0,0 @@
1
- /**
2
- * Constants for Memory element implementation
3
- * Extracted for reusability and maintainability
4
- */
5
- // Memory size limits
6
- export const MEMORY_CONSTANTS = {
7
- // Size limits
8
- MAX_MEMORY_SIZE: 1024 * 1024, // 1MB total memory size
9
- MAX_ENTRY_SIZE: 100 * 1024, // 100KB per entry
10
- MAX_ENTRIES_DEFAULT: 1000, // Maximum number of entries
11
- // Entry limits
12
- MAX_TAGS_PER_ENTRY: 20, // Maximum tags per memory entry
13
- MAX_TAG_LENGTH: 50, // Maximum length of each tag
14
- MAX_METADATA_KEYS: 20, // Maximum metadata keys per entry
15
- MAX_METADATA_KEY_LENGTH: 50, // Maximum metadata key length
16
- MAX_METADATA_VALUE_LENGTH: 200, // Maximum metadata value length
17
- // Retention defaults
18
- DEFAULT_RETENTION_DAYS: 30, // Default retention period
19
- MIN_RETENTION_DAYS: 1, // Minimum retention period
20
- MAX_RETENTION_DAYS: 365, // Maximum retention period
21
- // Search limits
22
- DEFAULT_SEARCH_LIMIT: 100, // Default search result limit
23
- // YAML limits
24
- MAX_YAML_SIZE: 256 * 1024, // 256KB max YAML size for import
25
- // Privacy levels (ordered by access level)
26
- PRIVACY_LEVELS: ['public', 'private', 'sensitive'],
27
- DEFAULT_PRIVACY_LEVEL: 'private',
28
- // Storage backends
29
- DEFAULT_STORAGE_BACKEND: 'memory',
30
- SUPPORTED_STORAGE_BACKENDS: ['memory', 'file', 'indexed'],
31
- };
32
- // Security event types for memory operations
33
- export const MEMORY_SECURITY_EVENTS = {
34
- MEMORY_CREATED: 'MEMORY_CREATED',
35
- MEMORY_ADDED: 'MEMORY_ADDED',
36
- MEMORY_SEARCHED: 'MEMORY_SEARCHED',
37
- SENSITIVE_MEMORY_DELETED: 'SENSITIVE_MEMORY_DELETED',
38
- RETENTION_POLICY_ENFORCED: 'RETENTION_POLICY_ENFORCED',
39
- MEMORY_CLEARED: 'MEMORY_CLEARED',
40
- MEMORY_LOADED: 'MEMORY_LOADED',
41
- MEMORY_SAVED: 'MEMORY_SAVED',
42
- MEMORY_DELETED: 'MEMORY_DELETED',
43
- MEMORY_LOAD_FAILED: 'MEMORY_LOAD_FAILED',
44
- MEMORY_SAVE_FAILED: 'MEMORY_SAVE_FAILED',
45
- MEMORY_DESERIALIZE_FAILED: 'MEMORY_DESERIALIZE_FAILED',
46
- MEMORY_LIST_ITEM_FAILED: 'MEMORY_LIST_ITEM_FAILED',
47
- MEMORY_IMPORT_FAILED: 'MEMORY_IMPORT_FAILED',
48
- };
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL21lbW9yaWVzL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxxQkFBcUI7QUFDckIsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUc7SUFDOUIsY0FBYztJQUNkLGVBQWUsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFTLHdCQUF3QjtJQUM3RCxjQUFjLEVBQUUsR0FBRyxHQUFHLElBQUksRUFBVyxrQkFBa0I7SUFDdkQsbUJBQW1CLEVBQUUsSUFBSSxFQUFZLDRCQUE0QjtJQUVqRSxlQUFlO0lBQ2Ysa0JBQWtCLEVBQUUsRUFBRSxFQUFlLGdDQUFnQztJQUNyRSxjQUFjLEVBQUUsRUFBRSxFQUFtQiw2QkFBNkI7SUFDbEUsaUJBQWlCLEVBQUUsRUFBRSxFQUFnQixrQ0FBa0M7SUFDdkUsdUJBQXVCLEVBQUUsRUFBRSxFQUFVLDhCQUE4QjtJQUNuRSx5QkFBeUIsRUFBRSxHQUFHLEVBQU8sZ0NBQWdDO0lBRXJFLHFCQUFxQjtJQUNyQixzQkFBc0IsRUFBRSxFQUFFLEVBQVcsMkJBQTJCO0lBQ2hFLGtCQUFrQixFQUFFLENBQUMsRUFBZ0IsMkJBQTJCO0lBQ2hFLGtCQUFrQixFQUFFLEdBQUcsRUFBYywyQkFBMkI7SUFFaEUsZ0JBQWdCO0lBQ2hCLG9CQUFvQixFQUFFLEdBQUcsRUFBWSw4QkFBOEI7SUFFbkUsY0FBYztJQUNkLGFBQWEsRUFBRSxHQUFHLEdBQUcsSUFBSSxFQUFZLGlDQUFpQztJQUV0RSwyQ0FBMkM7SUFDM0MsY0FBYyxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQVU7SUFDM0QscUJBQXFCLEVBQUUsU0FBa0I7SUFFekMsbUJBQW1CO0lBQ25CLHVCQUF1QixFQUFFLFFBQWlCO0lBQzFDLDBCQUEwQixFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQVU7Q0FDMUQsQ0FBQztBQU1YLDZDQUE2QztBQUM3QyxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRztJQUNwQyxjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLFlBQVksRUFBRSxjQUFjO0lBQzVCLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsd0JBQXdCLEVBQUUsMEJBQTBCO0lBQ3BELHlCQUF5QixFQUFFLDJCQUEyQjtJQUN0RCxjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGFBQWEsRUFBRSxlQUFlO0lBQzlCLFlBQVksRUFBRSxjQUFjO0lBQzVCLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsa0JBQWtCLEVBQUUsb0JBQW9CO0lBQ3hDLGtCQUFrQixFQUFFLG9CQUFvQjtJQUN4Qyx5QkFBeUIsRUFBRSwyQkFBMkI7SUFDdEQsdUJBQXVCLEVBQUUseUJBQXlCO0lBQ2xELG9CQUFvQixFQUFFLHNCQUFzQjtDQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb25zdGFudHMgZm9yIE1lbW9yeSBlbGVtZW50IGltcGxlbWVudGF0aW9uXG4gKiBFeHRyYWN0ZWQgZm9yIHJldXNhYmlsaXR5IGFuZCBtYWludGFpbmFiaWxpdHlcbiAqL1xuXG4vLyBNZW1vcnkgc2l6ZSBsaW1pdHNcbmV4cG9ydCBjb25zdCBNRU1PUllfQ09OU1RBTlRTID0ge1xuICAvLyBTaXplIGxpbWl0c1xuICBNQVhfTUVNT1JZX1NJWkU6IDEwMjQgKiAxMDI0LCAgICAgICAgLy8gMU1CIHRvdGFsIG1lbW9yeSBzaXplXG4gIE1BWF9FTlRSWV9TSVpFOiAxMDAgKiAxMDI0LCAgICAgICAgICAvLyAxMDBLQiBwZXIgZW50cnlcbiAgTUFYX0VOVFJJRVNfREVGQVVMVDogMTAwMCwgICAgICAgICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGVudHJpZXNcbiAgXG4gIC8vIEVudHJ5IGxpbWl0c1xuICBNQVhfVEFHU19QRVJfRU5UUlk6IDIwLCAgICAgICAgICAgICAgLy8gTWF4aW11bSB0YWdzIHBlciBtZW1vcnkgZW50cnlcbiAgTUFYX1RBR19MRU5HVEg6IDUwLCAgICAgICAgICAgICAgICAgIC8vIE1heGltdW0gbGVuZ3RoIG9mIGVhY2ggdGFnXG4gIE1BWF9NRVRBREFUQV9LRVlTOiAyMCwgICAgICAgICAgICAgICAvLyBNYXhpbXVtIG1ldGFkYXRhIGtleXMgcGVyIGVudHJ5XG4gIE1BWF9NRVRBREFUQV9LRVlfTEVOR1RIOiA1MCwgICAgICAgICAvLyBNYXhpbXVtIG1ldGFkYXRhIGtleSBsZW5ndGhcbiAgTUFYX01FVEFEQVRBX1ZBTFVFX0xFTkdUSDogMjAwLCAgICAgIC8vIE1heGltdW0gbWV0YWRhdGEgdmFsdWUgbGVuZ3RoXG4gIFxuICAvLyBSZXRlbnRpb24gZGVmYXVsdHNcbiAgREVGQVVMVF9SRVRFTlRJT05fREFZUzogMzAsICAgICAgICAgIC8vIERlZmF1bHQgcmV0ZW50aW9uIHBlcmlvZFxuICBNSU5fUkVURU5USU9OX0RBWVM6IDEsICAgICAgICAgICAgICAgLy8gTWluaW11bSByZXRlbnRpb24gcGVyaW9kXG4gIE1BWF9SRVRFTlRJT05fREFZUzogMzY1LCAgICAgICAgICAgICAvLyBNYXhpbXVtIHJldGVudGlvbiBwZXJpb2RcbiAgXG4gIC8vIFNlYXJjaCBsaW1pdHNcbiAgREVGQVVMVF9TRUFSQ0hfTElNSVQ6IDEwMCwgICAgICAgICAgIC8vIERlZmF1bHQgc2VhcmNoIHJlc3VsdCBsaW1pdFxuICBcbiAgLy8gWUFNTCBsaW1pdHNcbiAgTUFYX1lBTUxfU0laRTogMjU2ICogMTAyNCwgICAgICAgICAgIC8vIDI1NktCIG1heCBZQU1MIHNpemUgZm9yIGltcG9ydFxuICBcbiAgLy8gUHJpdmFjeSBsZXZlbHMgKG9yZGVyZWQgYnkgYWNjZXNzIGxldmVsKVxuICBQUklWQUNZX0xFVkVMUzogWydwdWJsaWMnLCAncHJpdmF0ZScsICdzZW5zaXRpdmUnXSBhcyBjb25zdCxcbiAgREVGQVVMVF9QUklWQUNZX0xFVkVMOiAncHJpdmF0ZScgYXMgY29uc3QsXG4gIFxuICAvLyBTdG9yYWdlIGJhY2tlbmRzXG4gIERFRkFVTFRfU1RPUkFHRV9CQUNLRU5EOiAnbWVtb3J5JyBhcyBjb25zdCxcbiAgU1VQUE9SVEVEX1NUT1JBR0VfQkFDS0VORFM6IFsnbWVtb3J5JywgJ2ZpbGUnLCAnaW5kZXhlZCddIGFzIGNvbnN0LFxufSBhcyBjb25zdDtcblxuLy8gVHlwZSBleHBvcnRzIGZvciBwcml2YWN5IGxldmVscyBhbmQgc3RvcmFnZSBiYWNrZW5kc1xuZXhwb3J0IHR5cGUgUHJpdmFjeUxldmVsID0gdHlwZW9mIE1FTU9SWV9DT05TVEFOVFMuUFJJVkFDWV9MRVZFTFNbbnVtYmVyXTtcbmV4cG9ydCB0eXBlIFN0b3JhZ2VCYWNrZW5kID0gdHlwZW9mIE1FTU9SWV9DT05TVEFOVFMuU1VQUE9SVEVEX1NUT1JBR0VfQkFDS0VORFNbbnVtYmVyXTtcblxuLy8gU2VjdXJpdHkgZXZlbnQgdHlwZXMgZm9yIG1lbW9yeSBvcGVyYXRpb25zXG5leHBvcnQgY29uc3QgTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUyA9IHtcbiAgTUVNT1JZX0NSRUFURUQ6ICdNRU1PUllfQ1JFQVRFRCcsXG4gIE1FTU9SWV9BRERFRDogJ01FTU9SWV9BRERFRCcsXG4gIE1FTU9SWV9TRUFSQ0hFRDogJ01FTU9SWV9TRUFSQ0hFRCcsXG4gIFNFTlNJVElWRV9NRU1PUllfREVMRVRFRDogJ1NFTlNJVElWRV9NRU1PUllfREVMRVRFRCcsXG4gIFJFVEVOVElPTl9QT0xJQ1lfRU5GT1JDRUQ6ICdSRVRFTlRJT05fUE9MSUNZX0VORk9SQ0VEJyxcbiAgTUVNT1JZX0NMRUFSRUQ6ICdNRU1PUllfQ0xFQVJFRCcsXG4gIE1FTU9SWV9MT0FERUQ6ICdNRU1PUllfTE9BREVEJyxcbiAgTUVNT1JZX1NBVkVEOiAnTUVNT1JZX1NBVkVEJyxcbiAgTUVNT1JZX0RFTEVURUQ6ICdNRU1PUllfREVMRVRFRCcsXG4gIE1FTU9SWV9MT0FEX0ZBSUxFRDogJ01FTU9SWV9MT0FEX0ZBSUxFRCcsXG4gIE1FTU9SWV9TQVZFX0ZBSUxFRDogJ01FTU9SWV9TQVZFX0ZBSUxFRCcsXG4gIE1FTU9SWV9ERVNFUklBTElaRV9GQUlMRUQ6ICdNRU1PUllfREVTRVJJQUxJWkVfRkFJTEVEJyxcbiAgTUVNT1JZX0xJU1RfSVRFTV9GQUlMRUQ6ICdNRU1PUllfTElTVF9JVEVNX0ZBSUxFRCcsXG4gIE1FTU9SWV9JTVBPUlRfRkFJTEVEOiAnTUVNT1JZX0lNUE9SVF9GQUlMRUQnLFxufSBhcyBjb25zdDsiXX0=
@@ -1,6 +0,0 @@
1
- /**
2
- * Memory element exports
3
- */
4
- export { Memory, MemoryMetadata, MemoryEntry, MemorySearchOptions } from './Memory.js';
5
- export { MemoryManager } from './MemoryManager.js';
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/memories/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Memory element exports
3
- */
4
- export { Memory } from './Memory.js';
5
- export { MemoryManager } from './MemoryManager.js';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvbWVtb3JpZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFvRCxNQUFNLGFBQWEsQ0FBQztBQUN2RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1lbW9yeSBlbGVtZW50IGV4cG9ydHNcbiAqL1xuXG5leHBvcnQgeyBNZW1vcnksIE1lbW9yeU1ldGFkYXRhLCBNZW1vcnlFbnRyeSwgTWVtb3J5U2VhcmNoT3B0aW9ucyB9IGZyb20gJy4vTWVtb3J5LmpzJztcbmV4cG9ydCB7IE1lbW9yeU1hbmFnZXIgfSBmcm9tICcuL01lbW9yeU1hbmFnZXIuanMnOyJdfQ==