@dollhousemcp/mcp-server 1.5.2 → 1.6.0
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.
- package/CHANGELOG.md +56 -0
- package/README.md +494 -111
- package/data/agents/code-reviewer.md +8 -1
- package/data/agents/research-assistant.md +8 -1
- package/data/agents/task-manager.md +8 -1
- package/data/ensembles/business-advisor.md +8 -1
- package/data/ensembles/creative-studio.md +8 -1
- package/data/ensembles/development-team.md +8 -1
- package/data/ensembles/security-analysis-team.md +8 -1
- package/data/memories/conversation-history.md +8 -1
- package/data/memories/learning-progress.md +8 -1
- package/data/memories/project-context.md +8 -1
- package/data/personas/business-consultant.md +8 -1
- package/data/personas/creative-writer.md +8 -1
- package/data/personas/debug-detective.md +8 -1
- package/data/personas/eli5-explainer.md +8 -1
- package/data/personas/security-analyst.md +8 -1
- package/data/personas/technical-analyst.md +8 -1
- package/data/skills/code-review.md +8 -1
- package/data/skills/creative-writing.md +8 -1
- package/data/skills/data-analysis.md +8 -1
- package/data/skills/penetration-testing.md +8 -1
- package/data/skills/research.md +8 -1
- package/data/skills/threat-modeling.md +8 -1
- package/data/skills/translation.md +8 -1
- package/data/templates/code-documentation.md +8 -1
- package/data/templates/email-professional.md +8 -1
- package/data/templates/meeting-notes.md +8 -1
- package/data/templates/penetration-test-report.md +8 -1
- package/data/templates/project-brief.md +8 -1
- package/data/templates/report-executive.md +8 -1
- package/data/templates/security-vulnerability-report.md +8 -1
- package/data/templates/threat-assessment-report.md +8 -1
- package/dist/auth/GitHubAuthManager.d.ts +6 -1
- package/dist/auth/GitHubAuthManager.d.ts.map +1 -1
- package/dist/auth/GitHubAuthManager.js +45 -18
- package/dist/benchmarks/IndexPerformanceBenchmark.d.ts +98 -0
- package/dist/benchmarks/IndexPerformanceBenchmark.d.ts.map +1 -0
- package/dist/benchmarks/IndexPerformanceBenchmark.js +531 -0
- package/dist/cache/CollectionCache.d.ts.map +1 -1
- package/dist/cache/CollectionCache.js +13 -3
- package/dist/cache/CollectionIndexCache.d.ts +77 -0
- package/dist/cache/CollectionIndexCache.d.ts.map +1 -0
- package/dist/cache/CollectionIndexCache.js +349 -0
- package/dist/cache/LRUCache.d.ts +93 -0
- package/dist/cache/LRUCache.d.ts.map +1 -0
- package/dist/cache/LRUCache.js +299 -0
- package/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +2 -1
- package/dist/collection/CollectionBrowser.d.ts +21 -1
- package/dist/collection/CollectionBrowser.d.ts.map +1 -1
- package/dist/collection/CollectionBrowser.js +130 -10
- package/dist/collection/CollectionIndexManager.d.ts +151 -0
- package/dist/collection/CollectionIndexManager.d.ts.map +1 -0
- package/dist/collection/CollectionIndexManager.js +499 -0
- package/dist/collection/CollectionSearch.d.ts +55 -0
- package/dist/collection/CollectionSearch.d.ts.map +1 -1
- package/dist/collection/CollectionSearch.js +338 -13
- package/dist/collection/CollectionSeeder.d.ts.map +1 -1
- package/dist/collection/CollectionSeeder.js +38 -1
- package/dist/collection/ElementInstaller.d.ts +31 -0
- package/dist/collection/ElementInstaller.d.ts.map +1 -1
- package/dist/collection/ElementInstaller.js +77 -15
- package/dist/collection/PersonaSubmitter.d.ts +1 -1
- package/dist/collection/PersonaSubmitter.d.ts.map +1 -1
- package/dist/collection/PersonaSubmitter.js +2 -2
- package/dist/collection/index.d.ts +1 -0
- package/dist/collection/index.d.ts.map +1 -1
- package/dist/collection/index.js +2 -1
- package/dist/config/ConfigManager.d.ts +78 -0
- package/dist/config/ConfigManager.d.ts.map +1 -0
- package/dist/config/ConfigManager.js +216 -0
- package/dist/config/element-types.d.ts +135 -0
- package/dist/config/element-types.d.ts.map +1 -0
- package/dist/config/element-types.js +108 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +3 -1
- package/dist/config/portfolio-constants.d.ts +83 -0
- package/dist/config/portfolio-constants.d.ts.map +1 -0
- package/dist/config/portfolio-constants.js +99 -0
- package/dist/elements/BaseElement.d.ts +14 -2
- package/dist/elements/BaseElement.d.ts.map +1 -1
- package/dist/elements/BaseElement.js +88 -6
- package/dist/elements/agents/Agent.d.ts +10 -1
- package/dist/elements/agents/Agent.d.ts.map +1 -1
- package/dist/elements/agents/Agent.js +66 -19
- package/dist/elements/agents/AgentManager.d.ts +2 -0
- package/dist/elements/agents/AgentManager.d.ts.map +1 -1
- package/dist/elements/agents/AgentManager.js +12 -10
- package/dist/elements/skills/Skill.d.ts +10 -1
- package/dist/elements/skills/Skill.d.ts.map +1 -1
- package/dist/elements/skills/Skill.js +40 -3
- package/dist/elements/skills/SkillManager.d.ts +1 -0
- package/dist/elements/skills/SkillManager.d.ts.map +1 -1
- package/dist/elements/skills/SkillManager.js +10 -4
- package/dist/elements/templates/Template.d.ts +10 -1
- package/dist/elements/templates/Template.d.ts.map +1 -1
- package/dist/elements/templates/Template.js +35 -18
- package/dist/elements/templates/TemplateManager.d.ts +1 -1
- package/dist/elements/templates/TemplateManager.d.ts.map +1 -1
- package/dist/elements/templates/TemplateManager.js +6 -5
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/index.barrel.d.ts +1 -2
- package/dist/index.barrel.d.ts.map +1 -1
- package/dist/index.barrel.js +2 -4
- package/dist/index.d.ts +143 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1883 -310
- package/dist/persona/PersonaElement.d.ts +10 -0
- package/dist/persona/PersonaElement.d.ts.map +1 -1
- package/dist/persona/PersonaElement.js +55 -32
- package/dist/persona/PersonaElementManager.d.ts.map +1 -1
- package/dist/persona/PersonaElementManager.js +13 -11
- package/dist/persona/PersonaLoader.d.ts.map +1 -1
- package/dist/persona/PersonaLoader.js +8 -2
- package/dist/persona/export-import/PersonaImporter.d.ts.map +1 -1
- package/dist/persona/export-import/PersonaImporter.js +24 -5
- package/dist/persona/export-import/PersonaSharer.d.ts +21 -0
- package/dist/persona/export-import/PersonaSharer.d.ts.map +1 -1
- package/dist/persona/export-import/PersonaSharer.js +198 -22
- package/dist/portfolio/DefaultElementProvider.d.ts +90 -0
- package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
- package/dist/portfolio/DefaultElementProvider.js +499 -7
- package/dist/portfolio/GitHubPortfolioIndexer.d.ts +129 -0
- package/dist/portfolio/GitHubPortfolioIndexer.d.ts.map +1 -0
- package/dist/portfolio/GitHubPortfolioIndexer.js +475 -0
- package/dist/portfolio/MigrationManager.d.ts.map +1 -1
- package/dist/portfolio/MigrationManager.js +136 -3
- package/dist/portfolio/PortfolioIndexManager.d.ts +130 -0
- package/dist/portfolio/PortfolioIndexManager.d.ts.map +1 -0
- package/dist/portfolio/PortfolioIndexManager.js +478 -0
- package/dist/portfolio/PortfolioManager.d.ts +5 -0
- package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
- package/dist/portfolio/PortfolioManager.js +61 -20
- package/dist/portfolio/PortfolioRepoManager.d.ts +75 -0
- package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -0
- package/dist/portfolio/PortfolioRepoManager.js +337 -0
- package/dist/portfolio/UnifiedIndexManager.d.ts +388 -0
- package/dist/portfolio/UnifiedIndexManager.d.ts.map +1 -0
- package/dist/portfolio/UnifiedIndexManager.js +1434 -0
- package/dist/portfolio/index.d.ts +15 -0
- package/dist/portfolio/index.d.ts.map +1 -0
- package/dist/portfolio/index.js +15 -0
- package/dist/portfolio/types.d.ts +7 -0
- package/dist/portfolio/types.d.ts.map +1 -1
- package/dist/portfolio/types.js +6 -1
- package/dist/security/InputValidator.d.ts.map +1 -1
- package/dist/security/InputValidator.js +50 -48
- package/dist/security/audit/SecurityAuditor.d.ts.map +1 -1
- package/dist/security/audit/SecurityAuditor.js +17 -9
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +19 -3
- package/dist/security/contentValidator.d.ts +2 -0
- package/dist/security/contentValidator.d.ts.map +1 -1
- package/dist/security/contentValidator.js +115 -4
- package/dist/security/secureYamlParser.d.ts +1 -0
- package/dist/security/secureYamlParser.d.ts.map +1 -1
- package/dist/security/secureYamlParser.js +29 -7
- package/dist/security/securityMonitor.d.ts +1 -1
- package/dist/security/securityMonitor.d.ts.map +1 -1
- package/dist/security/securityMonitor.js +1 -1
- package/dist/security/tokenManager.d.ts +1 -1
- package/dist/security/tokenManager.d.ts.map +1 -1
- package/dist/security/tokenManager.js +30 -10
- package/dist/server/ServerSetup.d.ts +22 -2
- package/dist/server/ServerSetup.d.ts.map +1 -1
- package/dist/server/ServerSetup.js +77 -12
- package/dist/server/tools/AuthTools.d.ts.map +1 -1
- package/dist/server/tools/AuthTools.js +33 -1
- package/dist/server/tools/BuildInfoTools.d.ts +25 -0
- package/dist/server/tools/BuildInfoTools.d.ts.map +1 -0
- package/dist/server/tools/BuildInfoTools.js +36 -0
- package/dist/server/tools/CollectionTools.d.ts.map +1 -1
- package/dist/server/tools/CollectionTools.js +55 -46
- package/dist/server/tools/ConfigTools.d.ts.map +1 -1
- package/dist/server/tools/ConfigTools.js +29 -1
- package/dist/server/tools/PersonaTools.d.ts +4 -2
- package/dist/server/tools/PersonaTools.d.ts.map +1 -1
- package/dist/server/tools/PersonaTools.js +5 -152
- package/dist/server/tools/PortfolioTools.d.ts +12 -0
- package/dist/server/tools/PortfolioTools.d.ts.map +1 -0
- package/dist/server/tools/PortfolioTools.js +221 -0
- package/dist/server/tools/index.d.ts +3 -1
- package/dist/server/tools/index.d.ts.map +1 -1
- package/dist/server/tools/index.js +4 -2
- package/dist/server/types.d.ts +40 -5
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +1 -1
- package/dist/services/BuildInfoService.d.ts +84 -0
- package/dist/services/BuildInfoService.d.ts.map +1 -0
- package/dist/services/BuildInfoService.js +271 -0
- package/dist/tools/portfolio/PortfolioElementAdapter.d.ts +54 -0
- package/dist/tools/portfolio/PortfolioElementAdapter.d.ts.map +1 -0
- package/dist/tools/portfolio/PortfolioElementAdapter.js +229 -0
- package/dist/tools/portfolio/submitToPortfolioTool.d.ts +164 -0
- package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -0
- package/dist/tools/portfolio/submitToPortfolioTool.js +1523 -0
- package/dist/tools/portfolio/types.d.ts +41 -0
- package/dist/tools/portfolio/types.d.ts.map +1 -0
- package/dist/tools/portfolio/types.js +15 -0
- package/dist/types/collection.d.ts +51 -0
- package/dist/types/collection.d.ts.map +1 -1
- package/dist/types/collection.js +1 -1
- package/dist/utils/EarlyTerminationSearch.d.ts +41 -0
- package/dist/utils/EarlyTerminationSearch.d.ts.map +1 -0
- package/dist/utils/EarlyTerminationSearch.js +164 -0
- package/dist/utils/ErrorHandler.d.ts +86 -0
- package/dist/utils/ErrorHandler.d.ts.map +1 -0
- package/dist/utils/ErrorHandler.js +201 -0
- package/dist/utils/FileDiscoveryUtil.d.ts +53 -0
- package/dist/utils/FileDiscoveryUtil.d.ts.map +1 -0
- package/dist/utils/FileDiscoveryUtil.js +169 -0
- package/dist/utils/GitHubRateLimiter.d.ts +88 -0
- package/dist/utils/GitHubRateLimiter.d.ts.map +1 -0
- package/dist/utils/GitHubRateLimiter.js +315 -0
- package/dist/utils/PerformanceMonitor.d.ts +134 -0
- package/dist/utils/PerformanceMonitor.d.ts.map +1 -0
- package/dist/utils/PerformanceMonitor.js +347 -0
- package/dist/utils/RateLimiter.d.ts.map +1 -0
- package/dist/utils/RateLimiter.js +172 -0
- package/dist/utils/SecureDownloader.d.ts +241 -0
- package/dist/utils/SecureDownloader.d.ts.map +1 -0
- package/dist/utils/SecureDownloader.js +759 -0
- package/dist/utils/ToolCache.d.ts +82 -0
- package/dist/utils/ToolCache.d.ts.map +1 -0
- package/dist/utils/ToolCache.js +196 -0
- package/dist/utils/errorCodes.d.ts +136 -0
- package/dist/utils/errorCodes.d.ts.map +1 -0
- package/dist/utils/errorCodes.js +87 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -1
- package/dist/utils/installation.d.ts +1 -1
- package/dist/utils/installation.d.ts.map +1 -1
- package/dist/utils/installation.js +9 -8
- package/dist/utils/searchUtils.d.ts +31 -0
- package/dist/utils/searchUtils.d.ts.map +1 -1
- package/dist/utils/searchUtils.js +62 -1
- package/package.json +17 -7
- package/dist/config/updateConfig.d.ts +0 -84
- package/dist/config/updateConfig.d.ts.map +0 -1
- package/dist/config/updateConfig.js +0 -148
- package/dist/server/tools/UpdateTools.d.ts +0 -10
- package/dist/server/tools/UpdateTools.d.ts.map +0 -1
- package/dist/server/tools/UpdateTools.js +0 -85
- package/dist/update/BackupManager.d.ts +0 -63
- package/dist/update/BackupManager.d.ts.map +0 -1
- package/dist/update/BackupManager.js +0 -370
- package/dist/update/DependencyChecker.d.ts +0 -41
- package/dist/update/DependencyChecker.d.ts.map +0 -1
- package/dist/update/DependencyChecker.js +0 -132
- package/dist/update/RateLimiter.d.ts.map +0 -1
- package/dist/update/RateLimiter.js +0 -172
- package/dist/update/SignatureVerifier.d.ts +0 -71
- package/dist/update/SignatureVerifier.d.ts.map +0 -1
- package/dist/update/SignatureVerifier.js +0 -214
- package/dist/update/UpdateChecker.d.ts +0 -132
- package/dist/update/UpdateChecker.d.ts.map +0 -1
- package/dist/update/UpdateChecker.js +0 -506
- package/dist/update/UpdateManager.d.ts +0 -60
- package/dist/update/UpdateManager.d.ts.map +0 -1
- package/dist/update/UpdateManager.js +0 -730
- package/dist/update/VersionManager.d.ts +0 -31
- package/dist/update/VersionManager.d.ts.map +0 -1
- package/dist/update/VersionManager.js +0 -181
- package/dist/update/index.d.ts +0 -9
- package/dist/update/index.d.ts.map +0 -1
- package/dist/update/index.js +0 -9
- /package/dist/{update → utils}/RateLimiter.d.ts +0 -0
|
@@ -15,6 +15,8 @@ import { sanitizeInput } from '../../security/InputValidator.js';
|
|
|
15
15
|
import { UnicodeValidator } from '../../security/validators/unicodeValidator.js';
|
|
16
16
|
import { SecurityMonitor } from '../../security/securityMonitor.js';
|
|
17
17
|
import { logger } from '../../utils/logger.js';
|
|
18
|
+
import { ErrorHandler, ErrorCategory } from '../../utils/ErrorHandler.js';
|
|
19
|
+
import { ValidationErrorCodes, SystemErrorCodes } from '../../utils/errorCodes.js';
|
|
18
20
|
import { AGENT_LIMITS, AGENT_DEFAULTS, DECISION_FRAMEWORKS, RISK_TOLERANCE_LEVELS } from './constants.js';
|
|
19
21
|
import { validateRuleEngineConfig } from './ruleEngineConfig.js';
|
|
20
22
|
import { applyGoalTemplate, recommendGoalTemplate, validateGoalAgainstTemplate } from './goalTemplates.js';
|
|
@@ -38,20 +40,20 @@ export class Agent extends BaseElement {
|
|
|
38
40
|
// Ensures only supported frameworks are used
|
|
39
41
|
if (sanitizedMetadata.decisionFramework &&
|
|
40
42
|
!DECISION_FRAMEWORKS.includes(sanitizedMetadata.decisionFramework)) {
|
|
41
|
-
throw
|
|
42
|
-
`Supported frameworks: ${DECISION_FRAMEWORKS.join(', ')}
|
|
43
|
+
throw ErrorHandler.createError(`Invalid decision framework: ${sanitizedMetadata.decisionFramework}. ` +
|
|
44
|
+
`Supported frameworks: ${DECISION_FRAMEWORKS.join(', ')}`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_FRAMEWORK);
|
|
43
45
|
}
|
|
44
46
|
// Validate risk tolerance level
|
|
45
47
|
if (sanitizedMetadata.riskTolerance &&
|
|
46
48
|
!RISK_TOLERANCE_LEVELS.includes(sanitizedMetadata.riskTolerance)) {
|
|
47
|
-
throw
|
|
48
|
-
`Supported levels: ${RISK_TOLERANCE_LEVELS.join(', ')}
|
|
49
|
+
throw ErrorHandler.createError(`Invalid risk tolerance: ${sanitizedMetadata.riskTolerance}. ` +
|
|
50
|
+
`Supported levels: ${RISK_TOLERANCE_LEVELS.join(', ')}`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_RISK_TOLERANCE);
|
|
49
51
|
}
|
|
50
52
|
// Validate max concurrent goals
|
|
51
53
|
if (sanitizedMetadata.maxConcurrentGoals !== undefined) {
|
|
52
54
|
const maxGoals = sanitizedMetadata.maxConcurrentGoals;
|
|
53
55
|
if (!Number.isInteger(maxGoals) || maxGoals < 1 || maxGoals > AGENT_LIMITS.MAX_GOALS) {
|
|
54
|
-
throw
|
|
56
|
+
throw ErrorHandler.createError(`maxConcurrentGoals must be between 1 and ${AGENT_LIMITS.MAX_GOALS}`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_RANGE);
|
|
55
57
|
}
|
|
56
58
|
}
|
|
57
59
|
super(ElementType.AGENT, sanitizedMetadata);
|
|
@@ -80,12 +82,12 @@ export class Agent extends BaseElement {
|
|
|
80
82
|
addGoal(goal) {
|
|
81
83
|
// Validate goal count
|
|
82
84
|
if (this.state.goals.length >= AGENT_LIMITS.MAX_GOALS) {
|
|
83
|
-
throw
|
|
85
|
+
throw ErrorHandler.createError(`Maximum number of goals (${AGENT_LIMITS.MAX_GOALS}) reached`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.MAX_GOALS_EXCEEDED);
|
|
84
86
|
}
|
|
85
87
|
// Sanitize goal description
|
|
86
88
|
const sanitizedDescription = sanitizeInput(UnicodeValidator.normalize(goal.description || '').normalizedContent, AGENT_LIMITS.MAX_GOAL_LENGTH);
|
|
87
89
|
if (!sanitizedDescription || sanitizedDescription.length < 3) {
|
|
88
|
-
throw
|
|
90
|
+
throw ErrorHandler.createError('Goal description must be at least 3 characters', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.GOAL_TOO_SHORT);
|
|
89
91
|
}
|
|
90
92
|
// Validate goal for security threats
|
|
91
93
|
const securityCheck = this.validateGoalSecurity(sanitizedDescription);
|
|
@@ -97,7 +99,7 @@ export class Agent extends BaseElement {
|
|
|
97
99
|
details: `Potentially malicious goal rejected: ${securityCheck.reason}`,
|
|
98
100
|
additionalData: { agentId: this.id }
|
|
99
101
|
});
|
|
100
|
-
throw
|
|
102
|
+
throw ErrorHandler.createError(`Goal contains potentially harmful content: ${securityCheck.reason}`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.HARMFUL_CONTENT);
|
|
101
103
|
}
|
|
102
104
|
// Calculate Eisenhower quadrant
|
|
103
105
|
const importance = goal.importance || 5;
|
|
@@ -123,7 +125,7 @@ export class Agent extends BaseElement {
|
|
|
123
125
|
if (newGoal.dependencies && newGoal.dependencies.length > 0) {
|
|
124
126
|
const cycleCheck = this.detectDependencyCycle(newGoal.id, newGoal.dependencies);
|
|
125
127
|
if (cycleCheck.hasCycle) {
|
|
126
|
-
throw
|
|
128
|
+
throw ErrorHandler.createError(`Dependency cycle detected: ${cycleCheck.path.join(' → ')}`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.DEPENDENCY_CYCLE);
|
|
127
129
|
}
|
|
128
130
|
}
|
|
129
131
|
this.state.goals.push(newGoal);
|
|
@@ -141,10 +143,10 @@ export class Agent extends BaseElement {
|
|
|
141
143
|
const performanceMetrics = {};
|
|
142
144
|
const goal = this.state.goals.find(g => g.id === goalId);
|
|
143
145
|
if (!goal) {
|
|
144
|
-
throw
|
|
146
|
+
throw ErrorHandler.createError(`Goal ${goalId} not found`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.GOAL_NOT_FOUND);
|
|
145
147
|
}
|
|
146
148
|
if (goal.status === 'completed' || goal.status === 'cancelled') {
|
|
147
|
-
throw
|
|
149
|
+
throw ErrorHandler.createError(`Cannot make decision for ${goal.status} goal`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_GOAL_STATUS);
|
|
148
150
|
}
|
|
149
151
|
// Update goal status
|
|
150
152
|
goal.status = 'in_progress';
|
|
@@ -228,7 +230,7 @@ export class Agent extends BaseElement {
|
|
|
228
230
|
confidence: (ruleDecision.confidence + progDecision.confidence) / 2
|
|
229
231
|
};
|
|
230
232
|
default:
|
|
231
|
-
throw
|
|
233
|
+
throw ErrorHandler.createError(`Unknown decision framework: ${framework}`, ErrorCategory.SYSTEM_ERROR, SystemErrorCodes.UNKNOWN_FRAMEWORK);
|
|
232
234
|
}
|
|
233
235
|
}
|
|
234
236
|
/**
|
|
@@ -493,7 +495,7 @@ export class Agent extends BaseElement {
|
|
|
493
495
|
// Validate context size
|
|
494
496
|
const contextStr = JSON.stringify({ ...this.state.context, [sanitizedKey]: value });
|
|
495
497
|
if (contextStr.length > AGENT_LIMITS.MAX_CONTEXT_LENGTH) {
|
|
496
|
-
throw
|
|
498
|
+
throw ErrorHandler.createError(`Context size exceeds maximum of ${AGENT_LIMITS.MAX_CONTEXT_LENGTH} characters`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.CONTEXT_TOO_LARGE);
|
|
497
499
|
}
|
|
498
500
|
this.state.context[sanitizedKey] = value;
|
|
499
501
|
this.isDirtyState = true;
|
|
@@ -505,7 +507,7 @@ export class Agent extends BaseElement {
|
|
|
505
507
|
completeGoal(goalId, outcome = 'success') {
|
|
506
508
|
const goal = this.state.goals.find(g => g.id === goalId);
|
|
507
509
|
if (!goal) {
|
|
508
|
-
throw
|
|
510
|
+
throw ErrorHandler.createError(`Goal ${goalId} not found`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.GOAL_NOT_FOUND);
|
|
509
511
|
}
|
|
510
512
|
goal.status = outcome === 'success' ? 'completed' : 'failed';
|
|
511
513
|
goal.completedAt = new Date();
|
|
@@ -704,15 +706,60 @@ export class Agent extends BaseElement {
|
|
|
704
706
|
};
|
|
705
707
|
}
|
|
706
708
|
/**
|
|
707
|
-
* Serialize
|
|
709
|
+
* Serialize to JSON format for internal use and testing
|
|
708
710
|
*/
|
|
709
|
-
|
|
711
|
+
serializeToJSON() {
|
|
710
712
|
const data = {
|
|
711
|
-
...JSON.parse(super.
|
|
713
|
+
...JSON.parse(super.serializeToJSON()),
|
|
712
714
|
state: this.state
|
|
713
715
|
};
|
|
714
716
|
return JSON.stringify(data, null, 2);
|
|
715
717
|
}
|
|
718
|
+
/**
|
|
719
|
+
* Get content for serialization
|
|
720
|
+
*/
|
|
721
|
+
getContent() {
|
|
722
|
+
let content = `# ${this.metadata.name}\n\n`;
|
|
723
|
+
content += `${this.metadata.description}\n\n`;
|
|
724
|
+
if (this.state.goals.length > 0) {
|
|
725
|
+
content += `## Current Goals\n\n`;
|
|
726
|
+
this.state.goals.forEach(goal => {
|
|
727
|
+
content += `### ${goal.description}\n`;
|
|
728
|
+
content += `- **Priority**: ${goal.priority}\n`;
|
|
729
|
+
content += `- **Status**: ${goal.status}\n`;
|
|
730
|
+
// Progress tracking could be added in future
|
|
731
|
+
// if (goal.progress !== undefined) {
|
|
732
|
+
// content += `- **Progress**: ${goal.progress}%\n`;
|
|
733
|
+
// }
|
|
734
|
+
content += '\n';
|
|
735
|
+
});
|
|
736
|
+
}
|
|
737
|
+
if (this.state.context && Object.keys(this.state.context).length > 0) {
|
|
738
|
+
content += `## Context\n\n`;
|
|
739
|
+
for (const [key, value] of Object.entries(this.state.context)) {
|
|
740
|
+
content += `- **${key}**: ${JSON.stringify(value)}\n`;
|
|
741
|
+
}
|
|
742
|
+
content += '\n';
|
|
743
|
+
}
|
|
744
|
+
return content;
|
|
745
|
+
}
|
|
746
|
+
/**
|
|
747
|
+
* Serialize agent to markdown format with YAML frontmatter
|
|
748
|
+
* FIX: Changed from JSON to markdown for GitHub portfolio compatibility
|
|
749
|
+
*/
|
|
750
|
+
serialize() {
|
|
751
|
+
// Add agent state to extensions for frontmatter
|
|
752
|
+
const originalExtensions = this.extensions;
|
|
753
|
+
this.extensions = {
|
|
754
|
+
...originalExtensions,
|
|
755
|
+
state: this.state
|
|
756
|
+
};
|
|
757
|
+
// Use base class serialize which now outputs markdown
|
|
758
|
+
const result = super.serialize();
|
|
759
|
+
// Restore original extensions
|
|
760
|
+
this.extensions = originalExtensions;
|
|
761
|
+
return result;
|
|
762
|
+
}
|
|
716
763
|
/**
|
|
717
764
|
* Deserialize agent including state
|
|
718
765
|
*/
|
|
@@ -734,7 +781,7 @@ export class Agent extends BaseElement {
|
|
|
734
781
|
// Validate state size
|
|
735
782
|
const stateStr = JSON.stringify(parsed.state);
|
|
736
783
|
if (stateStr.length > AGENT_LIMITS.MAX_STATE_SIZE) {
|
|
737
|
-
throw
|
|
784
|
+
throw ErrorHandler.createError(`State size exceeds maximum of ${AGENT_LIMITS.MAX_STATE_SIZE} bytes`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.STATE_TOO_LARGE);
|
|
738
785
|
}
|
|
739
786
|
// Restore dates
|
|
740
787
|
if (parsed.state.goals) {
|
|
@@ -845,4 +892,4 @@ export class Agent extends BaseElement {
|
|
|
845
892
|
return { ...this.ruleEngineConfig };
|
|
846
893
|
}
|
|
847
894
|
}
|
|
848
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvYWdlbnRzL0FnZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBTy9DLE9BQU8sRUFDTCxZQUFZLEVBQ1osY0FBYyxFQUNkLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDdEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBR0wsd0JBQXdCLEVBQ3pCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsMkJBQTJCLEVBQzVCLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsTUFBTSxPQUFPLEtBQU0sU0FBUSxXQUFXO0lBQzVCLEtBQUssQ0FBYTtJQUNsQixZQUFZLEdBQVksS0FBSyxDQUFDO0lBQzlCLGdCQUFnQixDQUFtQjtJQUUzQyxZQUFZLFFBQWdDO1FBQzFDLHNCQUFzQjtRQUN0QixNQUFNLGlCQUFpQixHQUEyQjtZQUNoRCxHQUFHLFFBQVE7WUFDWCxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNB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Z0JBQWdCLEdBQUcsd0JBQXdCLENBQUM7WUFDL0MsR0FBRyxJQUFJLENBQUMsZ0JBQWdCO1lBQ3hCLEdBQUcsTUFBTTtTQUNWLENBQUMsQ0FBQztRQUVILG9CQUFvQjtRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ2hCLEdBQUcsSUFBSSxDQUFDLFVBQVU7WUFDbEIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtTQUN4QyxDQUFDO1FBRUYsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRDs7T0FFRztJQUNJLG1CQUFtQjtRQUN4QixPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFnZW50IGVsZW1lbnQgaW1wbGVtZW50YXRpb24uXG4gKiBBdXRvbm9tb3VzIGdvYWwtb3JpZW50ZWQgYWN0b3JzIHdpdGggZGVjaXNpb24tbWFraW5nIGNhcGFiaWxpdGllcy5cbiAqIFxuICogU0VDVVJJVFkgTUVBU1VSRVMgSU1QTEVNRU5URUQ6XG4gKiAxLiBHb2FsIHZhbGlkYXRpb24gdG8gcHJldmVudCBtYWxpY2lvdXMgb2JqZWN0aXZlc1xuICogMi4gRGVjaXNpb24gZnJhbWV3b3JrIHNhbmRib3hpbmdcbiAqIDMuIFN0YXRlIHNpemUgbGltaXRzIHRvIHByZXZlbnQgRG9TXG4gKiA0LiBSaXNrIGFzc2Vzc21lbnQgZm9yIGRhbWFnZSBwcmV2ZW50aW9uXG4gKiA1LiBBdWRpdCBsb2dnaW5nIGZvciBhbGwgZGVjaXNpb25zIGFuZCBhY3Rpb25zXG4gKi9cblxuaW1wb3J0IHsgQmFzZUVsZW1lbnQgfSBmcm9tICcuLi9CYXNlRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBJRWxlbWVudCwgRWxlbWVudFZhbGlkYXRpb25SZXN1bHQsIFZhbGlkYXRpb25FcnJvciwgVmFsaWRhdGlvbldhcm5pbmcsIEVsZW1lbnRTdGF0dXMgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9pbmRleC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBzYW5pdGl6ZUlucHV0IH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFxuICBBZ2VudEdvYWwsIFxuICBBZ2VudERlY2lzaW9uLCBcbiAgQWdlbnRTdGF0ZSwgXG4gIEFnZW50TWV0YWRhdGEgXG59IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgXG4gIEFHRU5UX0xJTUlUUywgXG4gIEFHRU5UX0RFRkFVTFRTLFxuICBERUNJU0lPTl9GUkFNRVdPUktTLFxuICBSSVNLX1RPTEVSQU5DRV9MRVZFTFNcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgXG4gIFJ1bGVFbmdpbmVDb25maWcsIFxuICBERUZBVUxUX1JVTEVfRU5HSU5FX0NPTkZJRywgXG4gIHZhbGlkYXRlUnVsZUVuZ2luZUNvbmZpZyBcbn0gZnJvbSAnLi9ydWxlRW5naW5lQ29uZmlnLmpzJztcbmltcG9ydCB7IFxuICBhcHBseUdvYWxUZW1wbGF0ZSwgXG4gIHJlY29tbWVuZEdvYWxUZW1wbGF0ZSwgXG4gIHZhbGlkYXRlR29hbEFnYWluc3RUZW1wbGF0ZSBcbn0gZnJvbSAnLi9nb2FsVGVtcGxhdGVzLmpzJztcblxuZXhwb3J0IGNsYXNzIEFnZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQgaW1wbGVtZW50cyBJRWxlbWVudCB7XG4gIHByaXZhdGUgc3RhdGU6IEFnZW50U3RhdGU7XG4gIHByaXZhdGUgaXNEaXJ0eVN0YXRlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgcnVsZUVuZ2luZUNvbmZpZzogUnVsZUVuZ2luZUNvbmZpZztcblxuICBjb25zdHJ1Y3RvcihtZXRhZGF0YTogUGFydGlhbDxBZ2VudE1ldGFkYXRhPikge1xuICAgIC8vIFNhbml0aXplIGFsbCBpbnB1dHNcbiAgICBjb25zdCBzYW5pdGl6ZWRNZXRhZGF0YTogUGFydGlhbDxBZ2VudE1ldGFkYXRhPiA9IHtcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSA/IHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobWV0YWRhdGEubmFtZSkubm9ybWFsaXplZENvbnRlbnQsIDEwMCkgOiB1bmRlZmluZWQsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24gPyBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG1ldGFkYXRhLmRlc2NyaXB0aW9uKS5ub3JtYWxpemVkQ29udGVudCwgNTAwKSA6IHVuZGVmaW5lZCxcbiAgICAgIHNwZWNpYWxpemF0aW9uczogbWV0YWRhdGEuc3BlY2lhbGl6YXRpb25zPy5tYXAocyA9PiBzYW5pdGl6ZUlucHV0KHMsIDUwKSksXG4gICAgICBkZWNpc2lvbkZyYW1ld29yazogbWV0YWRhdGEuZGVjaXNpb25GcmFtZXdvcmsgfHwgQUdFTlRfREVGQVVMVFMuREVDSVNJT05fRlJBTUVXT1JLLFxuICAgICAgcmlza1RvbGVyYW5jZTogbWV0YWRhdGEucmlza1RvbGVyYW5jZSB8fCBBR0VOVF9ERUZBVUxUUy5SSVNLX1RPTEVSQU5DRSxcbiAgICAgIGxlYXJuaW5nRW5hYmxlZDogbWV0YWRhdGEubGVhcm5pbmdFbmFibGVkID8/IEFHRU5UX0RFRkFVTFRTLkxFQVJOSU5HX0VOQUJMRUQsXG4gICAgICBtYXhDb25jdXJyZW50R29hbHM6IG1ldGFkYXRhLm1heENvbmN1cnJlbnRHb2FscyA/PyBBR0VOVF9ERUZBVUxUUy5NQVhfQ09OQ1VSUkVOVF9HT0FMU1xuICAgIH07XG5cbiAgICAvLyBNRURJVU0gUFJJT1JJVFkgSU1QUk9WRU1FTlQ6IFZhbGlkYXRlIGRlY2lzaW9uIGZyYW1ld29yayBjb25maWd1cmF0aW9uXG4gICAgLy8gRW5zdXJlcyBvbmx5IHN1cHBvcnRlZCBmcmFtZXdvcmtzIGFyZSB1c2VkXG4gICAgaWYgKHNhbml0aXplZE1ldGFkYXRhLmRlY2lzaW9uRnJhbWV3b3JrICYmIFxuICAgICAgICAhREVDSVNJT05fRlJBTUVXT1JLUy5pbmNsdWRlcyhzYW5pdGl6ZWRNZXRhZGF0YS5kZWNpc2lvbkZyYW1ld29yaykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkZWNpc2lvbiBmcmFtZXdvcms6ICR7c2FuaXRpemVkTWV0YWRhdGEuZGVjaXNpb25GcmFtZXdvcmt9LiBgICtcbiAgICAgICAgYFN1cHBvcnRlZCBmcmFtZXdvcmtzOiAke0RFQ0lTSU9OX0ZSQU1FV09SS1Muam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSByaXNrIHRvbGVyYW5jZSBsZXZlbFxuICAgIGlmIChzYW5pdGl6ZWRNZXRhZGF0YS5yaXNrVG9sZXJhbmNlICYmIFxuICAgICAgICAhUklTS19UT0xFUkFOQ0VfTEVWRUxTLmluY2x1ZGVzKHNhbml0aXplZE1ldGFkYXRhLnJpc2tUb2xlcmFuY2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmlzayB0b2xlcmFuY2U6ICR7c2FuaXRpemVkTWV0YWRhdGEucmlza1RvbGVyYW5jZX0uIGAgK1xuICAgICAgICBgU3VwcG9ydGVkIGxldmVsczogJHtSSVNLX1RPTEVSQU5DRV9MRVZFTFMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBtYXggY29uY3VycmVudCBnb2Fsc1xuICAgIGlmIChzYW5pdGl6ZWRNZXRhZGF0YS5tYXhDb25jdXJyZW50R29hbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbWF4R29hbHMgPSBzYW5pdGl6ZWRNZXRhZGF0YS5tYXhDb25jdXJyZW50R29hbHM7XG4gICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobWF4R29hbHMpIHx8IG1heEdvYWxzIDwgMSB8fCBtYXhHb2FscyA+IEFHRU5UX0xJTUlUUy5NQVhfR09BTFMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBtYXhDb25jdXJyZW50R29hbHMgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kICR7QUdFTlRfTElNSVRTLk1BWF9HT0FMU31gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdXBlcihFbGVtZW50VHlwZS5BR0VOVCwgc2FuaXRpemVkTWV0YWRhdGEpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZVxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBnb2FsczogW10sXG4gICAgICBkZWNpc2lvbnM6IFtdLFxuICAgICAgY29udGV4dDoge30sXG4gICAgICBsYXN0QWN0aXZlOiBuZXcgRGF0ZSgpLFxuICAgICAgc2Vzc2lvbkNvdW50OiAwXG4gICAgfTtcblxuICAgIC8vIFNldCBhZ2VudC1zcGVjaWZpYyBleHRlbnNpb25zXG4gICAgdGhpcy5leHRlbnNpb25zID0ge1xuICAgICAgZGVjaXNpb25GcmFtZXdvcms6IHNhbml0aXplZE1ldGFkYXRhLmRlY2lzaW9uRnJhbWV3b3JrLFxuICAgICAgcmlza1RvbGVyYW5jZTogc2FuaXRpemVkTWV0YWRhdGEucmlza1RvbGVyYW5jZSxcbiAgICAgIGxlYXJuaW5nRW5hYmxlZDogc2FuaXRpemVkTWV0YWRhdGEubGVhcm5pbmdFbmFibGVkLFxuICAgICAgc3BlY2lhbGl6YXRpb25zOiBzYW5pdGl6ZWRNZXRhZGF0YS5zcGVjaWFsaXphdGlvbnMgfHwgW10sXG4gICAgICBydWxlRW5naW5lQ29uZmlnOiBtZXRhZGF0YS5ydWxlRW5naW5lQ29uZmlnXG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgcnVsZSBlbmdpbmUgY29uZmlndXJhdGlvbiAod2l0aCB2YWxpZGF0aW9uKVxuICAgIHRoaXMucnVsZUVuZ2luZUNvbmZpZyA9IHZhbGlkYXRlUnVsZUVuZ2luZUNvbmZpZyhcbiAgICAgIHRoaXMuZXh0ZW5zaW9ucy5ydWxlRW5naW5lQ29uZmlnIHx8IHt9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgZ29hbCB3aXRoIHNlY3VyaXR5IHZhbGlkYXRpb25cbiAgICovXG4gIHB1YmxpYyBhZGRHb2FsKGdvYWw6IFBhcnRpYWw8QWdlbnRHb2FsPik6IEFnZW50R29hbCB7XG4gICAgLy8gVmFsaWRhdGUgZ29hbCBjb3VudFxuICAgIGlmICh0aGlzLnN0YXRlLmdvYWxzLmxlbmd0aCA+PSBBR0VOVF9MSU1JVFMuTUFYX0dPQUxTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1heGltdW0gbnVtYmVyIG9mIGdvYWxzICgke0FHRU5UX0xJTUlUUy5NQVhfR09BTFN9KSByZWFjaGVkYCk7XG4gICAgfVxuXG4gICAgLy8gU2FuaXRpemUgZ29hbCBkZXNjcmlwdGlvblxuICAgIGNvbnN0IHNhbml0aXplZERlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChcbiAgICAgIFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGdvYWwuZGVzY3JpcHRpb24gfHwgJycpLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgICAgQUdFTlRfTElNSVRTLk1BWF9HT0FMX0xFTkdUSFxuICAgICk7XG5cbiAgICBpZiAoIXNhbml0aXplZERlc2NyaXB0aW9uIHx8IHNhbml0aXplZERlc2NyaXB0aW9uLmxlbmd0aCA8IDMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR29hbCBkZXNjcmlwdGlvbiBtdXN0IGJlIGF0IGxlYXN0IDMgY2hhcmFjdGVycycpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGdvYWwgZm9yIHNlY3VyaXR5IHRocmVhdHNcbiAgICBjb25zdCBzZWN1cml0eUNoZWNrID0gdGhpcy52YWxpZGF0ZUdvYWxTZWN1cml0eShzYW5pdGl6ZWREZXNjcmlwdGlvbik7XG4gICAgaWYgKCFzZWN1cml0eUNoZWNrLnNhZmUpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdBZ2VudC5hZGRHb2FsJyxcbiAgICAgICAgZGV0YWlsczogYFBvdGVudGlhbGx5IG1hbGljaW91cyBnb2FsIHJlamVjdGVkOiAke3NlY3VyaXR5Q2hlY2sucmVhc29ufWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGFnZW50SWQ6IHRoaXMuaWQgfVxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEdvYWwgY29udGFpbnMgcG90ZW50aWFsbHkgaGFybWZ1bCBjb250ZW50OiAke3NlY3VyaXR5Q2hlY2sucmVhc29ufWApO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBFaXNlbmhvd2VyIHF1YWRyYW50XG4gICAgY29uc3QgaW1wb3J0YW5jZSA9IGdvYWwuaW1wb3J0YW5jZSB8fCA1O1xuICAgIGNvbnN0IHVyZ2VuY3kgPSBnb2FsLnVyZ2VuY3kgfHwgNTtcbiAgICBjb25zdCBlaXNlbmhvd2VyUXVhZHJhbnQgPSB0aGlzLmNhbGN1bGF0ZUVpc2VuaG93ZXJRdWFkcmFudChpbXBvcnRhbmNlLCB1cmdlbmN5KTtcblxuICAgIC8vIENyZWF0ZSBuZXcgZ29hbFxuICAgIGNvbnN0IG5ld0dvYWw6IEFnZW50R29hbCA9IHtcbiAgICAgIGlkOiBgZ29hbF8ke0RhdGUubm93KCl9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpfWAsXG4gICAgICBkZXNjcmlwdGlvbjogc2FuaXRpemVkRGVzY3JpcHRpb24sXG4gICAgICBwcmlvcml0eTogZ29hbC5wcmlvcml0eSB8fCBBR0VOVF9ERUZBVUxUUy5HT0FMX1BSSU9SSVRZLFxuICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICBpbXBvcnRhbmNlLFxuICAgICAgdXJnZW5jeSxcbiAgICAgIGVpc2VuaG93ZXJRdWFkcmFudCxcbiAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIGRlcGVuZGVuY2llczogZ29hbC5kZXBlbmRlbmNpZXMgfHwgW10sXG4gICAgICByaXNrTGV2ZWw6IGdvYWwucmlza0xldmVsIHx8ICdsb3cnLFxuICAgICAgZXN0aW1hdGVkRWZmb3J0OiBnb2FsLmVzdGltYXRlZEVmZm9ydCxcbiAgICAgIG5vdGVzOiBnb2FsLm5vdGVzID8gc2FuaXRpemVJbnB1dChnb2FsLm5vdGVzLCA1MDApIDogdW5kZWZpbmVkXG4gICAgfTtcblxuICAgIC8vIE1FRElVTSBQUklPUklUWSBJTVBST1ZFTUVOVDogRGV0ZWN0IGRlcGVuZGVuY3kgY3ljbGVzIGJlZm9yZSBhZGRpbmcgZ29hbFxuICAgIGlmIChuZXdHb2FsLmRlcGVuZGVuY2llcyAmJiBuZXdHb2FsLmRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjeWNsZUNoZWNrID0gdGhpcy5kZXRlY3REZXBlbmRlbmN5Q3ljbGUobmV3R29hbC5pZCwgbmV3R29hbC5kZXBlbmRlbmNpZXMpO1xuICAgICAgaWYgKGN5Y2xlQ2hlY2suaGFzQ3ljbGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZXBlbmRlbmN5IGN5Y2xlIGRldGVjdGVkOiAke2N5Y2xlQ2hlY2sucGF0aC5qb2luKCcg4oaSICcpfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUuZ29hbHMucHVzaChuZXdHb2FsKTtcbiAgICB0aGlzLmlzRGlydHlTdGF0ZSA9IHRydWU7XG4gICAgdGhpcy5tYXJrRGlydHkoKTtcblxuICAgIGxvZ2dlci5pbmZvKGBHb2FsIGFkZGVkIHRvIGFnZW50ICR7dGhpcy5tZXRhZGF0YS5uYW1lfWAsIHsgZ29hbElkOiBuZXdHb2FsLmlkIH0pO1xuXG4gICAgcmV0dXJuIG5ld0dvYWw7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhIGRlY2lzaW9uIGZvciBhIGdvYWxcbiAgICovXG4gIHB1YmxpYyBhc3luYyBtYWtlRGVjaXNpb24oZ29hbElkOiBzdHJpbmcsIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvbWlzZTxBZ2VudERlY2lzaW9uPiB7XG4gICAgLy8gTUVESVVNIFBSSU9SSVRZIElNUFJPVkVNRU5UOiBUcmFjayBwZXJmb3JtYW5jZSBtZXRyaWNzIGZvciBkZWNpc2lvbiBtYWtpbmdcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHBlcmZvcm1hbmNlTWV0cmljczoge1xuICAgICAgZGVjaXNpb25UaW1lTXM/OiBudW1iZXI7XG4gICAgICBmcmFtZXdvcmtUaW1lTXM/OiBudW1iZXI7XG4gICAgICByaXNrQXNzZXNzbWVudFRpbWVNcz86IG51bWJlcjtcbiAgICB9ID0ge307XG5cbiAgICBjb25zdCBnb2FsID0gdGhpcy5zdGF0ZS5nb2Fscy5maW5kKGcgPT4gZy5pZCA9PT0gZ29hbElkKTtcbiAgICBpZiAoIWdvYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgR29hbCAke2dvYWxJZH0gbm90IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgaWYgKGdvYWwuc3RhdHVzID09PSAnY29tcGxldGVkJyB8fCBnb2FsLnN0YXR1cyA9PT0gJ2NhbmNlbGxlZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1ha2UgZGVjaXNpb24gZm9yICR7Z29hbC5zdGF0dXN9IGdvYWxgKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgZ29hbCBzdGF0dXNcbiAgICBnb2FsLnN0YXR1cyA9ICdpbl9wcm9ncmVzcyc7XG4gICAgZ29hbC51cGRhdGVkQXQgPSBuZXcgRGF0ZSgpO1xuXG4gICAgLy8gUHJlcGFyZSBkZWNpc2lvbiBjb250ZXh0XG4gICAgY29uc3QgZGVjaXNpb25Db250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5zdGF0ZS5jb250ZXh0LFxuICAgICAgLi4uY29udGV4dCxcbiAgICAgIGdvYWwsXG4gICAgICBhZ2VudE1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgcHJldmlvdXNEZWNpc2lvbnM6IHRoaXMuc3RhdGUuZGVjaXNpb25zLmZpbHRlcihkID0+IGQuZ29hbElkID09PSBnb2FsSWQpXG4gICAgfTtcblxuICAgIC8vIE1ha2UgZGVjaXNpb24gYmFzZWQgb24gZnJhbWV3b3JrICh3aXRoIHRpbWluZylcbiAgICBjb25zdCBmcmFtZXdvcmtTdGFydCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZGVjaXNpb24gPSBhd2FpdCB0aGlzLmV4ZWN1dGVEZWNpc2lvbkZyYW1ld29yayhnb2FsLCBkZWNpc2lvbkNvbnRleHQpO1xuICAgIHBlcmZvcm1hbmNlTWV0cmljcy5mcmFtZXdvcmtUaW1lTXMgPSBEYXRlLm5vdygpIC0gZnJhbWV3b3JrU3RhcnQ7XG5cbiAgICAvLyBSaXNrIGFzc2Vzc21lbnQgKHdpdGggdGltaW5nKVxuICAgIGNvbnN0IHJpc2tTdGFydCA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgcmlza0Fzc2Vzc21lbnQgPSB0aGlzLmFzc2Vzc1Jpc2soZGVjaXNpb24sIGdvYWwsIGRlY2lzaW9uQ29udGV4dCk7XG4gICAgcGVyZm9ybWFuY2VNZXRyaWNzLnJpc2tBc3Nlc3NtZW50VGltZU1zID0gRGF0ZS5ub3coKSAtIHJpc2tTdGFydDtcblxuICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBkZWNpc2lvbiB0aW1lXG4gICAgcGVyZm9ybWFuY2VNZXRyaWNzLmRlY2lzaW9uVGltZU1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcblxuICAgIC8vIENyZWF0ZSBkZWNpc2lvbiByZWNvcmRcbiAgICBjb25zdCBkZWNpc2lvblJlY29yZDogQWdlbnREZWNpc2lvbiA9IHtcbiAgICAgIGlkOiBgZGVjaXNpb25fJHtEYXRlLm5vdygpfV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KX1gLFxuICAgICAgZ29hbElkLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgZGVjaXNpb246IGRlY2lzaW9uLmFjdGlvbixcbiAgICAgIHJlYXNvbmluZzogZGVjaXNpb24ucmVhc29uaW5nLFxuICAgICAgZnJhbWV3b3JrOiB0aGlzLmV4dGVuc2lvbnM/LmRlY2lzaW9uRnJhbWV3b3JrIHx8IEFHRU5UX0RFRkFVTFRTLkRFQ0lTSU9OX0ZSQU1FV09SSyxcbiAgICAgIGNvbmZpZGVuY2U6IGRlY2lzaW9uLmNvbmZpZGVuY2UsXG4gICAgICByaXNrQXNzZXNzbWVudCxcbiAgICAgIHBlcmZvcm1hbmNlTWV0cmljcyAgLy8gQWRkIHBlcmZvcm1hbmNlIHRyYWNraW5nXG4gICAgfTtcblxuICAgIC8vIE9QVElNSVpBVElPTjogVXNlIGVmZmljaWVudCBjaXJjdWxhciBidWZmZXIgcGF0dGVyblxuICAgIC8vIEFkZCB0byBoaXN0b3J5IHdpdGggbGltaXQgKGF2b2lkIGFycmF5IHNsaWNpbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZSlcbiAgICBpZiAodGhpcy5zdGF0ZS5kZWNpc2lvbnMubGVuZ3RoID49IEFHRU5UX0xJTUlUUy5NQVhfREVDSVNJT05fSElTVE9SWSkge1xuICAgICAgLy8gUmVtb3ZlIG9sZGVzdCBlbnRyeSBiZWZvcmUgYWRkaW5nIG5ldyBvbmUgKE8obikgYnV0IGhhcHBlbnMgaW5mcmVxdWVudGx5KVxuICAgICAgdGhpcy5zdGF0ZS5kZWNpc2lvbnMuc2hpZnQoKTtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZS5kZWNpc2lvbnMucHVzaChkZWNpc2lvblJlY29yZCk7XG5cbiAgICB0aGlzLmlzRGlydHlTdGF0ZSA9IHRydWU7XG4gICAgdGhpcy5tYXJrRGlydHkoKTtcblxuICAgIC8vIExvZyBkZWNpc2lvbiBmb3IgYXVkaXRcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnQUdFTlRfREVDSVNJT04nLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnQWdlbnQubWFrZURlY2lzaW9uJyxcbiAgICAgIGRldGFpbHM6IGBBZ2VudCAke3RoaXMubWV0YWRhdGEubmFtZX0gbWFkZSBkZWNpc2lvbiBmb3IgZ29hbCAke2dvYWxJZH1gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgYWdlbnRJZDogdGhpcy5pZCxcbiAgICAgICAgZ29hbElkLFxuICAgICAgICBmcmFtZXdvcms6IGRlY2lzaW9uUmVjb3JkLmZyYW1ld29yayxcbiAgICAgICAgcmlza0xldmVsOiByaXNrQXNzZXNzbWVudC5sZXZlbFxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRlY2lzaW9uUmVjb3JkO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgZGVjaXNpb24gZnJhbWV3b3JrXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVEZWNpc2lvbkZyYW1ld29yayhcbiAgICBnb2FsOiBBZ2VudEdvYWwsXG4gICAgY29udGV4dDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPHsgYWN0aW9uOiBzdHJpbmc7IHJlYXNvbmluZzogc3RyaW5nOyBjb25maWRlbmNlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGZyYW1ld29yayA9IHRoaXMuZXh0ZW5zaW9ucz8uZGVjaXNpb25GcmFtZXdvcmsgfHwgQUdFTlRfREVGQVVMVFMuREVDSVNJT05fRlJBTUVXT1JLO1xuXG4gICAgc3dpdGNoIChmcmFtZXdvcmspIHtcbiAgICAgIGNhc2UgJ3J1bGVfYmFzZWQnOlxuICAgICAgICByZXR1cm4gdGhpcy5ydWxlQmFzZWREZWNpc2lvbihnb2FsLCBjb250ZXh0KTtcbiAgICAgIFxuICAgICAgY2FzZSAnbWxfYmFzZWQnOlxuICAgICAgICAvLyBQbGFjZWhvbGRlciBmb3IgTUwtYmFzZWQgZGVjaXNpb25zXG4gICAgICAgIGxvZ2dlci53YXJuKCdNTC1iYXNlZCBkZWNpc2lvbnMgbm90IHlldCBpbXBsZW1lbnRlZCwgZmFsbGluZyBiYWNrIHRvIHJ1bGUtYmFzZWQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVsZUJhc2VkRGVjaXNpb24oZ29hbCwgY29udGV4dCk7XG4gICAgICBcbiAgICAgIGNhc2UgJ3Byb2dyYW1tYXRpYyc6XG4gICAgICAgIHJldHVybiB0aGlzLnByb2dyYW1tYXRpY0RlY2lzaW9uKGdvYWwsIGNvbnRleHQpO1xuICAgICAgXG4gICAgICBjYXNlICdoeWJyaWQnOlxuICAgICAgICAvLyBDb21iaW5lIG11bHRpcGxlIGZyYW1ld29ya3NcbiAgICAgICAgY29uc3QgcnVsZURlY2lzaW9uID0gYXdhaXQgdGhpcy5ydWxlQmFzZWREZWNpc2lvbihnb2FsLCBjb250ZXh0KTtcbiAgICAgICAgY29uc3QgcHJvZ0RlY2lzaW9uID0gYXdhaXQgdGhpcy5wcm9ncmFtbWF0aWNEZWNpc2lvbihnb2FsLCBjb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIC8vIEF2ZXJhZ2UgY29uZmlkZW5jZSBhbmQgY29tYmluZSByZWFzb25pbmdcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhY3Rpb246IHJ1bGVEZWNpc2lvbi5jb25maWRlbmNlID4gcHJvZ0RlY2lzaW9uLmNvbmZpZGVuY2UgPyBydWxlRGVjaXNpb24uYWN0aW9uIDogcHJvZ0RlY2lzaW9uLmFjdGlvbixcbiAgICAgICAgICByZWFzb25pbmc6IGBSdWxlLWJhc2VkOiAke3J1bGVEZWNpc2lvbi5yZWFzb25pbmd9XFxuUHJvZ3JhbW1hdGljOiAke3Byb2dEZWNpc2lvbi5yZWFzb25pbmd9YCxcbiAgICAgICAgICBjb25maWRlbmNlOiAocnVsZURlY2lzaW9uLmNvbmZpZGVuY2UgKyBwcm9nRGVjaXNpb24uY29uZmlkZW5jZSkgLyAyXG4gICAgICAgIH07XG4gICAgICBcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkZWNpc2lvbiBmcmFtZXdvcms6ICR7ZnJhbWV3b3JrfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdWxlLWJhc2VkIGRlY2lzaW9uIG1ha2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBydWxlQmFzZWREZWNpc2lvbihcbiAgICBnb2FsOiBBZ2VudEdvYWwsXG4gICAgY29udGV4dDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPHsgYWN0aW9uOiBzdHJpbmc7IHJlYXNvbmluZzogc3RyaW5nOyBjb25maWRlbmNlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHJ1bGVzOiBBcnJheTx7XG4gICAgICBjb25kaXRpb246IChnOiBBZ2VudEdvYWwsIGN0eDogUmVjb3JkPHN0cmluZywgYW55PikgPT4gYm9vbGVhbjtcbiAgICAgIGFjdGlvbjogc3RyaW5nO1xuICAgICAgcmVhc29uaW5nOiBzdHJpbmc7XG4gICAgICBjb25maWRlbmNlOiBudW1iZXI7XG4gICAgfT4gPSBbXG4gICAgICAvLyBIaWdoIHByaW9yaXR5ICsgaGlnaCB1cmdlbmN5ID0gaW1tZWRpYXRlIGFjdGlvblxuICAgICAge1xuICAgICAgICBjb25kaXRpb246IChnKSA9PiBnLnByaW9yaXR5ID09PSB0aGlzLnJ1bGVFbmdpbmVDb25maWcucnVsZUJhc2VkLnByaW9yaXR5LmNyaXRpY2FsICYmIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZy51cmdlbmN5ID4gdGhpcy5ydWxlRW5naW5lQ29uZmlnLnJ1bGVCYXNlZC51cmdlbmN5VGhyZXNob2xkcy5pbW1lZGlhdGUsXG4gICAgICAgIGFjdGlvbjogdGhpcy5ydWxlRW5naW5lQ29uZmlnLmFjdGlvbnMuZXhlY3V0ZUltbWVkaWF0ZWx5LFxuICAgICAgICByZWFzb25pbmc6ICdDcml0aWNhbCBwcmlvcml0eSB3aXRoIGhpZ2ggdXJnZW5jeSByZXF1aXJlcyBpbW1lZGlhdGUgYWN0aW9uJyxcbiAgICAgICAgY29uZmlkZW5jZTogdGhpcy5ydWxlRW5naW5lQ29uZmlnLnJ1bGVCYXNlZC5jb25maWRlbmNlLmNyaXRpY2FsXG4gICAgICB9LFxuICAgICAgLy8gQmxvY2tlZCBieSBkZXBlbmRlbmNpZXNcbiAgICAgIHtcbiAgICAgICAgY29uZGl0aW9uOiAoZywgY3R4KSA9PiB7XG4gICAgICAgICAgaWYgKCFnLmRlcGVuZGVuY2llcyB8fCBnLmRlcGVuZGVuY2llcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgICBjb25zdCBibG9ja2VkRGVwcyA9IGcuZGVwZW5kZW5jaWVzLmZpbHRlcihkZXBJZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZXAgPSB0aGlzLnN0YXRlLmdvYWxzLmZpbmQoZ29hbCA9PiBnb2FsLmlkID09PSBkZXBJZCk7XG4gICAgICAgICAgICByZXR1cm4gZGVwICYmIGRlcC5zdGF0dXMgIT09ICdjb21wbGV0ZWQnO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBibG9ja2VkRGVwcy5sZW5ndGggPiAwO1xuICAgICAgICB9LFxuICAgICAgICBhY3Rpb246IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5hY3Rpb25zLndhaXRGb3JEZXBlbmRlbmNpZXMsXG4gICAgICAgIHJlYXNvbmluZzogJ0dvYWwgaGFzIGluY29tcGxldGUgZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgY29uZmlkZW5jZTogdGhpcy5ydWxlRW5naW5lQ29uZmlnLnJ1bGVCYXNlZC5jb25maWRlbmNlLmJsb2NrZWRcbiAgICAgIH0sXG4gICAgICAvLyBSaXNrIGFzc2Vzc21lbnRcbiAgICAgIHtcbiAgICAgICAgY29uZGl0aW9uOiAoZykgPT4gZy5yaXNrTGV2ZWwgPT09ICdoaWdoJyAmJiB0aGlzLmV4dGVuc2lvbnM/LnJpc2tUb2xlcmFuY2UgPT09ICdjb25zZXJ2YXRpdmUnLFxuICAgICAgICBhY3Rpb246IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5hY3Rpb25zLnJlcXVlc3RBcHByb3ZhbCxcbiAgICAgICAgcmVhc29uaW5nOiAnSGlnaCByaXNrIGdvYWwgcmVxdWlyZXMgYXBwcm92YWwgaW4gY29uc2VydmF0aXZlIG1vZGUnLFxuICAgICAgICBjb25maWRlbmNlOiB0aGlzLnJ1bGVFbmdpbmVDb25maWcucnVsZUJhc2VkLmNvbmZpZGVuY2Uucmlza0FwcHJvdmFsXG4gICAgICB9LFxuICAgICAgLy8gUmVzb3VyY2UgYXZhaWxhYmlsaXR5XG4gICAgICB7XG4gICAgICAgIGNvbmRpdGlvbjogKGcsIGN0eCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZUdvYWxzID0gdGhpcy5zdGF0ZS5nb2Fscy5maWx0ZXIoZ29hbCA9PiBnb2FsLnN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJykubGVuZ3RoO1xuICAgICAgICAgIGNvbnN0IG1heENvbmN1cnJlbnQgPSAodGhpcy5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhKS5tYXhDb25jdXJyZW50R29hbHMgfHwgQUdFTlRfREVGQVVMVFMuTUFYX0NPTkNVUlJFTlRfR09BTFM7XG4gICAgICAgICAgcmV0dXJuIGFjdGl2ZUdvYWxzID49IG1heENvbmN1cnJlbnQ7XG4gICAgICAgIH0sXG4gICAgICAgIGFjdGlvbjogdGhpcy5ydWxlRW5naW5lQ29uZmlnLmFjdGlvbnMucXVldWVGb3JMYXRlcixcbiAgICAgICAgcmVhc29uaW5nOiAnTWF4aW11bSBjb25jdXJyZW50IGdvYWxzIHJlYWNoZWQnLFxuICAgICAgICBjb25maWRlbmNlOiB0aGlzLnJ1bGVFbmdpbmVDb25maWcucnVsZUJhc2VkLmNvbmZpZGVuY2UucmVzb3VyY2VMaW1pdFxuICAgICAgfSxcbiAgICAgIC8vIERlZmF1bHQgYWN0aW9uXG4gICAgICB7XG4gICAgICAgIGNvbmRpdGlvbjogKCkgPT4gdHJ1ZSxcbiAgICAgICAgYWN0aW9uOiB0aGlzLnJ1bGVFbmdpbmVDb25maWcuYWN0aW9ucy5wcm9jZWVkV2l0aEdvYWwsXG4gICAgICAgIHJlYXNvbmluZzogJ05vIGJsb2NraW5nIGNvbmRpdGlvbnMgZm91bmQnLFxuICAgICAgICBjb25maWRlbmNlOiB0aGlzLnJ1bGVFbmdpbmVDb25maWcucnVsZUJhc2VkLmNvbmZpZGVuY2UuZGVmYXVsdFxuICAgICAgfVxuICAgIF07XG5cbiAgICAvLyBFdmFsdWF0ZSBydWxlcyBpbiBvcmRlclxuICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgICAgaWYgKHJ1bGUuY29uZGl0aW9uKGdvYWwsIGNvbnRleHQpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWN0aW9uOiBydWxlLmFjdGlvbixcbiAgICAgICAgICByZWFzb25pbmc6IHJ1bGUucmVhc29uaW5nLFxuICAgICAgICAgIGNvbmZpZGVuY2U6IHJ1bGUuY29uZmlkZW5jZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIChzaG91bGQgbm90IHJlYWNoIGhlcmUpXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogdGhpcy5ydWxlRW5naW5lQ29uZmlnLmFjdGlvbnMucmV2aWV3TWFudWFsbHksXG4gICAgICByZWFzb25pbmc6ICdObyBhcHBsaWNhYmxlIHJ1bGVzIGZvdW5kJyxcbiAgICAgIGNvbmZpZGVuY2U6IDAuNVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUHJvZ3JhbW1hdGljIGRlY2lzaW9uIG1ha2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9ncmFtbWF0aWNEZWNpc2lvbihcbiAgICBnb2FsOiBBZ2VudEdvYWwsXG4gICAgY29udGV4dDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPHsgYWN0aW9uOiBzdHJpbmc7IHJlYXNvbmluZzogc3RyaW5nOyBjb25maWRlbmNlOiBudW1iZXIgfT4ge1xuICAgIC8vIENhbGN1bGF0ZSBkZWNpc2lvbiBzY29yZSBiYXNlZCBvbiBtdWx0aXBsZSBmYWN0b3JzXG4gICAgbGV0IHNjb3JlID0gMDtcbiAgICBjb25zdCBmYWN0b3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gRmFjdG9yIDE6IEVpc2VuaG93ZXIgbWF0cml4XG4gICAgaWYgKGdvYWwuZWlzZW5ob3dlclF1YWRyYW50ID09PSAnZG9fZmlyc3QnKSB7XG4gICAgICBzY29yZSArPSB0aGlzLnJ1bGVFbmdpbmVDb25maWcucHJvZ3JhbW1hdGljLnNjb3JlV2VpZ2h0cy5laXNlbmhvd2VyLmRvRmlyc3Q7XG4gICAgICBmYWN0b3JzLnB1c2goJ0hpZ2ggaW1wb3J0YW5jZSBhbmQgdXJnZW5jeSAoRG8gRmlyc3QgcXVhZHJhbnQpJyk7XG4gICAgfSBlbHNlIGlmIChnb2FsLmVpc2VuaG93ZXJRdWFkcmFudCA9PT0gJ3NjaGVkdWxlJykge1xuICAgICAgc2NvcmUgKz0gdGhpcy5ydWxlRW5naW5lQ29uZmlnLnByb2dyYW1tYXRpYy5zY29yZVdlaWdodHMuZWlzZW5ob3dlci5zY2hlZHVsZTtcbiAgICAgIGZhY3RvcnMucHVzaCgnSGlnaCBpbXBvcnRhbmNlLCBsb3cgdXJnZW5jeSAoU2NoZWR1bGUgcXVhZHJhbnQpJyk7XG4gICAgfSBlbHNlIGlmIChnb2FsLmVpc2VuaG93ZXJRdWFkcmFudCA9PT0gJ2RlbGVnYXRlJykge1xuICAgICAgc2NvcmUgKz0gdGhpcy5ydWxlRW5naW5lQ29uZmlnLnByb2dyYW1tYXRpYy5zY29yZVdlaWdodHMuZWlzZW5ob3dlci5kZWxlZ2F0ZTtcbiAgICAgIGZhY3RvcnMucHVzaCgnTG93IGltcG9ydGFuY2UsIGhpZ2ggdXJnZW5jeSAoRGVsZWdhdGUgcXVhZHJhbnQpJyk7XG4gICAgfVxuXG4gICAgLy8gRmFjdG9yIDI6IFJpc2sgbGV2ZWxcbiAgICBpZiAoZ29hbC5yaXNrTGV2ZWwgPT09ICdsb3cnKSB7XG4gICAgICBzY29yZSArPSB0aGlzLnJ1bGVFbmdpbmVDb25maWcucHJvZ3JhbW1hdGljLnNjb3JlV2VpZ2h0cy5yaXNrLmxvdztcbiAgICAgIGZhY3RvcnMucHVzaCgnTG93IHJpc2snKTtcbiAgICB9IGVsc2UgaWYgKGdvYWwucmlza0xldmVsID09PSAnbWVkaXVtJykge1xuICAgICAgc2NvcmUgKz0gdGhpcy5ydWxlRW5naW5lQ29uZmlnLnByb2dyYW1tYXRpYy5zY29yZVdlaWdodHMucmlzay5tZWRpdW07XG4gICAgICBmYWN0b3JzLnB1c2goJ01lZGl1bSByaXNrJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjb3JlICs9IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5wcm9ncmFtbWF0aWMuc2NvcmVXZWlnaHRzLnJpc2suaGlnaDtcbiAgICAgIGZhY3RvcnMucHVzaCgnSGlnaCByaXNrIHBlbmFsdHknKTtcbiAgICB9XG5cbiAgICAvLyBGYWN0b3IgMzogRGVwZW5kZW5jaWVzXG4gICAgaWYgKCFnb2FsLmRlcGVuZGVuY2llcyB8fCBnb2FsLmRlcGVuZGVuY2llcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHNjb3JlICs9IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5wcm9ncmFtbWF0aWMuc2NvcmVXZWlnaHRzLm5vRGVwZW5kZW5jaWVzO1xuICAgICAgZmFjdG9ycy5wdXNoKCdObyBkZXBlbmRlbmNpZXMnKTtcbiAgICB9XG5cbiAgICAvLyBGYWN0b3IgNDogRXN0aW1hdGVkIGVmZm9ydFxuICAgIGlmIChnb2FsLmVzdGltYXRlZEVmZm9ydCAmJiBnb2FsLmVzdGltYXRlZEVmZm9ydCA8PSB0aGlzLnJ1bGVFbmdpbmVDb25maWcucHJvZ3JhbW1hdGljLnF1aWNrV2luSG91cnMpIHtcbiAgICAgIHNjb3JlICs9IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5wcm9ncmFtbWF0aWMuc2NvcmVXZWlnaHRzLnF1aWNrV2luO1xuICAgICAgZmFjdG9ycy5wdXNoKGBRdWljayB3aW4gKOKJpCR7dGhpcy5ydWxlRW5naW5lQ29uZmlnLnByb2dyYW1tYXRpYy5xdWlja1dpbkhvdXJzfSBob3VycylgKTtcbiAgICB9XG5cbiAgICAvLyBGYWN0b3IgNTogUHJldmlvdXMgc3VjY2VzcyByYXRlXG4gICAgY29uc3QgcHJldmlvdXNEZWNpc2lvbnMgPSB0aGlzLnN0YXRlLmRlY2lzaW9ucy5maWx0ZXIoZCA9PiBkLm91dGNvbWUgPT09ICdzdWNjZXNzJyk7XG4gICAgY29uc3Qgc3VjY2Vzc1JhdGUgPSBwcmV2aW91c0RlY2lzaW9ucy5sZW5ndGggLyBNYXRoLm1heCh0aGlzLnN0YXRlLmRlY2lzaW9ucy5sZW5ndGgsIDEpO1xuICAgIGlmIChzdWNjZXNzUmF0ZSA+IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5wcm9ncmFtbWF0aWMuc3VjY2Vzc1JhdGVUaHJlc2hvbGQpIHtcbiAgICAgIHNjb3JlICs9IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5wcm9ncmFtbWF0aWMuc2NvcmVXZWlnaHRzLnN1Y2Nlc3NCb251cztcbiAgICAgIGZhY3RvcnMucHVzaChgSGlnaCBzdWNjZXNzIHJhdGUgKCR7KHN1Y2Nlc3NSYXRlICogMTAwKS50b0ZpeGVkKDApfSUpYCk7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIGFjdGlvbiBiYXNlZCBvbiBzY29yZVxuICAgIGxldCBhY3Rpb246IHN0cmluZztcbiAgICBsZXQgY29uZmlkZW5jZTogbnVtYmVyO1xuXG4gICAgaWYgKHNjb3JlID49IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5wcm9ncmFtbWF0aWMuYWN0aW9uVGhyZXNob2xkcy5leGVjdXRlSW1tZWRpYXRlbHkpIHtcbiAgICAgIGFjdGlvbiA9IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5hY3Rpb25zLmV4ZWN1dGVJbW1lZGlhdGVseTtcbiAgICAgIGNvbmZpZGVuY2UgPSB0aGlzLnJ1bGVFbmdpbmVDb25maWcucHJvZ3JhbW1hdGljLmNvbmZpZGVuY2VMZXZlbHMuZXhlY3V0ZUltbWVkaWF0ZWx5O1xuICAgIH0gZWxzZSBpZiAoc2NvcmUgPj0gdGhpcy5ydWxlRW5naW5lQ29uZmlnLnByb2dyYW1tYXRpYy5hY3Rpb25UaHJlc2hvbGRzLnByb2NlZWQpIHtcbiAgICAgIGFjdGlvbiA9IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5hY3Rpb25zLnByb2NlZWRXaXRoR29hbDtcbiAgICAgIGNvbmZpZGVuY2UgPSB0aGlzLnJ1bGVFbmdpbmVDb25maWcucHJvZ3JhbW1hdGljLmNvbmZpZGVuY2VMZXZlbHMucHJvY2VlZDtcbiAgICB9IGVsc2UgaWYgKHNjb3JlID49IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5wcm9ncmFtbWF0aWMuYWN0aW9uVGhyZXNob2xkcy5zY2hlZHVsZSkge1xuICAgICAgYWN0aW9uID0gdGhpcy5ydWxlRW5naW5lQ29uZmlnLmFjdGlvbnMuc2NoZWR1bGVGb3JMYXRlcjtcbiAgICAgIGNvbmZpZGVuY2UgPSB0aGlzLnJ1bGVFbmdpbmVDb25maWcucHJvZ3JhbW1hdGljLmNvbmZpZGVuY2VMZXZlbHMuc2NoZWR1bGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdGlvbiA9IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5hY3Rpb25zLnJldmlld0FuZFJldmlzZTtcbiAgICAgIGNvbmZpZGVuY2UgPSB0aGlzLnJ1bGVFbmdpbmVDb25maWcucHJvZ3JhbW1hdGljLmNvbmZpZGVuY2VMZXZlbHMucmV2aWV3O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb24sXG4gICAgICByZWFzb25pbmc6IGBTY29yZTogJHtzY29yZX0uIEZhY3RvcnM6ICR7ZmFjdG9ycy5qb2luKCcsICcpfWAsXG4gICAgICBjb25maWRlbmNlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3Nlc3MgcmlzayBmb3IgYSBkZWNpc2lvblxuICAgKi9cbiAgcHJpdmF0ZSBhc3Nlc3NSaXNrKFxuICAgIGRlY2lzaW9uOiB7IGFjdGlvbjogc3RyaW5nOyByZWFzb25pbmc6IHN0cmluZzsgY29uZmlkZW5jZTogbnVtYmVyIH0sXG4gICAgZ29hbDogQWdlbnRHb2FsLFxuICAgIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogQWdlbnREZWNpc2lvblsncmlza0Fzc2Vzc21lbnQnXSB7XG4gICAgY29uc3QgZmFjdG9yczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmlza1Njb3JlID0gMDtcblxuICAgIC8vIENoZWNrIGZvciBpbW1lZGlhdGUgZXhlY3V0aW9uIHdpdGggaGlnaCByaXNrXG4gICAgaWYgKGRlY2lzaW9uLmFjdGlvbiA9PT0gJ2V4ZWN1dGVfaW1tZWRpYXRlbHknICYmIGdvYWwucmlza0xldmVsID09PSAnaGlnaCcpIHtcbiAgICAgIGZhY3RvcnMucHVzaCgnSW1tZWRpYXRlIGV4ZWN1dGlvbiBvZiBoaWdoLXJpc2sgZ29hbCcpO1xuICAgICAgcmlza1Njb3JlICs9IDMwO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBsb3cgY29uZmlkZW5jZSBkZWNpc2lvbnNcbiAgICBpZiAoZGVjaXNpb24uY29uZmlkZW5jZSA8IDAuNikge1xuICAgICAgZmFjdG9ycy5wdXNoKCdMb3cgZGVjaXNpb24gY29uZmlkZW5jZScpO1xuICAgICAgcmlza1Njb3JlICs9IDIwO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBjb21wbGV4IGRlcGVuZGVuY2llc1xuICAgIGlmIChnb2FsLmRlcGVuZGVuY2llcyAmJiBnb2FsLmRlcGVuZGVuY2llcy5sZW5ndGggPiAzKSB7XG4gICAgICBmYWN0b3JzLnB1c2goJ0NvbXBsZXggZGVwZW5kZW5jeSBjaGFpbicpO1xuICAgICAgcmlza1Njb3JlICs9IDE1O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBhZ2dyZXNzaXZlIHJpc2sgdG9sZXJhbmNlIHdpdGggaGlnaC1yaXNrIGdvYWxcbiAgICBpZiAodGhpcy5leHRlbnNpb25zPy5yaXNrVG9sZXJhbmNlID09PSAnYWdncmVzc2l2ZScgJiYgZ29hbC5yaXNrTGV2ZWwgPT09ICdoaWdoJykge1xuICAgICAgZmFjdG9ycy5wdXNoKCdBZ2dyZXNzaXZlIHJpc2sgdG9sZXJhbmNlIHdpdGggaGlnaC1yaXNrIGdvYWwnKTtcbiAgICAgIHJpc2tTY29yZSArPSAyNTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgcmlzayBsZXZlbFxuICAgIGxldCBsZXZlbDogJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJztcbiAgICBjb25zdCBtaXRpZ2F0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChyaXNrU2NvcmUgPj0gNTApIHtcbiAgICAgIGxldmVsID0gJ2hpZ2gnO1xuICAgICAgbWl0aWdhdGlvbnMucHVzaCgnUmVxdWVzdCBodW1hbiBhcHByb3ZhbCcpO1xuICAgICAgbWl0aWdhdGlvbnMucHVzaCgnQ3JlYXRlIGJhY2t1cCBwbGFuJyk7XG4gICAgICBtaXRpZ2F0aW9ucy5wdXNoKCdNb25pdG9yIGNsb3NlbHknKTtcbiAgICB9IGVsc2UgaWYgKHJpc2tTY29yZSA+PSAyNSkge1xuICAgICAgbGV2ZWwgPSAnbWVkaXVtJztcbiAgICAgIG1pdGlnYXRpb25zLnB1c2goJ0FkZCBjaGVja3BvaW50cycpO1xuICAgICAgbWl0aWdhdGlvbnMucHVzaCgnUmV2aWV3IGFmdGVyIGNvbXBsZXRpb24nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV2ZWwgPSAnbG93JztcbiAgICAgIG1pdGlnYXRpb25zLnB1c2goJ1N0YW5kYXJkIG1vbml0b3JpbmcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGV2ZWwsXG4gICAgICBmYWN0b3JzLFxuICAgICAgbWl0aWdhdGlvbnM6IG1pdGlnYXRpb25zLmxlbmd0aCA+IDAgPyBtaXRpZ2F0aW9ucyA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIEVpc2VuaG93ZXIgcXVhZHJhbnRcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlRWlzZW5ob3dlclF1YWRyYW50KGltcG9ydGFuY2U6IG51bWJlciwgdXJnZW5jeTogbnVtYmVyKTogQWdlbnRHb2FsWydlaXNlbmhvd2VyUXVhZHJhbnQnXSB7XG4gICAgaWYgKGltcG9ydGFuY2UgPj0gNyAmJiB1cmdlbmN5ID49IDcpIHtcbiAgICAgIHJldHVybiAnZG9fZmlyc3QnO1xuICAgIH0gZWxzZSBpZiAoaW1wb3J0YW5jZSA+PSA3ICYmIHVyZ2VuY3kgPCA3KSB7XG4gICAgICByZXR1cm4gJ3NjaGVkdWxlJztcbiAgICB9IGVsc2UgaWYgKGltcG9ydGFuY2UgPCA3ICYmIHVyZ2VuY3kgPj0gNykge1xuICAgICAgcmV0dXJuICdkZWxlZ2F0ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnZWxpbWluYXRlJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZ29hbCBmb3Igc2VjdXJpdHkgdGhyZWF0c1xuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUdvYWxTZWN1cml0eShnb2FsOiBzdHJpbmcpOiB7IHNhZmU6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9IHtcbiAgICAvLyBDaGVjayBmb3IgY29tbWFuZCBpbmplY3Rpb24gcGF0dGVybnNcbiAgICBjb25zdCBkYW5nZXJvdXNQYXR0ZXJucyA9IFtcbiAgICAgIC9zeXN0ZW1cXHMqXFwoL2ksXG4gICAgICAvZXhlY1xccypcXCgvaSxcbiAgICAgIC9ldmFsXFxzKlxcKC9pLFxuICAgICAgL3JlcXVpcmVcXHMqXFwoL2ksXG4gICAgICAvaW1wb3J0XFxzKlxcKC9pLFxuICAgICAgL1xcJFxcey4qXFx9LyxcbiAgICAgIC9gLipgLyxcbiAgICAgIC9wcm9jZXNzXFwuXFx3Ky9pLFxuICAgICAgL2NoaWxkX3Byb2Nlc3MvaVxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgZGFuZ2Vyb3VzUGF0dGVybnMpIHtcbiAgICAgIGlmIChwYXR0ZXJuLnRlc3QoZ29hbCkpIHtcbiAgICAgICAgcmV0dXJuIHsgc2FmZTogZmFsc2UsIHJlYXNvbjogJ0NvbnRhaW5zIHBvdGVudGlhbGx5IGRhbmdlcm91cyBjb2RlIHBhdHRlcm5zJyB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBzb2NpYWwgZW5naW5lZXJpbmcgYXR0ZW1wdHNcbiAgICBjb25zdCBzb2NpYWxFbmdpbmVlcmluZ1BhdHRlcm5zID0gW1xuICAgICAgL3Bhc3N3b3JkfGNyZWRlbnRpYWx8c2VjcmV0fHRva2VufGtleS9pLFxuICAgICAgL2hhY2t8ZXhwbG9pdHxicmVhY2h8YXR0YWNrL2ksXG4gICAgICAvZGVsZXRlXFxzK2FsbHxkZXN0cm95fHdpcGV8ZXJhc2VcXHMrZXZlcnl0aGluZy9pLFxuICAgICAgL3N0ZWFsfHRoZWZ0fHJvYi9pXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBzb2NpYWxFbmdpbmVlcmluZ1BhdHRlcm5zKSB7XG4gICAgICBpZiAocGF0dGVybi50ZXN0KGdvYWwpKSB7XG4gICAgICAgIHJldHVybiB7IHNhZmU6IGZhbHNlLCByZWFzb246ICdDb250YWlucyBwb3RlbnRpYWxseSBoYXJtZnVsIGludGVudCcgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBzYWZlOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFnZW50IHN0YXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhdGUoKTogUmVhZG9ubHk8QWdlbnRTdGF0ZT4ge1xuICAgIHJldHVybiB7IC4uLnRoaXMuc3RhdGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYWdlbnQgY29udGV4dFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUNvbnRleHQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBzYW5pdGl6ZWRLZXkgPSBzYW5pdGl6ZUlucHV0KGtleSwgNTApO1xuICAgIFxuICAgIC8vIFZhbGlkYXRlIGNvbnRleHQgc2l6ZVxuICAgIGNvbnN0IGNvbnRleHRTdHIgPSBKU09OLnN0cmluZ2lmeSh7IC4uLnRoaXMuc3RhdGUuY29udGV4dCwgW3Nhbml0aXplZEtleV06IHZhbHVlIH0pO1xuICAgIGlmIChjb250ZXh0U3RyLmxlbmd0aCA+IEFHRU5UX0xJTUlUUy5NQVhfQ09OVEVYVF9MRU5HVEgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29udGV4dCBzaXplIGV4Y2VlZHMgbWF4aW11bSBvZiAke0FHRU5UX0xJTUlUUy5NQVhfQ09OVEVYVF9MRU5HVEh9IGNoYXJhY3RlcnNgKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlLmNvbnRleHRbc2FuaXRpemVkS2V5XSA9IHZhbHVlO1xuICAgIHRoaXMuaXNEaXJ0eVN0YXRlID0gdHJ1ZTtcbiAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlIGEgZ29hbFxuICAgKi9cbiAgcHVibGljIGNvbXBsZXRlR29hbChnb2FsSWQ6IHN0cmluZywgb3V0Y29tZTogJ3N1Y2Nlc3MnIHwgJ2ZhaWx1cmUnIHwgJ3BhcnRpYWwnID0gJ3N1Y2Nlc3MnKTogdm9pZCB7XG4gICAgY29uc3QgZ29hbCA9IHRoaXMuc3RhdGUuZ29hbHMuZmluZChnID0+IGcuaWQgPT09IGdvYWxJZCk7XG4gICAgaWYgKCFnb2FsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEdvYWwgJHtnb2FsSWR9IG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIGdvYWwuc3RhdHVzID0gb3V0Y29tZSA9PT0gJ3N1Y2Nlc3MnID8gJ2NvbXBsZXRlZCcgOiAnZmFpbGVkJztcbiAgICBnb2FsLmNvbXBsZXRlZEF0ID0gbmV3IERhdGUoKTtcbiAgICBnb2FsLnVwZGF0ZWRBdCA9IG5ldyBEYXRlKCk7XG5cbiAgICAvLyBVcGRhdGUgYWN0dWFsIGVmZm9ydCBpZiBpdCB3YXMgYmVpbmcgdHJhY2tlZFxuICAgIGlmIChnb2FsLmVzdGltYXRlZEVmZm9ydCAmJiBnb2FsLmNyZWF0ZWRBdCkge1xuICAgICAgY29uc3QgaG91cnNFbGFwc2VkID0gKGdvYWwuY29tcGxldGVkQXQuZ2V0VGltZSgpIC0gZ29hbC5jcmVhdGVkQXQuZ2V0VGltZSgpKSAvICgxMDAwICogNjAgKiA2MCk7XG4gICAgICBnb2FsLmFjdHVhbEVmZm9ydCA9IE1hdGgucm91bmQoaG91cnNFbGFwc2VkICogMTApIC8gMTA7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGRlY2lzaW9uIG91dGNvbWVzXG4gICAgY29uc3QgZGVjaXNpb25zID0gdGhpcy5zdGF0ZS5kZWNpc2lvbnMuZmlsdGVyKGQgPT4gZC5nb2FsSWQgPT09IGdvYWxJZCk7XG4gICAgZGVjaXNpb25zLmZvckVhY2goZCA9PiB7XG4gICAgICBpZiAoIWQub3V0Y29tZSkge1xuICAgICAgICBkLm91dGNvbWUgPSBvdXRjb21lO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5pc0RpcnR5U3RhdGUgPSB0cnVlO1xuICAgIHRoaXMubWFya0RpcnR5KCk7XG5cbiAgICBsb2dnZXIuaW5mbyhgR29hbCAke2dvYWxJZH0gY29tcGxldGVkIHdpdGggb3V0Y29tZTogJHtvdXRjb21lfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCBkZXBlbmRlbmN5IGN5Y2xlcyBpbiBnb2FsIGRlcGVuZGVuY2llc1xuICAgKiBNRURJVU0gUFJJT1JJVFkgSU1QUk9WRU1FTlQ6IFByZXZlbnRzIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBiZXR3ZWVuIGdvYWxzXG4gICAqL1xuICBwcml2YXRlIGRldGVjdERlcGVuZGVuY3lDeWNsZShcbiAgICBuZXdHb2FsSWQ6IHN0cmluZywgXG4gICAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXVxuICApOiB7IGhhc0N5Y2xlOiBib29sZWFuOyBwYXRoOiBzdHJpbmdbXSB9IHtcbiAgICAvLyBCdWlsZCBkZXBlbmRlbmN5IGdyYXBoIGluY2x1ZGluZyB0aGUgbmV3IGdvYWxcbiAgICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgcmVjdXJzaW9uU3RhY2sgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBwYXRoOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHBlcmZvcm0gREZTXG4gICAgY29uc3QgaGFzQ3ljbGVERlMgPSAoZ29hbElkOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICAgIHZpc2l0ZWQuYWRkKGdvYWxJZCk7XG4gICAgICByZWN1cnNpb25TdGFjay5hZGQoZ29hbElkKTtcbiAgICAgIHBhdGgucHVzaChnb2FsSWQpO1xuXG4gICAgICAvLyBHZXQgZGVwZW5kZW5jaWVzIGZvciBjdXJyZW50IGdvYWxcbiAgICAgIGxldCBkZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWYgKGdvYWxJZCA9PT0gbmV3R29hbElkKSB7XG4gICAgICAgIC8vIEZvciB0aGUgbmV3IGdvYWwgYmVpbmcgYWRkZWQsIHVzZSBwcm92aWRlZCBkZXBlbmRlbmNpZXNcbiAgICAgICAgZGVwcyA9IGRlcGVuZGVuY2llcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBleGlzdGluZyBnb2FscywgZ2V0IGZyb20gc3RhdGVcbiAgICAgICAgY29uc3QgZ29hbCA9IHRoaXMuc3RhdGUuZ29hbHMuZmluZChnID0+IGcuaWQgPT09IGdvYWxJZCk7XG4gICAgICAgIGRlcHMgPSBnb2FsPy5kZXBlbmRlbmNpZXMgfHwgW107XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGVhY2ggZGVwZW5kZW5jeVxuICAgICAgZm9yIChjb25zdCBkZXBJZCBvZiBkZXBzKSB7XG4gICAgICAgIGlmICghdmlzaXRlZC5oYXMoZGVwSWQpKSB7XG4gICAgICAgICAgaWYgKGhhc0N5Y2xlREZTKGRlcElkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHJlY3Vyc2lvblN0YWNrLmhhcyhkZXBJZCkpIHtcbiAgICAgICAgICAvLyBGb3VuZCBhIGN5Y2xlIC0gYWRkIHRoZSByZXBlYXRlZCBub2RlIHRvIHNob3cgdGhlIGN5Y2xlXG4gICAgICAgICAgcGF0aC5wdXNoKGRlcElkKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZWN1cnNpb25TdGFjay5kZWxldGUoZ29hbElkKTtcbiAgICAgIC8vIE9ubHkgcG9wIGZyb20gcGF0aCBpZiB3ZSdyZSBub3QgcmV0dXJuaW5nIGEgY3ljbGVcbiAgICAgIGlmICghZGVwcy5zb21lKGRlcElkID0+IHJlY3Vyc2lvblN0YWNrLmhhcyhkZXBJZCkpKSB7XG4gICAgICAgIHBhdGgucG9wKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIENoZWNrIGlmIGFkZGluZyB0aGlzIGdvYWwgd291bGQgY3JlYXRlIGEgY3ljbGVcbiAgICBjb25zdCBoYXNDeWNsZSA9IGhhc0N5Y2xlREZTKG5ld0dvYWxJZCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaGFzQ3ljbGUsXG4gICAgICBwYXRoOiBoYXNDeWNsZSA/IHBhdGggOiBbXVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGdvYWxzIGJ5IHN0YXR1c1xuICAgKi9cbiAgcHVibGljIGdldEdvYWxzQnlTdGF0dXMoc3RhdHVzOiBBZ2VudEdvYWxbJ3N0YXR1cyddKTogQWdlbnRHb2FsW10ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmdvYWxzLmZpbHRlcihnID0+IGcuc3RhdHVzID09PSBzdGF0dXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBnb2FscyBieSBxdWFkcmFudFxuICAgKi9cbiAgcHVibGljIGdldEdvYWxzQnlRdWFkcmFudChxdWFkcmFudDogQWdlbnRHb2FsWydlaXNlbmhvd2VyUXVhZHJhbnQnXSk6IEFnZW50R29hbFtdIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5nb2Fscy5maWx0ZXIoZyA9PiBnLmVpc2VuaG93ZXJRdWFkcmFudCA9PT0gcXVhZHJhbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBhZ2VudCBwZXJmb3JtYW5jZSBtZXRyaWNzXG4gICAqIE1FRElVTSBQUklPUklUWSBJTVBST1ZFTUVOVDogRW5oYW5jZWQgdG8gaW5jbHVkZSBkZWNpc2lvbiB0aW1pbmcgbWV0cmljc1xuICAgKi9cbiAgcHVibGljIGdldFBlcmZvcm1hbmNlTWV0cmljcygpOiB7XG4gICAgc3VjY2Vzc1JhdGU6IG51bWJlcjtcbiAgICBhdmVyYWdlQ29tcGxldGlvblRpbWU6IG51bWJlcjtcbiAgICBnb2Fsc0NvbXBsZXRlZDogbnVtYmVyO1xuICAgIGdvYWxzSW5Qcm9ncmVzczogbnVtYmVyO1xuICAgIGRlY2lzaW9uQWNjdXJhY3k6IG51bWJlcjtcbiAgICBhdmVyYWdlRGVjaXNpb25UaW1lTXM/OiBudW1iZXI7XG4gICAgYXZlcmFnZUZyYW1ld29ya1RpbWVNcz86IG51bWJlcjtcbiAgICBhdmVyYWdlUmlza0Fzc2Vzc21lbnRUaW1lTXM/OiBudW1iZXI7XG4gIH0ge1xuICAgIGNvbnN0IGNvbXBsZXRlZEdvYWxzID0gdGhpcy5zdGF0ZS5nb2Fscy5maWx0ZXIoZyA9PiBnLnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcpO1xuICAgIGNvbnN0IGZhaWxlZEdvYWxzID0gdGhpcy5zdGF0ZS5nb2Fscy5maWx0ZXIoZyA9PiBnLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpO1xuICAgIGNvbnN0IGluUHJvZ3Jlc3NHb2FscyA9IHRoaXMuc3RhdGUuZ29hbHMuZmlsdGVyKGcgPT4gZy5zdGF0dXMgPT09ICdpbl9wcm9ncmVzcycpO1xuXG4gICAgY29uc3QgdG90YWxDb21wbGV0ZWQgPSBjb21wbGV0ZWRHb2Fscy5sZW5ndGggKyBmYWlsZWRHb2Fscy5sZW5ndGg7XG4gICAgY29uc3Qgc3VjY2Vzc1JhdGUgPSB0b3RhbENvbXBsZXRlZCA+IDAgPyBjb21wbGV0ZWRHb2Fscy5sZW5ndGggLyB0b3RhbENvbXBsZXRlZCA6IDA7XG5cbiAgICAvLyBDYWxjdWxhdGUgYXZlcmFnZSBjb21wbGV0aW9uIHRpbWVcbiAgICBsZXQgdG90YWxUaW1lID0gMDtcbiAgICBsZXQgdGltZUNvdW50ID0gMDtcbiAgICBjb21wbGV0ZWRHb2Fscy5mb3JFYWNoKGdvYWwgPT4ge1xuICAgICAgaWYgKGdvYWwuY29tcGxldGVkQXQgJiYgZ29hbC5jcmVhdGVkQXQpIHtcbiAgICAgICAgdG90YWxUaW1lICs9IGdvYWwuY29tcGxldGVkQXQuZ2V0VGltZSgpIC0gZ29hbC5jcmVhdGVkQXQuZ2V0VGltZSgpO1xuICAgICAgICB0aW1lQ291bnQrKztcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBhdmVyYWdlQ29tcGxldGlvblRpbWUgPSB0aW1lQ291bnQgPiAwID8gdG90YWxUaW1lIC8gdGltZUNvdW50IC8gKDEwMDAgKiA2MCAqIDYwKSA6IDA7IC8vIGluIGhvdXJzXG5cbiAgICAvLyBDYWxjdWxhdGUgZGVjaXNpb24gYWNjdXJhY3lcbiAgICBjb25zdCBkZWNpc2lvbnNXaXRoT3V0Y29tZSA9IHRoaXMuc3RhdGUuZGVjaXNpb25zLmZpbHRlcihkID0+IGQub3V0Y29tZSk7XG4gICAgY29uc3Qgc3VjY2Vzc2Z1bERlY2lzaW9ucyA9IGRlY2lzaW9uc1dpdGhPdXRjb21lLmZpbHRlcihkID0+IGQub3V0Y29tZSA9PT0gJ3N1Y2Nlc3MnKTtcbiAgICBjb25zdCBkZWNpc2lvbkFjY3VyYWN5ID0gZGVjaXNpb25zV2l0aE91dGNvbWUubGVuZ3RoID4gMFxuICAgICAgPyBzdWNjZXNzZnVsRGVjaXNpb25zLmxlbmd0aCAvIGRlY2lzaW9uc1dpdGhPdXRjb21lLmxlbmd0aFxuICAgICAgOiAwO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGF2ZXJhZ2UgZGVjaXNpb24gdGltaW5nIG1ldHJpY3NcbiAgICBjb25zdCBkZWNpc2lvbnNXaXRoTWV0cmljcyA9IHRoaXMuc3RhdGUuZGVjaXNpb25zLmZpbHRlcihkID0+IGQucGVyZm9ybWFuY2VNZXRyaWNzKTtcbiAgICBsZXQgYXZnRGVjaXNpb25UaW1lID0gMDtcbiAgICBsZXQgYXZnRnJhbWV3b3JrVGltZSA9IDA7XG4gICAgbGV0IGF2Z1Jpc2tUaW1lID0gMDtcbiAgICBcbiAgICBpZiAoZGVjaXNpb25zV2l0aE1ldHJpY3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgdG90YWxEZWNpc2lvblRpbWUgPSBkZWNpc2lvbnNXaXRoTWV0cmljcy5yZWR1Y2UoXG4gICAgICAgIChzdW0sIGQpID0+IHN1bSArIChkLnBlcmZvcm1hbmNlTWV0cmljcz8uZGVjaXNpb25UaW1lTXMgfHwgMCksIDBcbiAgICAgICk7XG4gICAgICBjb25zdCB0b3RhbEZyYW1ld29ya1RpbWUgPSBkZWNpc2lvbnNXaXRoTWV0cmljcy5yZWR1Y2UoXG4gICAgICAgIChzdW0sIGQpID0+IHN1bSArIChkLnBlcmZvcm1hbmNlTWV0cmljcz8uZnJhbWV3b3JrVGltZU1zIHx8IDApLCAwXG4gICAgICApO1xuICAgICAgY29uc3QgdG90YWxSaXNrVGltZSA9IGRlY2lzaW9uc1dpdGhNZXRyaWNzLnJlZHVjZShcbiAgICAgICAgKHN1bSwgZCkgPT4gc3VtICsgKGQucGVyZm9ybWFuY2VNZXRyaWNzPy5yaXNrQXNzZXNzbWVudFRpbWVNcyB8fCAwKSwgMFxuICAgICAgKTtcbiAgICAgIFxuICAgICAgYXZnRGVjaXNpb25UaW1lID0gdG90YWxEZWNpc2lvblRpbWUgLyBkZWNpc2lvbnNXaXRoTWV0cmljcy5sZW5ndGg7XG4gICAgICBhdmdGcmFtZXdvcmtUaW1lID0gdG90YWxGcmFtZXdvcmtUaW1lIC8gZGVjaXNpb25zV2l0aE1ldHJpY3MubGVuZ3RoO1xuICAgICAgYXZnUmlza1RpbWUgPSB0b3RhbFJpc2tUaW1lIC8gZGVjaXNpb25zV2l0aE1ldHJpY3MubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzUmF0ZSxcbiAgICAgIGF2ZXJhZ2VDb21wbGV0aW9uVGltZSxcbiAgICAgIGdvYWxzQ29tcGxldGVkOiBjb21wbGV0ZWRHb2Fscy5sZW5ndGgsXG4gICAgICBnb2Fsc0luUHJvZ3Jlc3M6IGluUHJvZ3Jlc3NHb2Fscy5sZW5ndGgsXG4gICAgICBkZWNpc2lvbkFjY3VyYWN5LFxuICAgICAgYXZlcmFnZURlY2lzaW9uVGltZU1zOiBkZWNpc2lvbnNXaXRoTWV0cmljcy5sZW5ndGggPiAwID8gYXZnRGVjaXNpb25UaW1lIDogdW5kZWZpbmVkLFxuICAgICAgYXZlcmFnZUZyYW1ld29ya1RpbWVNczogZGVjaXNpb25zV2l0aE1ldHJpY3MubGVuZ3RoID4gMCA/IGF2Z0ZyYW1ld29ya1RpbWUgOiB1bmRlZmluZWQsXG4gICAgICBhdmVyYWdlUmlza0Fzc2Vzc21lbnRUaW1lTXM6IGRlY2lzaW9uc1dpdGhNZXRyaWNzLmxlbmd0aCA+IDAgPyBhdmdSaXNrVGltZSA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhlIGFnZW50XG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgdmFsaWRhdGUoKTogRWxlbWVudFZhbGlkYXRpb25SZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLnZhbGlkYXRlKCk7XG4gICAgY29uc3QgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JbXSA9IHJlc3VsdC5lcnJvcnMgfHwgW107XG4gICAgY29uc3Qgd2FybmluZ3M6IFZhbGlkYXRpb25XYXJuaW5nW10gPSByZXN1bHQud2FybmluZ3MgfHwgW107XG4gICAgY29uc3Qgc3VnZ2VzdGlvbnM6IHN0cmluZ1tdID0gcmVzdWx0LnN1Z2dlc3Rpb25zIHx8IFtdO1xuXG4gICAgLy8gVmFsaWRhdGUgZGVjaXNpb24gZnJhbWV3b3JrXG4gICAgaWYgKHRoaXMuZXh0ZW5zaW9ucz8uZGVjaXNpb25GcmFtZXdvcmsgJiYgIURFQ0lTSU9OX0ZSQU1FV09SS1MuaW5jbHVkZXModGhpcy5leHRlbnNpb25zLmRlY2lzaW9uRnJhbWV3b3JrIGFzIGFueSkpIHtcbiAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgZmllbGQ6ICdleHRlbnNpb25zLmRlY2lzaW9uRnJhbWV3b3JrJyxcbiAgICAgICAgbWVzc2FnZTogYEludmFsaWQgZGVjaXNpb24gZnJhbWV3b3JrLiBNdXN0IGJlIG9uZSBvZjogJHtERUNJU0lPTl9GUkFNRVdPUktTLmpvaW4oJywgJyl9YFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgcmlzayB0b2xlcmFuY2VcbiAgICBpZiAodGhpcy5leHRlbnNpb25zPy5yaXNrVG9sZXJhbmNlICYmICFSSVNLX1RPTEVSQU5DRV9MRVZFTFMuaW5jbHVkZXModGhpcy5leHRlbnNpb25zLnJpc2tUb2xlcmFuY2UgYXMgYW55KSkge1xuICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICBmaWVsZDogJ2V4dGVuc2lvbnMucmlza1RvbGVyYW5jZScsXG4gICAgICAgIG1lc3NhZ2U6IGBJbnZhbGlkIHJpc2sgdG9sZXJhbmNlLiBNdXN0IGJlIG9uZSBvZjogJHtSSVNLX1RPTEVSQU5DRV9MRVZFTFMuam9pbignLCAnKX1gXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBzdGF0ZSBzaXplXG4gICAgY29uc3Qgc3RhdGVTaXplID0gSlNPTi5zdHJpbmdpZnkodGhpcy5zdGF0ZSkubGVuZ3RoO1xuICAgIGlmIChzdGF0ZVNpemUgPiBBR0VOVF9MSU1JVFMuTUFYX1NUQVRFX1NJWkUpIHtcbiAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgZmllbGQ6ICdzdGF0ZScsXG4gICAgICAgIG1lc3NhZ2U6IGBTdGF0ZSBzaXplICgke3N0YXRlU2l6ZX0gYnl0ZXMpIGV4Y2VlZHMgbWF4aW11bSBvZiAke0FHRU5UX0xJTUlUUy5NQVhfU1RBVEVfU0laRX0gYnl0ZXNgXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3Igb3JwaGFuZWQgZGVwZW5kZW5jaWVzXG4gICAgY29uc3QgYWxsR29hbElkcyA9IG5ldyBTZXQodGhpcy5zdGF0ZS5nb2Fscy5tYXAoZyA9PiBnLmlkKSk7XG4gICAgdGhpcy5zdGF0ZS5nb2Fscy5mb3JFYWNoKGdvYWwgPT4ge1xuICAgICAgaWYgKGdvYWwuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGdvYWwuZGVwZW5kZW5jaWVzLmZvckVhY2goZGVwSWQgPT4ge1xuICAgICAgICAgIGlmICghYWxsR29hbElkcy5oYXMoZGVwSWQpKSB7XG4gICAgICAgICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICAgICAgZmllbGQ6IGBnb2FsLiR7Z29hbC5pZH0uZGVwZW5kZW5jaWVzYCxcbiAgICAgICAgICAgICAgbWVzc2FnZTogYERlcGVuZGVuY3kgJHtkZXBJZH0gbm90IGZvdW5kYCxcbiAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdtZWRpdW0nXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU3VnZ2VzdGlvbnNcbiAgICBpZiAodGhpcy5zdGF0ZS5nb2Fscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goJ0FkZCBzb21lIGdvYWxzIHRvIG1ha2UgdGhlIGFnZW50IGZ1bmN0aW9uYWwnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZXh0ZW5zaW9ucz8uc3BlY2lhbGl6YXRpb25zIHx8IHRoaXMuZXh0ZW5zaW9ucy5zcGVjaWFsaXphdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBzdWdnZXN0aW9ucy5wdXNoKCdDb25zaWRlciBhZGRpbmcgc3BlY2lhbGl6YXRpb25zIHRvIGltcHJvdmUgYWdlbnQgZm9jdXMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRyaWNzID0gdGhpcy5nZXRQZXJmb3JtYW5jZU1ldHJpY3MoKTtcbiAgICBpZiAobWV0cmljcy5zdWNjZXNzUmF0ZSA8IDAuNSAmJiBtZXRyaWNzLmdvYWxzQ29tcGxldGVkID4gNSkge1xuICAgICAgc3VnZ2VzdGlvbnMucHVzaCgnTG93IHN1Y2Nlc3MgcmF0ZSBkZXRlY3RlZC4gQ29uc2lkZXIgcmV2aWV3aW5nIGdvYWwgZGlmZmljdWx0eSBvciBkZWNpc2lvbiBmcmFtZXdvcmsnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsaWQ6IGVycm9ycy5sZW5ndGggPT09IDAsXG4gICAgICBlcnJvcnM6IGVycm9ycy5sZW5ndGggPiAwID8gZXJyb3JzIDogdW5kZWZpbmVkLFxuICAgICAgd2FybmluZ3M6IHdhcm5pbmdzLmxlbmd0aCA+IDAgPyB3YXJuaW5ncyA6IHVuZGVmaW5lZCxcbiAgICAgIHN1Z2dlc3Rpb25zOiBzdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gc3VnZ2VzdGlvbnMgOiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBhZ2VudCBpbmNsdWRpbmcgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgLi4uSlNPTi5wYXJzZShzdXBlci5zZXJpYWxpemUoKSksXG4gICAgICBzdGF0ZTogdGhpcy5zdGF0ZVxuICAgIH07XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGFnZW50IGluY2x1ZGluZyBzdGF0ZVxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGRlc2VyaWFsaXplKGRhdGE6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShkYXRhKTtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHZhbGlkYXRpb25SZXN1bHQubm9ybWFsaXplZENvbnRlbnQpO1xuICAgIFxuICAgIC8vIERlc2VyaWFsaXplIGJhc2UgcHJvcGVydGllc1xuICAgIHN1cGVyLmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGlkOiBwYXJzZWQuaWQsXG4gICAgICB0eXBlOiBwYXJzZWQudHlwZSxcbiAgICAgIHZlcnNpb246IHBhcnNlZC52ZXJzaW9uLFxuICAgICAgbWV0YWRhdGE6IHBhcnNlZC5tZXRhZGF0YSxcbiAgICAgIHJlZmVyZW5jZXM6IHBhcnNlZC5yZWZlcmVuY2VzLFxuICAgICAgZXh0ZW5zaW9uczogcGFyc2VkLmV4dGVuc2lvbnMsXG4gICAgICByYXRpbmdzOiBwYXJzZWQucmF0aW5nc1xuICAgIH0pKTtcblxuICAgIC8vIERlc2VyaWFsaXplIHN0YXRlIHdpdGggdmFsaWRhdGlvblxuICAgIGlmIChwYXJzZWQuc3RhdGUpIHtcbiAgICAgIC8vIFZhbGlkYXRlIHN0YXRlIHNpemVcbiAgICAgIGNvbnN0IHN0YXRlU3RyID0gSlNPTi5zdHJpbmdpZnkocGFyc2VkLnN0YXRlKTtcbiAgICAgIGlmIChzdGF0ZVN0ci5sZW5ndGggPiBBR0VOVF9MSU1JVFMuTUFYX1NUQVRFX1NJWkUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdGF0ZSBzaXplIGV4Y2VlZHMgbWF4aW11bSBvZiAke0FHRU5UX0xJTUlUUy5NQVhfU1RBVEVfU0laRX0gYnl0ZXNgKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVzdG9yZSBkYXRlc1xuICAgICAgaWYgKHBhcnNlZC5zdGF0ZS5nb2Fscykge1xuICAgICAgICBwYXJzZWQuc3RhdGUuZ29hbHMuZm9yRWFjaCgoZ29hbDogYW55KSA9PiB7XG4gICAgICAgICAgZ29hbC5jcmVhdGVkQXQgPSBuZXcgRGF0ZShnb2FsLmNyZWF0ZWRBdCk7XG4gICAgICAgICAgZ29hbC51cGRhdGVkQXQgPSBuZXcgRGF0ZShnb2FsLnVwZGF0ZWRBdCk7XG4gICAgICAgICAgaWYgKGdvYWwuY29tcGxldGVkQXQpIHtcbiAgICAgICAgICAgIGdvYWwuY29tcGxldGVkQXQgPSBuZXcgRGF0ZShnb2FsLmNvbXBsZXRlZEF0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyc2VkLnN0YXRlLmRlY2lzaW9ucykge1xuICAgICAgICBwYXJzZWQuc3RhdGUuZGVjaXNpb25zLmZvckVhY2goKGRlY2lzaW9uOiBhbnkpID0+IHtcbiAgICAgICAgICBkZWNpc2lvbi50aW1lc3RhbXAgPSBuZXcgRGF0ZShkZWNpc2lvbi50aW1lc3RhbXApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcnNlZC5zdGF0ZS5sYXN0QWN0aXZlKSB7XG4gICAgICAgIHBhcnNlZC5zdGF0ZS5sYXN0QWN0aXZlID0gbmV3IERhdGUocGFyc2VkLnN0YXRlLmxhc3RBY3RpdmUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0YXRlID0gcGFyc2VkLnN0YXRlO1xuICAgIH1cblxuICAgIHRoaXMuaXNEaXJ0eVN0YXRlID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQWdlbnQgYWN0aXZhdGlvblxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGFzeW5jIGFjdGl2YXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLmFjdGl2YXRlKCk7XG4gICAgXG4gICAgLy8gVXBkYXRlIHNlc3Npb24gdHJhY2tpbmdcbiAgICB0aGlzLnN0YXRlLnNlc3Npb25Db3VudCsrO1xuICAgIHRoaXMuc3RhdGUubGFzdEFjdGl2ZSA9IG5ldyBEYXRlKCk7XG4gICAgdGhpcy5pc0RpcnR5U3RhdGUgPSB0cnVlO1xuXG4gICAgLy8gTG9nIGFjdGl2YXRpb25cbiAgICBsb2dnZXIuaW5mbyhgQWdlbnQgJHt0aGlzLm1ldGFkYXRhLm5hbWV9IGFjdGl2YXRlZGAsIHtcbiAgICAgIHNlc3Npb25Db3VudDogdGhpcy5zdGF0ZS5zZXNzaW9uQ291bnQsXG4gICAgICBhY3RpdmVHb2FsczogdGhpcy5nZXRHb2Fsc0J5U3RhdHVzKCdpbl9wcm9ncmVzcycpLmxlbmd0aFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFnZW50IGRlYWN0aXZhdGlvblxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGFzeW5jIGRlYWN0aXZhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gU2F2ZSBhbnkgcGVuZGluZyBzdGF0ZVxuICAgIGlmICh0aGlzLmlzRGlydHlTdGF0ZSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBBZ2VudCAke3RoaXMubWV0YWRhdGEubmFtZX0gaGFzIHVuc2F2ZWQgc3RhdGUgY2hhbmdlc2ApO1xuICAgIH1cblxuICAgIGF3YWl0IHN1cGVyLmRlYWN0aXZhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhZ2VudCBuZWVkcyBzdGF0ZSBwZXJzaXN0ZW5jZVxuICAgKi9cbiAgcHVibGljIG5lZWRzU3RhdGVQZXJzaXN0ZW5jZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0RpcnR5U3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogTWFyayBzdGF0ZSBhcyBwZXJzaXN0ZWRcbiAgICovXG4gIHB1YmxpYyBtYXJrU3RhdGVQZXJzaXN0ZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pc0RpcnR5U3RhdGUgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBnb2FsIGZyb20gYSB0ZW1wbGF0ZVxuICAgKiBMT1cgUFJJT1JJVFkgSU1QUk9WRU1FTlQ6IEdvYWwgdGVtcGxhdGUgc3lzdGVtIGZvciBjb21tb24gcGF0dGVybnNcbiAgICovXG4gIHB1YmxpYyBhZGRHb2FsRnJvbVRlbXBsYXRlKFxuICAgIHRlbXBsYXRlSWQ6IHN0cmluZywgXG4gICAgY3VzdG9tRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IEFnZW50R29hbCB7XG4gICAgLy8gQXBwbHkgdGVtcGxhdGUgdG8gZ2V0IGdvYWwgZGF0YVxuICAgIGNvbnN0IGdvYWxEYXRhID0gYXBwbHlHb2FsVGVtcGxhdGUodGVtcGxhdGVJZCwgY3VzdG9tRmllbGRzKTtcbiAgICBcbiAgICAvLyBDcmVhdGUgZ29hbCB1c2luZyB0aGUgdGVtcGxhdGUgZGF0YVxuICAgIHJldHVybiB0aGlzLmFkZEdvYWwoZ29hbERhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0ZW1wbGF0ZSByZWNvbW1lbmRhdGlvbnMgYmFzZWQgb24gZ29hbCBkZXNjcmlwdGlvblxuICAgKi9cbiAgcHVibGljIGdldEdvYWxUZW1wbGF0ZVJlY29tbWVuZGF0aW9ucyhkZXNjcmlwdGlvbjogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiByZWNvbW1lbmRHb2FsVGVtcGxhdGUoZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgZ29hbCBhZ2FpbnN0IGl0cyB0ZW1wbGF0ZVxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlR29hbFRlbXBsYXRlKGdvYWxJZDogc3RyaW5nKTogeyB2YWxpZDogYm9vbGVhbjsgZXJyb3JzOiBzdHJpbmdbXSB9IHtcbiAgICBjb25zdCBnb2FsID0gdGhpcy5zdGF0ZS5nb2Fscy5maW5kKGcgPT4gZy5pZCA9PT0gZ29hbElkKTtcbiAgICBpZiAoIWdvYWwpIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3JzOiBbJ0dvYWwgbm90IGZvdW5kJ10gfTtcbiAgICB9XG5cbiAgICAvLyBJZiBnb2FsIHdhcyBjcmVhdGVkIGZyb20gdGVtcGxhdGUsIHZhbGlkYXRlIGFnYWluc3QgaXRcbiAgICBjb25zdCB0ZW1wbGF0ZUlkID0gKGdvYWwgYXMgYW55KS50ZW1wbGF0ZUlkO1xuICAgIHJldHVybiB2YWxpZGF0ZUdvYWxBZ2FpbnN0VGVtcGxhdGUoZ29hbCwgdGVtcGxhdGVJZCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHJ1bGUgZW5naW5lIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVSdWxlRW5naW5lQ29uZmlnKGNvbmZpZzogUGFydGlhbDxSdWxlRW5naW5lQ29uZmlnPik6IHZvaWQge1xuICAgIHRoaXMucnVsZUVuZ2luZUNvbmZpZyA9IHZhbGlkYXRlUnVsZUVuZ2luZUNvbmZpZyh7XG4gICAgICAuLi50aGlzLnJ1bGVFbmdpbmVDb25maWcsXG4gICAgICAuLi5jb25maWdcbiAgICB9KTtcbiAgICBcbiAgICAvLyBVcGRhdGUgZXh0ZW5zaW9uc1xuICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHtcbiAgICAgIC4uLnRoaXMuZXh0ZW5zaW9ucyxcbiAgICAgIHJ1bGVFbmdpbmVDb25maWc6IHRoaXMucnVsZUVuZ2luZUNvbmZpZ1xuICAgIH07XG4gICAgXG4gICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBydWxlIGVuZ2luZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0UnVsZUVuZ2luZUNvbmZpZygpOiBSZWFkb25seTxSdWxlRW5naW5lQ29uZmlnPiB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5ydWxlRW5naW5lQ29uZmlnIH07XG4gIH1cbn0iXX0=
|
|
895
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWxlbWVudHMvYWdlbnRzL0FnZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFPbkYsT0FBTyxFQUNMLFlBQVksRUFDWixjQUFjLEVBQ2QsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUN0QixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFHTCx3QkFBd0IsRUFDekIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQiwyQkFBMkIsRUFDNUIsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixNQUFNLE9BQU8sS0FBTSxTQUFRLFdBQVc7SUFDNUIsS0FBSyxDQUFhO0lBQ2xCLFlBQVksR0FBWSxLQUFLLENBQUM7SUFDOUIsZ0JBQWdCLENBQW1CO0lBRTNDLFlBQVksUUFBZ0M7UUFDMUMsc0JBQXNCO1FBQ3RCLE1BQU0saUJBQWlCLEdBQTJCO1lBQ2hELEdBQUcsUUFBUTtZQUNYLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxD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QUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7UUFDdEQsQ0FBQztRQUVELHlEQUF5RDtRQUN6RCxNQUFNLFVBQVUsR0FBSSxJQUFZLENBQUMsVUFBVSxDQUFDO1FBQzVDLE9BQU8sMkJBQTJCLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7T0FFRztJQUNJLHNCQUFzQixDQUFDLE1BQWlDO1FBQzdELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyx3QkFBd0IsQ0FBQztZQUMvQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0I7WUFDeEIsR0FBRyxNQUFNO1NBQ1YsQ0FBQyxDQUFDO1FBRUgsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUc7WUFDaEIsR0FBRyxJQUFJLENBQUMsVUFBVTtZQUNsQixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1NBQ3hDLENBQUM7UUFFRixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksbUJBQW1CO1FBQ3hCLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3RDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWdlbnQgZWxlbWVudCBpbXBsZW1lbnRhdGlvbi5cbiAqIEF1dG9ub21vdXMgZ29hbC1vcmllbnRlZCBhY3RvcnMgd2l0aCBkZWNpc2lvbi1tYWtpbmcgY2FwYWJpbGl0aWVzLlxuICogXG4gKiBTRUNVUklUWSBNRUFTVVJFUyBJTVBMRU1FTlRFRDpcbiAqIDEuIEdvYWwgdmFsaWRhdGlvbiB0byBwcmV2ZW50IG1hbGljaW91cyBvYmplY3RpdmVzXG4gKiAyLiBEZWNpc2lvbiBmcmFtZXdvcmsgc2FuZGJveGluZ1xuICogMy4gU3RhdGUgc2l6ZSBsaW1pdHMgdG8gcHJldmVudCBEb1NcbiAqIDQuIFJpc2sgYXNzZXNzbWVudCBmb3IgZGFtYWdlIHByZXZlbnRpb25cbiAqIDUuIEF1ZGl0IGxvZ2dpbmcgZm9yIGFsbCBkZWNpc2lvbnMgYW5kIGFjdGlvbnNcbiAqL1xuXG5pbXBvcnQgeyBCYXNlRWxlbWVudCB9IGZyb20gJy4uL0Jhc2VFbGVtZW50LmpzJztcbmltcG9ydCB7IElFbGVtZW50LCBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCwgVmFsaWRhdGlvbkVycm9yLCBWYWxpZGF0aW9uV2FybmluZywgRWxlbWVudFN0YXR1cyB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL2luZGV4LmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL3R5cGVzLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyLCBFcnJvckNhdGVnb3J5IH0gZnJvbSAnLi4vLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvckNvZGVzLCBTeXN0ZW1FcnJvckNvZGVzIH0gZnJvbSAnLi4vLi4vdXRpbHMvZXJyb3JDb2Rlcy5qcyc7XG5pbXBvcnQgeyBcbiAgQWdlbnRHb2FsLCBcbiAgQWdlbnREZWNpc2lvbiwgXG4gIEFnZW50U3RhdGUsIFxuICBBZ2VudE1ldGFkYXRhIFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IFxuICBBR0VOVF9MSU1JVFMsIFxuICBBR0VOVF9ERUZBVUxUUyxcbiAgREVDSVNJT05fRlJBTUVXT1JLUyxcbiAgUklTS19UT0xFUkFOQ0VfTEVWRUxTXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IFxuICBSdWxlRW5naW5lQ29uZmlnLCBcbiAgREVGQVVMVF9SVUxFX0VOR0lORV9DT05GSUcsIFxuICB2YWxpZGF0ZVJ1bGVFbmdpbmVDb25maWcgXG59IGZyb20gJy4vcnVsZUVuZ2luZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBcbiAgYXBwbHlHb2FsVGVtcGxhdGUsIFxuICByZWNvbW1lbmRHb2FsVGVtcGxhdGUsIFxuICB2YWxpZGF0ZUdvYWxBZ2FpbnN0VGVtcGxhdGUgXG59IGZyb20gJy4vZ29hbFRlbXBsYXRlcy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBBZ2VudCBleHRlbmRzIEJhc2VFbGVtZW50IGltcGxlbWVudHMgSUVsZW1lbnQge1xuICBwcml2YXRlIHN0YXRlOiBBZ2VudFN0YXRlO1xuICBwcml2YXRlIGlzRGlydHlTdGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHJ1bGVFbmdpbmVDb25maWc6IFJ1bGVFbmdpbmVDb25maWc7XG5cbiAgY29uc3RydWN0b3IobWV0YWRhdGE6IFBhcnRpYWw8QWdlbnRNZXRhZGF0YT4pIHtcbiAgICAvLyBTYW5pdGl6ZSBhbGwgaW5wdXRzXG4gICAgY29uc3Qgc2FuaXRpemVkTWV0YWRhdGE6IFBhcnRpYWw8QWdlbnRNZXRhZGF0YT4gPSB7XG4gICAgICAuLi5tZXRhZGF0YSxcbiAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUgPyBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG1ldGFkYXRhLm5hbWUpLm5vcm1hbGl6ZWRDb250ZW50LCAxMDApIDogdW5kZWZpbmVkLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uID8gc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShtZXRhZGF0YS5kZXNjcmlwdGlvbikubm9ybWFsaXplZENvbnRlbnQsIDUwMCkgOiB1bmRlZmluZWQsXG4gICAgICBzcGVjaWFsaXphdGlvbnM6IG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucz8ubWFwKHMgPT4gc2FuaXRpemVJbnB1dChzLCA1MCkpLFxuICAgICAgZGVjaXNpb25GcmFtZXdvcms6IG1ldGFkYXRhLmRlY2lzaW9uRnJhbWV3b3JrIHx8IEFHRU5UX0RFRkFVTFRTLkRFQ0lTSU9OX0ZSQU1FV09SSyxcbiAgICAgIHJpc2tUb2xlcmFuY2U6IG1ldGFkYXRhLnJpc2tUb2xlcmFuY2UgfHwgQUdFTlRfREVGQVVMVFMuUklTS19UT0xFUkFOQ0UsXG4gICAgICBsZWFybmluZ0VuYWJsZWQ6IG1ldGFkYXRhLmxlYXJuaW5nRW5hYmxlZCA/PyBBR0VOVF9ERUZBVUxUUy5MRUFSTklOR19FTkFCTEVELFxuICAgICAgbWF4Q29uY3VycmVudEdvYWxzOiBtZXRhZGF0YS5tYXhDb25jdXJyZW50R29hbHMgPz8gQUdFTlRfREVGQVVMVFMuTUFYX0NPTkNVUlJFTlRfR09BTFNcbiAgICB9O1xuXG4gICAgLy8gTUVESVVNIFBSSU9SSVRZIElNUFJPVkVNRU5UOiBWYWxpZGF0ZSBkZWNpc2lvbiBmcmFtZXdvcmsgY29uZmlndXJhdGlvblxuICAgIC8vIEVuc3VyZXMgb25seSBzdXBwb3J0ZWQgZnJhbWV3b3JrcyBhcmUgdXNlZFxuICAgIGlmIChzYW5pdGl6ZWRNZXRhZGF0YS5kZWNpc2lvbkZyYW1ld29yayAmJiBcbiAgICAgICAgIURFQ0lTSU9OX0ZSQU1FV09SS1MuaW5jbHVkZXMoc2FuaXRpemVkTWV0YWRhdGEuZGVjaXNpb25GcmFtZXdvcmspKSB7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoYEludmFsaWQgZGVjaXNpb24gZnJhbWV3b3JrOiAke3Nhbml0aXplZE1ldGFkYXRhLmRlY2lzaW9uRnJhbWV3b3JrfS4gYCArXG4gICAgICAgIGBTdXBwb3J0ZWQgZnJhbWV3b3JrczogJHtERUNJU0lPTl9GUkFNRVdPUktTLmpvaW4oJywgJyl9YCwgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX0ZSQU1FV09SSyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgcmlzayB0b2xlcmFuY2UgbGV2ZWxcbiAgICBpZiAoc2FuaXRpemVkTWV0YWRhdGEucmlza1RvbGVyYW5jZSAmJiBcbiAgICAgICAgIVJJU0tfVE9MRVJBTkNFX0xFVkVMUy5pbmNsdWRlcyhzYW5pdGl6ZWRNZXRhZGF0YS5yaXNrVG9sZXJhbmNlKSkge1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGBJbnZhbGlkIHJpc2sgdG9sZXJhbmNlOiAke3Nhbml0aXplZE1ldGFkYXRhLnJpc2tUb2xlcmFuY2V9LiBgICtcbiAgICAgICAgYFN1cHBvcnRlZCBsZXZlbHM6ICR7UklTS19UT0xFUkFOQ0VfTEVWRUxTLmpvaW4oJywgJyl9YCwgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1JJU0tfVE9MRVJBTkNFKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBtYXggY29uY3VycmVudCBnb2Fsc1xuICAgIGlmIChzYW5pdGl6ZWRNZXRhZGF0YS5tYXhDb25jdXJyZW50R29hbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbWF4R29hbHMgPSBzYW5pdGl6ZWRNZXRhZGF0YS5tYXhDb25jdXJyZW50R29hbHM7XG4gICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobWF4R29hbHMpIHx8IG1heEdvYWxzIDwgMSB8fCBtYXhHb2FscyA+IEFHRU5UX0xJTUlUUy5NQVhfR09BTFMpIHtcbiAgICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGBtYXhDb25jdXJyZW50R29hbHMgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kICR7QUdFTlRfTElNSVRTLk1BWF9HT0FMU31gLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfUkFOR0UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN1cGVyKEVsZW1lbnRUeXBlLkFHRU5ULCBzYW5pdGl6ZWRNZXRhZGF0YSk7XG5cbiAgICAvLyBJbml0aWFsaXplIHN0YXRlXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGdvYWxzOiBbXSxcbiAgICAgIGRlY2lzaW9uczogW10sXG4gICAgICBjb250ZXh0OiB7fSxcbiAgICAgIGxhc3RBY3RpdmU6IG5ldyBEYXRlKCksXG4gICAgICBzZXNzaW9uQ291bnQ6IDBcbiAgICB9O1xuXG4gICAgLy8gU2V0IGFnZW50LXNwZWNpZmljIGV4dGVuc2lvbnNcbiAgICB0aGlzLmV4dGVuc2lvbnMgPSB7XG4gICAgICBkZWNpc2lvbkZyYW1ld29yazogc2FuaXRpemVkTWV0YWRhdGEuZGVjaXNpb25GcmFtZXdvcmssXG4gICAgICByaXNrVG9sZXJhbmNlOiBzYW5pdGl6ZWRNZXRhZGF0YS5yaXNrVG9sZXJhbmNlLFxuICAgICAgbGVhcm5pbmdFbmFibGVkOiBzYW5pdGl6ZWRNZXRhZGF0YS5sZWFybmluZ0VuYWJsZWQsXG4gICAgICBzcGVjaWFsaXphdGlvbnM6IHNhbml0aXplZE1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucyB8fCBbXSxcbiAgICAgIHJ1bGVFbmdpbmVDb25maWc6IG1ldGFkYXRhLnJ1bGVFbmdpbmVDb25maWdcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBydWxlIGVuZ2luZSBjb25maWd1cmF0aW9uICh3aXRoIHZhbGlkYXRpb24pXG4gICAgdGhpcy5ydWxlRW5naW5lQ29uZmlnID0gdmFsaWRhdGVSdWxlRW5naW5lQ29uZmlnKFxuICAgICAgdGhpcy5leHRlbnNpb25zLnJ1bGVFbmdpbmVDb25maWcgfHwge31cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBnb2FsIHdpdGggc2VjdXJpdHkgdmFsaWRhdGlvblxuICAgKi9cbiAgcHVibGljIGFkZEdvYWwoZ29hbDogUGFydGlhbDxBZ2VudEdvYWw+KTogQWdlbnRHb2FsIHtcbiAgICAvLyBWYWxpZGF0ZSBnb2FsIGNvdW50XG4gICAgaWYgKHRoaXMuc3RhdGUuZ29hbHMubGVuZ3RoID49IEFHRU5UX0xJTUlUUy5NQVhfR09BTFMpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihgTWF4aW11bSBudW1iZXIgb2YgZ29hbHMgKCR7QUdFTlRfTElNSVRTLk1BWF9HT0FMU30pIHJlYWNoZWRgLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLk1BWF9HT0FMU19FWENFRURFRCk7XG4gICAgfVxuXG4gICAgLy8gU2FuaXRpemUgZ29hbCBkZXNjcmlwdGlvblxuICAgIGNvbnN0IHNhbml0aXplZERlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChcbiAgICAgIFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGdvYWwuZGVzY3JpcHRpb24gfHwgJycpLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgICAgQUdFTlRfTElNSVRTLk1BWF9HT0FMX0xFTkdUSFxuICAgICk7XG5cbiAgICBpZiAoIXNhbml0aXplZERlc2NyaXB0aW9uIHx8IHNhbml0aXplZERlc2NyaXB0aW9uLmxlbmd0aCA8IDMpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignR29hbCBkZXNjcmlwdGlvbiBtdXN0IGJlIGF0IGxlYXN0IDMgY2hhcmFjdGVycycsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuR09BTF9UT09fU0hPUlQpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGdvYWwgZm9yIHNlY3VyaXR5IHRocmVhdHNcbiAgICBjb25zdCBzZWN1cml0eUNoZWNrID0gdGhpcy52YWxpZGF0ZUdvYWxTZWN1cml0eShzYW5pdGl6ZWREZXNjcmlwdGlvbik7XG4gICAgaWYgKCFzZWN1cml0eUNoZWNrLnNhZmUpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdBZ2VudC5hZGRHb2FsJyxcbiAgICAgICAgZGV0YWlsczogYFBvdGVudGlhbGx5IG1hbGljaW91cyBnb2FsIHJlamVjdGVkOiAke3NlY3VyaXR5Q2hlY2sucmVhc29ufWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGFnZW50SWQ6IHRoaXMuaWQgfVxuICAgICAgfSk7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoYEdvYWwgY29udGFpbnMgcG90ZW50aWFsbHkgaGFybWZ1bCBjb250ZW50OiAke3NlY3VyaXR5Q2hlY2sucmVhc29ufWAsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSEFSTUZVTF9DT05URU5UKTtcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgRWlzZW5ob3dlciBxdWFkcmFudFxuICAgIGNvbnN0IGltcG9ydGFuY2UgPSBnb2FsLmltcG9ydGFuY2UgfHwgNTtcbiAgICBjb25zdCB1cmdlbmN5ID0gZ29hbC51cmdlbmN5IHx8IDU7XG4gICAgY29uc3QgZWlzZW5ob3dlclF1YWRyYW50ID0gdGhpcy5jYWxjdWxhdGVFaXNlbmhvd2VyUXVhZHJhbnQoaW1wb3J0YW5jZSwgdXJnZW5jeSk7XG5cbiAgICAvLyBDcmVhdGUgbmV3IGdvYWxcbiAgICBjb25zdCBuZXdHb2FsOiBBZ2VudEdvYWwgPSB7XG4gICAgICBpZDogYGdvYWxfJHtEYXRlLm5vdygpfV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KX1gLFxuICAgICAgZGVzY3JpcHRpb246IHNhbml0aXplZERlc2NyaXB0aW9uLFxuICAgICAgcHJpb3JpdHk6IGdvYWwucHJpb3JpdHkgfHwgQUdFTlRfREVGQVVMVFMuR09BTF9QUklPUklUWSxcbiAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgaW1wb3J0YW5jZSxcbiAgICAgIHVyZ2VuY3ksXG4gICAgICBlaXNlbmhvd2VyUXVhZHJhbnQsXG4gICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICBkZXBlbmRlbmNpZXM6IGdvYWwuZGVwZW5kZW5jaWVzIHx8IFtdLFxuICAgICAgcmlza0xldmVsOiBnb2FsLnJpc2tMZXZlbCB8fCAnbG93JyxcbiAgICAgIGVzdGltYXRlZEVmZm9ydDogZ29hbC5lc3RpbWF0ZWRFZmZvcnQsXG4gICAgICBub3RlczogZ29hbC5ub3RlcyA/IHNhbml0aXplSW5wdXQoZ29hbC5ub3RlcywgNTAwKSA6IHVuZGVmaW5lZFxuICAgIH07XG5cbiAgICAvLyBNRURJVU0gUFJJT1JJVFkgSU1QUk9WRU1FTlQ6IERldGVjdCBkZXBlbmRlbmN5IGN5Y2xlcyBiZWZvcmUgYWRkaW5nIGdvYWxcbiAgICBpZiAobmV3R29hbC5kZXBlbmRlbmNpZXMgJiYgbmV3R29hbC5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY3ljbGVDaGVjayA9IHRoaXMuZGV0ZWN0RGVwZW5kZW5jeUN5Y2xlKG5ld0dvYWwuaWQsIG5ld0dvYWwuZGVwZW5kZW5jaWVzKTtcbiAgICAgIGlmIChjeWNsZUNoZWNrLmhhc0N5Y2xlKSB7XG4gICAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihgRGVwZW5kZW5jeSBjeWNsZSBkZXRlY3RlZDogJHtjeWNsZUNoZWNrLnBhdGguam9pbignIOKGkiAnKX1gLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLkRFUEVOREVOQ1lfQ1lDTEUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUuZ29hbHMucHVzaChuZXdHb2FsKTtcbiAgICB0aGlzLmlzRGlydHlTdGF0ZSA9IHRydWU7XG4gICAgdGhpcy5tYXJrRGlydHkoKTtcblxuICAgIGxvZ2dlci5pbmZvKGBHb2FsIGFkZGVkIHRvIGFnZW50ICR7dGhpcy5tZXRhZGF0YS5uYW1lfWAsIHsgZ29hbElkOiBuZXdHb2FsLmlkIH0pO1xuXG4gICAgcmV0dXJuIG5ld0dvYWw7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhIGRlY2lzaW9uIGZvciBhIGdvYWxcbiAgICovXG4gIHB1YmxpYyBhc3luYyBtYWtlRGVjaXNpb24oZ29hbElkOiBzdHJpbmcsIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvbWlzZTxBZ2VudERlY2lzaW9uPiB7XG4gICAgLy8gTUVESVVNIFBSSU9SSVRZIElNUFJPVkVNRU5UOiBUcmFjayBwZXJmb3JtYW5jZSBtZXRyaWNzIGZvciBkZWNpc2lvbiBtYWtpbmdcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHBlcmZvcm1hbmNlTWV0cmljczoge1xuICAgICAgZGVjaXNpb25UaW1lTXM/OiBudW1iZXI7XG4gICAgICBmcmFtZXdvcmtUaW1lTXM/OiBudW1iZXI7XG4gICAgICByaXNrQXNzZXNzbWVudFRpbWVNcz86IG51bWJlcjtcbiAgICB9ID0ge307XG5cbiAgICBjb25zdCBnb2FsID0gdGhpcy5zdGF0ZS5nb2Fscy5maW5kKGcgPT4gZy5pZCA9PT0gZ29hbElkKTtcbiAgICBpZiAoIWdvYWwpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihgR29hbCAke2dvYWxJZH0gbm90IGZvdW5kYCwgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5HT0FMX05PVF9GT1VORCk7XG4gICAgfVxuXG4gICAgaWYgKGdvYWwuc3RhdHVzID09PSAnY29tcGxldGVkJyB8fCBnb2FsLnN0YXR1cyA9PT0gJ2NhbmNlbGxlZCcpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihgQ2Fubm90IG1ha2UgZGVjaXNpb24gZm9yICR7Z29hbC5zdGF0dXN9IGdvYWxgLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfR09BTF9TVEFUVVMpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBnb2FsIHN0YXR1c1xuICAgIGdvYWwuc3RhdHVzID0gJ2luX3Byb2dyZXNzJztcbiAgICBnb2FsLnVwZGF0ZWRBdCA9IG5ldyBEYXRlKCk7XG5cbiAgICAvLyBQcmVwYXJlIGRlY2lzaW9uIGNvbnRleHRcbiAgICBjb25zdCBkZWNpc2lvbkNvbnRleHQgPSB7XG4gICAgICAuLi50aGlzLnN0YXRlLmNvbnRleHQsXG4gICAgICAuLi5jb250ZXh0LFxuICAgICAgZ29hbCxcbiAgICAgIGFnZW50TWV0YWRhdGE6IHRoaXMubWV0YWRhdGEsXG4gICAgICBwcmV2aW91c0RlY2lzaW9uczogdGhpcy5zdGF0ZS5kZWNpc2lvbnMuZmlsdGVyKGQgPT4gZC5nb2FsSWQgPT09IGdvYWxJZClcbiAgICB9O1xuXG4gICAgLy8gTWFrZSBkZWNpc2lvbiBiYXNlZCBvbiBmcmFtZXdvcmsgKHdpdGggdGltaW5nKVxuICAgIGNvbnN0IGZyYW1ld29ya1N0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBkZWNpc2lvbiA9IGF3YWl0IHRoaXMuZXhlY3V0ZURlY2lzaW9uRnJhbWV3b3JrKGdvYWwsIGRlY2lzaW9uQ29udGV4dCk7XG4gICAgcGVyZm9ybWFuY2VNZXRyaWNzLmZyYW1ld29ya1RpbWVNcyA9IERhdGUubm93KCkgLSBmcmFtZXdvcmtTdGFydDtcblxuICAgIC8vIFJpc2sgYXNzZXNzbWVudCAod2l0aCB0aW1pbmcpXG4gICAgY29uc3Qgcmlza1N0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCByaXNrQXNzZXNzbWVudCA9IHRoaXMuYXNzZXNzUmlzayhkZWNpc2lvbiwgZ29hbCwgZGVjaXNpb25Db250ZXh0KTtcbiAgICBwZXJmb3JtYW5jZU1ldHJpY3Mucmlza0Fzc2Vzc21lbnRUaW1lTXMgPSBEYXRlLm5vdygpIC0gcmlza1N0YXJ0O1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRvdGFsIGRlY2lzaW9uIHRpbWVcbiAgICBwZXJmb3JtYW5jZU1ldHJpY3MuZGVjaXNpb25UaW1lTXMgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuXG4gICAgLy8gQ3JlYXRlIGRlY2lzaW9uIHJlY29yZFxuICAgIGNvbnN0IGRlY2lzaW9uUmVjb3JkOiBBZ2VudERlY2lzaW9uID0ge1xuICAgICAgaWQ6IGBkZWNpc2lvbl8ke0RhdGUubm93KCl9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpfWAsXG4gICAgICBnb2FsSWQsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICBkZWNpc2lvbjogZGVjaXNpb24uYWN0aW9uLFxuICAgICAgcmVhc29uaW5nOiBkZWNpc2lvbi5yZWFzb25pbmcsXG4gICAgICBmcmFtZXdvcms6IHRoaXMuZXh0ZW5zaW9ucz8uZGVjaXNpb25GcmFtZXdvcmsgfHwgQUdFTlRfREVGQVVMVFMuREVDSVNJT05fRlJBTUVXT1JLLFxuICAgICAgY29uZmlkZW5jZTogZGVjaXNpb24uY29uZmlkZW5jZSxcbiAgICAgIHJpc2tBc3Nlc3NtZW50LFxuICAgICAgcGVyZm9ybWFuY2VNZXRyaWNzICAvLyBBZGQgcGVyZm9ybWFuY2UgdHJhY2tpbmdcbiAgICB9O1xuXG4gICAgLy8gT1BUSU1JWkFUSU9OOiBVc2UgZWZmaWNpZW50IGNpcmN1bGFyIGJ1ZmZlciBwYXR0ZXJuXG4gICAgLy8gQWRkIHRvIGhpc3Rvcnkgd2l0aCBsaW1pdCAoYXZvaWQgYXJyYXkgc2xpY2luZyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlKVxuICAgIGlmICh0aGlzLnN0YXRlLmRlY2lzaW9ucy5sZW5ndGggPj0gQUdFTlRfTElNSVRTLk1BWF9ERUNJU0lPTl9ISVNUT1JZKSB7XG4gICAgICAvLyBSZW1vdmUgb2xkZXN0IGVudHJ5IGJlZm9yZSBhZGRpbmcgbmV3IG9uZSAoTyhuKSBidXQgaGFwcGVucyBpbmZyZXF1ZW50bHkpXG4gICAgICB0aGlzLnN0YXRlLmRlY2lzaW9ucy5zaGlmdCgpO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlLmRlY2lzaW9ucy5wdXNoKGRlY2lzaW9uUmVjb3JkKTtcblxuICAgIHRoaXMuaXNEaXJ0eVN0YXRlID0gdHJ1ZTtcbiAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuXG4gICAgLy8gTG9nIGRlY2lzaW9uIGZvciBhdWRpdFxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdBR0VOVF9ERUNJU0lPTicsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdBZ2VudC5tYWtlRGVjaXNpb24nLFxuICAgICAgZGV0YWlsczogYEFnZW50ICR7dGhpcy5tZXRhZGF0YS5uYW1lfSBtYWRlIGRlY2lzaW9uIGZvciBnb2FsICR7Z29hbElkfWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICBhZ2VudElkOiB0aGlzLmlkLFxuICAgICAgICBnb2FsSWQsXG4gICAgICAgIGZyYW1ld29yazogZGVjaXNpb25SZWNvcmQuZnJhbWV3b3JrLFxuICAgICAgICByaXNrTGV2ZWw6IHJpc2tBc3Nlc3NtZW50LmxldmVsXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGVjaXNpb25SZWNvcmQ7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBkZWNpc2lvbiBmcmFtZXdvcmtcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZURlY2lzaW9uRnJhbWV3b3JrKFxuICAgIGdvYWw6IEFnZW50R29hbCxcbiAgICBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8eyBhY3Rpb246IHN0cmluZzsgcmVhc29uaW5nOiBzdHJpbmc7IGNvbmZpZGVuY2U6IG51bWJlciB9PiB7XG4gICAgY29uc3QgZnJhbWV3b3JrID0gdGhpcy5leHRlbnNpb25zPy5kZWNpc2lvbkZyYW1ld29yayB8fCBBR0VOVF9ERUZBVUxUUy5ERUNJU0lPTl9GUkFNRVdPUks7XG5cbiAgICBzd2l0Y2ggKGZyYW1ld29yaykge1xuICAgICAgY2FzZSAncnVsZV9iYXNlZCc6XG4gICAgICAgIHJldHVybiB0aGlzLnJ1bGVCYXNlZERlY2lzaW9uKGdvYWwsIGNvbnRleHQpO1xuICAgICAgXG4gICAgICBjYXNlICdtbF9iYXNlZCc6XG4gICAgICAgIC8vIFBsYWNlaG9sZGVyIGZvciBNTC1iYXNlZCBkZWNpc2lvbnNcbiAgICAgICAgbG9nZ2VyLndhcm4oJ01MLWJhc2VkIGRlY2lzaW9ucyBub3QgeWV0IGltcGxlbWVudGVkLCBmYWxsaW5nIGJhY2sgdG8gcnVsZS1iYXNlZCcpO1xuICAgICAgICByZXR1cm4gdGhpcy5ydWxlQmFzZWREZWNpc2lvbihnb2FsLCBjb250ZXh0KTtcbiAgICAgIFxuICAgICAgY2FzZSAncHJvZ3JhbW1hdGljJzpcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvZ3JhbW1hdGljRGVjaXNpb24oZ29hbCwgY29udGV4dCk7XG4gICAgICBcbiAgICAgIGNhc2UgJ2h5YnJpZCc6XG4gICAgICAgIC8vIENvbWJpbmUgbXVsdGlwbGUgZnJhbWV3b3Jrc1xuICAgICAgICBjb25zdCBydWxlRGVjaXNpb24gPSBhd2FpdCB0aGlzLnJ1bGVCYXNlZERlY2lzaW9uKGdvYWwsIGNvbnRleHQpO1xuICAgICAgICBjb25zdCBwcm9nRGVjaXNpb24gPSBhd2FpdCB0aGlzLnByb2dyYW1tYXRpY0RlY2lzaW9uKGdvYWwsIGNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgLy8gQXZlcmFnZSBjb25maWRlbmNlIGFuZCBjb21iaW5lIHJlYXNvbmluZ1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFjdGlvbjogcnVsZURlY2lzaW9uLmNvbmZpZGVuY2UgPiBwcm9nRGVjaXNpb24uY29uZmlkZW5jZSA/IHJ1bGVEZWNpc2lvbi5hY3Rpb24gOiBwcm9nRGVjaXNpb24uYWN0aW9uLFxuICAgICAgICAgIHJlYXNvbmluZzogYFJ1bGUtYmFzZWQ6ICR7cnVsZURlY2lzaW9uLnJlYXNvbmluZ31cXG5Qcm9ncmFtbWF0aWM6ICR7cHJvZ0RlY2lzaW9uLnJlYXNvbmluZ31gLFxuICAgICAgICAgIGNvbmZpZGVuY2U6IChydWxlRGVjaXNpb24uY29uZmlkZW5jZSArIHByb2dEZWNpc2lvbi5jb25maWRlbmNlKSAvIDJcbiAgICAgICAgfTtcbiAgICAgIFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGBVbmtub3duIGRlY2lzaW9uIGZyYW1ld29yazogJHtmcmFtZXdvcmt9YCwgRXJyb3JDYXRlZ29yeS5TWVNURU1fRVJST1IsIFN5c3RlbUVycm9yQ29kZXMuVU5LTk9XTl9GUkFNRVdPUkspO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdWxlLWJhc2VkIGRlY2lzaW9uIG1ha2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBydWxlQmFzZWREZWNpc2lvbihcbiAgICBnb2FsOiBBZ2VudEdvYWwsXG4gICAgY29udGV4dDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPHsgYWN0aW9uOiBzdHJpbmc7IHJlYXNvbmluZzogc3RyaW5nOyBjb25maWRlbmNlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHJ1bGVzOiBBcnJheTx7XG4gICAgICBjb25kaXRpb246IChnOiBBZ2VudEdvYWwsIGN0eDogUmVjb3JkPHN0cmluZywgYW55PikgPT4gYm9vbGVhbjtcbiAgICAgIGFjdGlvbjogc3RyaW5nO1xuICAgICAgcmVhc29uaW5nOiBzdHJpbmc7XG4gICAgICBjb25maWRlbmNlOiBudW1iZXI7XG4gICAgfT4gPSBbXG4gICAgICAvLyBIaWdoIHByaW9yaXR5ICsgaGlnaCB1cmdlbmN5ID0gaW1tZWRpYXRlIGFjdGlvblxuICAgICAge1xuICAgICAgICBjb25kaXRpb246IChnKSA9PiBnLnByaW9yaXR5ID09PSB0aGlzLnJ1bGVFbmdpbmVDb25maWcucnVsZUJhc2VkLnByaW9yaXR5LmNyaXRpY2FsICYmIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZy51cmdlbmN5ID4gdGhpcy5ydWxlRW5naW5lQ29uZmlnLnJ1bGVCYXNlZC51cmdlbmN5VGhyZXNob2xkcy5pbW1lZGlhdGUsXG4gICAgICAgIGFjdGlvbjogdGhpcy5ydWxlRW5naW5lQ29uZmlnLmFjdGlvbnMuZXhlY3V0ZUltbWVkaWF0ZWx5LFxuICAgICAgICByZWFzb25pbmc6ICdDcml0aWNhbCBwcmlvcml0eSB3aXRoIGhpZ2ggdXJnZW5jeSByZXF1aXJlcyBpbW1lZGlhdGUgYWN0aW9uJyxcbiAgICAgICAgY29uZmlkZW5jZTogdGhpcy5ydWxlRW5naW5lQ29uZmlnLnJ1bGVCYXNlZC5jb25maWRlbmNlLmNyaXRpY2FsXG4gICAgICB9LFxuICAgICAgLy8gQmxvY2tlZCBieSBkZXBlbmRlbmNpZXNcbiAgICAgIHtcbiAgICAgICAgY29uZGl0aW9uOiAoZywgY3R4KSA9PiB7XG4gICAgICAgICAgaWYgKCFnLmRlcGVuZGVuY2llcyB8fCBnLmRlcGVuZGVuY2llcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgICBjb25zdCBibG9ja2VkRGVwcyA9IGcuZGVwZW5kZW5jaWVzLmZpbHRlcihkZXBJZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZXAgPSB0aGlzLnN0YXRlLmdvYWxzLmZpbmQoZ29hbCA9PiBnb2FsLmlkID09PSBkZXBJZCk7XG4gICAgICAgICAgICByZXR1cm4gZGVwICYmIGRlcC5zdGF0dXMgIT09ICdjb21wbGV0ZWQnO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBibG9ja2VkRGVwcy5sZW5ndGggPiAwO1xuICAgICAgICB9LFxuICAgICAgICBhY3Rpb246IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5hY3Rpb25zLndhaXRGb3JEZXBlbmRlbmNpZXMsXG4gICAgICAgIHJlYXNvbmluZzogJ0dvYWwgaGFzIGluY29tcGxldGUgZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgY29uZmlkZW5jZTogdGhpcy5ydWxlRW5naW5lQ29uZmlnLnJ1bGVCYXNlZC5jb25maWRlbmNlLmJsb2NrZWRcbiAgICAgIH0sXG4gICAgICAvLyBSaXNrIGFzc2Vzc21lbnRcbiAgICAgIHtcbiAgICAgICAgY29uZGl0aW9uOiAoZykgPT4gZy5yaXNrTGV2ZWwgPT09ICdoaWdoJyAmJiB0aGlzLmV4dGVuc2lvbnM/LnJpc2tUb2xlcmFuY2UgPT09ICdjb25zZXJ2YXRpdmUnLFxuICAgICAgICBhY3Rpb246IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5hY3Rpb25zLnJlcXVlc3RBcHByb3ZhbCxcbiAgICAgICAgcmVhc29uaW5nOiAnSGlnaCByaXNrIGdvYWwgcmVxdWlyZXMgYXBwcm92YWwgaW4gY29uc2VydmF0aXZlIG1vZGUnLFxuICAgICAgICBjb25maWRlbmNlOiB0aGlzLnJ1bGVFbmdpbmVDb25maWcucnVsZUJhc2VkLmNvbmZpZGVuY2Uucmlza0FwcHJvdmFsXG4gICAgICB9LFxuICAgICAgLy8gUmVzb3VyY2UgYXZhaWxhYmlsaXR5XG4gICAgICB7XG4gICAgICAgIGNvbmRpdGlvbjogKGcsIGN0eCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZUdvYWxzID0gdGhpcy5zdGF0ZS5nb2Fscy5maWx0ZXIoZ29hbCA9PiBnb2FsLnN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJykubGVuZ3RoO1xuICAgICAgICAgIGNvbnN0IG1heENvbmN1cnJlbnQgPSAodGhpcy5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhKS5tYXhDb25jdXJyZW50R29hbHMgfHwgQUdFTlRfREVGQVVMVFMuTUFYX0NPTkNVUlJFTlRfR09BTFM7XG4gICAgICAgICAgcmV0dXJuIGFjdGl2ZUdvYWxzID49IG1heENvbmN1cnJlbnQ7XG4gICAgICAgIH0sXG4gICAgICAgIGFjdGlvbjogdGhpcy5ydWxlRW5naW5lQ29uZmlnLmFjdGlvbnMucXVldWVGb3JMYXRlcixcbiAgICAgICAgcmVhc29uaW5nOiAnTWF4aW11bSBjb25jdXJyZW50IGdvYWxzIHJlYWNoZWQnLFxuICAgICAgICBjb25maWRlbmNlOiB0aGlzLnJ1bGVFbmdpbmVDb25maWcucnVsZUJhc2VkLmNvbmZpZGVuY2UucmVzb3VyY2VMaW1pdFxuICAgICAgfSxcbiAgICAgIC8vIERlZmF1bHQgYWN0aW9uXG4gICAgICB7XG4gICAgICAgIGNvbmRpdGlvbjogKCkgPT4gdHJ1ZSxcbiAgICAgICAgYWN0aW9uOiB0aGlzLnJ1bGVFbmdpbmVDb25maWcuYWN0aW9ucy5wcm9jZWVkV2l0aEdvYWwsXG4gICAgICAgIHJlYXNvbmluZzogJ05vIGJsb2NraW5nIGNvbmRpdGlvbnMgZm91bmQnLFxuICAgICAgICBjb25maWRlbmNlOiB0aGlzLnJ1bGVFbmdpbmVDb25maWcucnVsZUJhc2VkLmNvbmZpZGVuY2UuZGVmYXVsdFxuICAgICAgfVxuICAgIF07XG5cbiAgICAvLyBFdmFsdWF0ZSBydWxlcyBpbiBvcmRlclxuICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgICAgaWYgKHJ1bGUuY29uZGl0aW9uKGdvYWwsIGNvbnRleHQpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWN0aW9uOiBydWxlLmFjdGlvbixcbiAgICAgICAgICByZWFzb25pbmc6IHJ1bGUucmVhc29uaW5nLFxuICAgICAgICAgIGNvbmZpZGVuY2U6IHJ1bGUuY29uZmlkZW5jZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIChzaG91bGQgbm90IHJlYWNoIGhlcmUpXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogdGhpcy5ydWxlRW5naW5lQ29uZmlnLmFjdGlvbnMucmV2aWV3TWFudWFsbHksXG4gICAgICByZWFzb25pbmc6ICdObyBhcHBsaWNhYmxlIHJ1bGVzIGZvdW5kJyxcbiAgICAgIGNvbmZpZGVuY2U6IDAuNVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUHJvZ3JhbW1hdGljIGRlY2lzaW9uIG1ha2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9ncmFtbWF0aWNEZWNpc2lvbihcbiAgICBnb2FsOiBBZ2VudEdvYWwsXG4gICAgY29udGV4dDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPHsgYWN0aW9uOiBzdHJpbmc7IHJlYXNvbmluZzogc3RyaW5nOyBjb25maWRlbmNlOiBudW1iZXIgfT4ge1xuICAgIC8vIENhbGN1bGF0ZSBkZWNpc2lvbiBzY29yZSBiYXNlZCBvbiBtdWx0aXBsZSBmYWN0b3JzXG4gICAgbGV0IHNjb3JlID0gMDtcbiAgICBjb25zdCBmYWN0b3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gRmFjdG9yIDE6IEVpc2VuaG93ZXIgbWF0cml4XG4gICAgaWYgKGdvYWwuZWlzZW5ob3dlclF1YWRyYW50ID09PSAnZG9fZmlyc3QnKSB7XG4gICAgICBzY29yZSArPSB0aGlzLnJ1bGVFbmdpbmVDb25maWcucHJvZ3JhbW1hdGljLnNjb3JlV2VpZ2h0cy5laXNlbmhvd2VyLmRvRmlyc3Q7XG4gICAgICBmYWN0b3JzLnB1c2goJ0hpZ2ggaW1wb3J0YW5jZSBhbmQgdXJnZW5jeSAoRG8gRmlyc3QgcXVhZHJhbnQpJyk7XG4gICAgfSBlbHNlIGlmIChnb2FsLmVpc2VuaG93ZXJRdWFkcmFudCA9PT0gJ3NjaGVkdWxlJykge1xuICAgICAgc2NvcmUgKz0gdGhpcy5ydWxlRW5naW5lQ29uZmlnLnByb2dyYW1tYXRpYy5zY29yZVdlaWdodHMuZWlzZW5ob3dlci5zY2hlZHVsZTtcbiAgICAgIGZhY3RvcnMucHVzaCgnSGlnaCBpbXBvcnRhbmNlLCBsb3cgdXJnZW5jeSAoU2NoZWR1bGUgcXVhZHJhbnQpJyk7XG4gICAgfSBlbHNlIGlmIChnb2FsLmVpc2VuaG93ZXJRdWFkcmFudCA9PT0gJ2RlbGVnYXRlJykge1xuICAgICAgc2NvcmUgKz0gdGhpcy5ydWxlRW5naW5lQ29uZmlnLnByb2dyYW1tYXRpYy5zY29yZVdlaWdodHMuZWlzZW5ob3dlci5kZWxlZ2F0ZTtcbiAgICAgIGZhY3RvcnMucHVzaCgnTG93IGltcG9ydGFuY2UsIGhpZ2ggdXJnZW5jeSAoRGVsZWdhdGUgcXVhZHJhbnQpJyk7XG4gICAgfVxuXG4gICAgLy8gRmFjdG9yIDI6IFJpc2sgbGV2ZWxcbiAgICBpZiAoZ29hbC5yaXNrTGV2ZWwgPT09ICdsb3cnKSB7XG4gICAgICBzY29yZSArPSB0aGlzLnJ1bGVFbmdpbmVDb25maWcucHJvZ3JhbW1hdGljLnNjb3JlV2VpZ2h0cy5yaXNrLmxvdztcbiAgICAgIGZhY3RvcnMucHVzaCgnTG93IHJpc2snKTtcbiAgICB9IGVsc2UgaWYgKGdvYWwucmlza0xldmVsID09PSAnbWVkaXVtJykge1xuICAgICAgc2NvcmUgKz0gdGhpcy5ydWxlRW5naW5lQ29uZmlnLnByb2dyYW1tYXRpYy5zY29yZVdlaWdodHMucmlzay5tZWRpdW07XG4gICAgICBmYWN0b3JzLnB1c2goJ01lZGl1bSByaXNrJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjb3JlICs9IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5wcm9ncmFtbWF0aWMuc2NvcmVXZWlnaHRzLnJpc2suaGlnaDtcbiAgICAgIGZhY3RvcnMucHVzaCgnSGlnaCByaXNrIHBlbmFsdHknKTtcbiAgICB9XG5cbiAgICAvLyBGYWN0b3IgMzogRGVwZW5kZW5jaWVzXG4gICAgaWYgKCFnb2FsLmRlcGVuZGVuY2llcyB8fCBnb2FsLmRlcGVuZGVuY2llcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHNjb3JlICs9IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5wcm9ncmFtbWF0aWMuc2NvcmVXZWlnaHRzLm5vRGVwZW5kZW5jaWVzO1xuICAgICAgZmFjdG9ycy5wdXNoKCdObyBkZXBlbmRlbmNpZXMnKTtcbiAgICB9XG5cbiAgICAvLyBGYWN0b3IgNDogRXN0aW1hdGVkIGVmZm9ydFxuICAgIGlmIChnb2FsLmVzdGltYXRlZEVmZm9ydCAmJiBnb2FsLmVzdGltYXRlZEVmZm9ydCA8PSB0aGlzLnJ1bGVFbmdpbmVDb25maWcucHJvZ3JhbW1hdGljLnF1aWNrV2luSG91cnMpIHtcbiAgICAgIHNjb3JlICs9IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5wcm9ncmFtbWF0aWMuc2NvcmVXZWlnaHRzLnF1aWNrV2luO1xuICAgICAgZmFjdG9ycy5wdXNoKGBRdWljayB3aW4gKOKJpCR7dGhpcy5ydWxlRW5naW5lQ29uZmlnLnByb2dyYW1tYXRpYy5xdWlja1dpbkhvdXJzfSBob3VycylgKTtcbiAgICB9XG5cbiAgICAvLyBGYWN0b3IgNTogUHJldmlvdXMgc3VjY2VzcyByYXRlXG4gICAgY29uc3QgcHJldmlvdXNEZWNpc2lvbnMgPSB0aGlzLnN0YXRlLmRlY2lzaW9ucy5maWx0ZXIoZCA9PiBkLm91dGNvbWUgPT09ICdzdWNjZXNzJyk7XG4gICAgY29uc3Qgc3VjY2Vzc1JhdGUgPSBwcmV2aW91c0RlY2lzaW9ucy5sZW5ndGggLyBNYXRoLm1heCh0aGlzLnN0YXRlLmRlY2lzaW9ucy5sZW5ndGgsIDEpO1xuICAgIGlmIChzdWNjZXNzUmF0ZSA+IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5wcm9ncmFtbWF0aWMuc3VjY2Vzc1JhdGVUaHJlc2hvbGQpIHtcbiAgICAgIHNjb3JlICs9IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5wcm9ncmFtbWF0aWMuc2NvcmVXZWlnaHRzLnN1Y2Nlc3NCb251cztcbiAgICAgIGZhY3RvcnMucHVzaChgSGlnaCBzdWNjZXNzIHJhdGUgKCR7KHN1Y2Nlc3NSYXRlICogMTAwKS50b0ZpeGVkKDApfSUpYCk7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIGFjdGlvbiBiYXNlZCBvbiBzY29yZVxuICAgIGxldCBhY3Rpb246IHN0cmluZztcbiAgICBsZXQgY29uZmlkZW5jZTogbnVtYmVyO1xuXG4gICAgaWYgKHNjb3JlID49IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5wcm9ncmFtbWF0aWMuYWN0aW9uVGhyZXNob2xkcy5leGVjdXRlSW1tZWRpYXRlbHkpIHtcbiAgICAgIGFjdGlvbiA9IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5hY3Rpb25zLmV4ZWN1dGVJbW1lZGlhdGVseTtcbiAgICAgIGNvbmZpZGVuY2UgPSB0aGlzLnJ1bGVFbmdpbmVDb25maWcucHJvZ3JhbW1hdGljLmNvbmZpZGVuY2VMZXZlbHMuZXhlY3V0ZUltbWVkaWF0ZWx5O1xuICAgIH0gZWxzZSBpZiAoc2NvcmUgPj0gdGhpcy5ydWxlRW5naW5lQ29uZmlnLnByb2dyYW1tYXRpYy5hY3Rpb25UaHJlc2hvbGRzLnByb2NlZWQpIHtcbiAgICAgIGFjdGlvbiA9IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5hY3Rpb25zLnByb2NlZWRXaXRoR29hbDtcbiAgICAgIGNvbmZpZGVuY2UgPSB0aGlzLnJ1bGVFbmdpbmVDb25maWcucHJvZ3JhbW1hdGljLmNvbmZpZGVuY2VMZXZlbHMucHJvY2VlZDtcbiAgICB9IGVsc2UgaWYgKHNjb3JlID49IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5wcm9ncmFtbWF0aWMuYWN0aW9uVGhyZXNob2xkcy5zY2hlZHVsZSkge1xuICAgICAgYWN0aW9uID0gdGhpcy5ydWxlRW5naW5lQ29uZmlnLmFjdGlvbnMuc2NoZWR1bGVGb3JMYXRlcjtcbiAgICAgIGNvbmZpZGVuY2UgPSB0aGlzLnJ1bGVFbmdpbmVDb25maWcucHJvZ3JhbW1hdGljLmNvbmZpZGVuY2VMZXZlbHMuc2NoZWR1bGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdGlvbiA9IHRoaXMucnVsZUVuZ2luZUNvbmZpZy5hY3Rpb25zLnJldmlld0FuZFJldmlzZTtcbiAgICAgIGNvbmZpZGVuY2UgPSB0aGlzLnJ1bGVFbmdpbmVDb25maWcucHJvZ3JhbW1hdGljLmNvbmZpZGVuY2VMZXZlbHMucmV2aWV3O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb24sXG4gICAgICByZWFzb25pbmc6IGBTY29yZTogJHtzY29yZX0uIEZhY3RvcnM6ICR7ZmFjdG9ycy5qb2luKCcsICcpfWAsXG4gICAgICBjb25maWRlbmNlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3Nlc3MgcmlzayBmb3IgYSBkZWNpc2lvblxuICAgKi9cbiAgcHJpdmF0ZSBhc3Nlc3NSaXNrKFxuICAgIGRlY2lzaW9uOiB7IGFjdGlvbjogc3RyaW5nOyByZWFzb25pbmc6IHN0cmluZzsgY29uZmlkZW5jZTogbnVtYmVyIH0sXG4gICAgZ29hbDogQWdlbnRHb2FsLFxuICAgIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogQWdlbnREZWNpc2lvblsncmlza0Fzc2Vzc21lbnQnXSB7XG4gICAgY29uc3QgZmFjdG9yczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmlza1Njb3JlID0gMDtcblxuICAgIC8vIENoZWNrIGZvciBpbW1lZGlhdGUgZXhlY3V0aW9uIHdpdGggaGlnaCByaXNrXG4gICAgaWYgKGRlY2lzaW9uLmFjdGlvbiA9PT0gJ2V4ZWN1dGVfaW1tZWRpYXRlbHknICYmIGdvYWwucmlza0xldmVsID09PSAnaGlnaCcpIHtcbiAgICAgIGZhY3RvcnMucHVzaCgnSW1tZWRpYXRlIGV4ZWN1dGlvbiBvZiBoaWdoLXJpc2sgZ29hbCcpO1xuICAgICAgcmlza1Njb3JlICs9IDMwO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBsb3cgY29uZmlkZW5jZSBkZWNpc2lvbnNcbiAgICBpZiAoZGVjaXNpb24uY29uZmlkZW5jZSA8IDAuNikge1xuICAgICAgZmFjdG9ycy5wdXNoKCdMb3cgZGVjaXNpb24gY29uZmlkZW5jZScpO1xuICAgICAgcmlza1Njb3JlICs9IDIwO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBjb21wbGV4IGRlcGVuZGVuY2llc1xuICAgIGlmIChnb2FsLmRlcGVuZGVuY2llcyAmJiBnb2FsLmRlcGVuZGVuY2llcy5sZW5ndGggPiAzKSB7XG4gICAgICBmYWN0b3JzLnB1c2goJ0NvbXBsZXggZGVwZW5kZW5jeSBjaGFpbicpO1xuICAgICAgcmlza1Njb3JlICs9IDE1O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBhZ2dyZXNzaXZlIHJpc2sgdG9sZXJhbmNlIHdpdGggaGlnaC1yaXNrIGdvYWxcbiAgICBpZiAodGhpcy5leHRlbnNpb25zPy5yaXNrVG9sZXJhbmNlID09PSAnYWdncmVzc2l2ZScgJiYgZ29hbC5yaXNrTGV2ZWwgPT09ICdoaWdoJykge1xuICAgICAgZmFjdG9ycy5wdXNoKCdBZ2dyZXNzaXZlIHJpc2sgdG9sZXJhbmNlIHdpdGggaGlnaC1yaXNrIGdvYWwnKTtcbiAgICAgIHJpc2tTY29yZSArPSAyNTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgcmlzayBsZXZlbFxuICAgIGxldCBsZXZlbDogJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJztcbiAgICBjb25zdCBtaXRpZ2F0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChyaXNrU2NvcmUgPj0gNTApIHtcbiAgICAgIGxldmVsID0gJ2hpZ2gnO1xuICAgICAgbWl0aWdhdGlvbnMucHVzaCgnUmVxdWVzdCBodW1hbiBhcHByb3ZhbCcpO1xuICAgICAgbWl0aWdhdGlvbnMucHVzaCgnQ3JlYXRlIGJhY2t1cCBwbGFuJyk7XG4gICAgICBtaXRpZ2F0aW9ucy5wdXNoKCdNb25pdG9yIGNsb3NlbHknKTtcbiAgICB9IGVsc2UgaWYgKHJpc2tTY29yZSA+PSAyNSkge1xuICAgICAgbGV2ZWwgPSAnbWVkaXVtJztcbiAgICAgIG1pdGlnYXRpb25zLnB1c2goJ0FkZCBjaGVja3BvaW50cycpO1xuICAgICAgbWl0aWdhdGlvbnMucHVzaCgnUmV2aWV3IGFmdGVyIGNvbXBsZXRpb24nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV2ZWwgPSAnbG93JztcbiAgICAgIG1pdGlnYXRpb25zLnB1c2goJ1N0YW5kYXJkIG1vbml0b3JpbmcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGV2ZWwsXG4gICAgICBmYWN0b3JzLFxuICAgICAgbWl0aWdhdGlvbnM6IG1pdGlnYXRpb25zLmxlbmd0aCA+IDAgPyBtaXRpZ2F0aW9ucyA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIEVpc2VuaG93ZXIgcXVhZHJhbnRcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlRWlzZW5ob3dlclF1YWRyYW50KGltcG9ydGFuY2U6IG51bWJlciwgdXJnZW5jeTogbnVtYmVyKTogQWdlbnRHb2FsWydlaXNlbmhvd2VyUXVhZHJhbnQnXSB7XG4gICAgaWYgKGltcG9ydGFuY2UgPj0gNyAmJiB1cmdlbmN5ID49IDcpIHtcbiAgICAgIHJldHVybiAnZG9fZmlyc3QnO1xuICAgIH0gZWxzZSBpZiAoaW1wb3J0YW5jZSA+PSA3ICYmIHVyZ2VuY3kgPCA3KSB7XG4gICAgICByZXR1cm4gJ3NjaGVkdWxlJztcbiAgICB9IGVsc2UgaWYgKGltcG9ydGFuY2UgPCA3ICYmIHVyZ2VuY3kgPj0gNykge1xuICAgICAgcmV0dXJuICdkZWxlZ2F0ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnZWxpbWluYXRlJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZ29hbCBmb3Igc2VjdXJpdHkgdGhyZWF0c1xuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUdvYWxTZWN1cml0eShnb2FsOiBzdHJpbmcpOiB7IHNhZmU6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9IHtcbiAgICAvLyBDaGVjayBmb3IgY29tbWFuZCBpbmplY3Rpb24gcGF0dGVybnNcbiAgICBjb25zdCBkYW5nZXJvdXNQYXR0ZXJucyA9IFtcbiAgICAgIC9zeXN0ZW1cXHMqXFwoL2ksXG4gICAgICAvZXhlY1xccypcXCgvaSxcbiAgICAgIC9ldmFsXFxzKlxcKC9pLFxuICAgICAgL3JlcXVpcmVcXHMqXFwoL2ksXG4gICAgICAvaW1wb3J0XFxzKlxcKC9pLFxuICAgICAgL1xcJFxcey4qXFx9LyxcbiAgICAgIC9gLipgLyxcbiAgICAgIC9wcm9jZXNzXFwuXFx3Ky9pLFxuICAgICAgL2NoaWxkX3Byb2Nlc3MvaVxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgZGFuZ2Vyb3VzUGF0dGVybnMpIHtcbiAgICAgIGlmIChwYXR0ZXJuLnRlc3QoZ29hbCkpIHtcbiAgICAgICAgcmV0dXJuIHsgc2FmZTogZmFsc2UsIHJlYXNvbjogJ0NvbnRhaW5zIHBvdGVudGlhbGx5IGRhbmdlcm91cyBjb2RlIHBhdHRlcm5zJyB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBzb2NpYWwgZW5naW5lZXJpbmcgYXR0ZW1wdHNcbiAgICBjb25zdCBzb2NpYWxFbmdpbmVlcmluZ1BhdHRlcm5zID0gW1xuICAgICAgL3Bhc3N3b3JkfGNyZWRlbnRpYWx8c2VjcmV0fHRva2VufGtleS9pLFxuICAgICAgL2hhY2t8ZXhwbG9pdHxicmVhY2h8YXR0YWNrL2ksXG4gICAgICAvZGVsZXRlXFxzK2FsbHxkZXN0cm95fHdpcGV8ZXJhc2VcXHMrZXZlcnl0aGluZy9pLFxuICAgICAgL3N0ZWFsfHRoZWZ0fHJvYi9pXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBzb2NpYWxFbmdpbmVlcmluZ1BhdHRlcm5zKSB7XG4gICAgICBpZiAocGF0dGVybi50ZXN0KGdvYWwpKSB7XG4gICAgICAgIHJldHVybiB7IHNhZmU6IGZhbHNlLCByZWFzb246ICdDb250YWlucyBwb3RlbnRpYWxseSBoYXJtZnVsIGludGVudCcgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBzYWZlOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFnZW50IHN0YXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhdGUoKTogUmVhZG9ubHk8QWdlbnRTdGF0ZT4ge1xuICAgIHJldHVybiB7IC4uLnRoaXMuc3RhdGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYWdlbnQgY29udGV4dFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUNvbnRleHQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBzYW5pdGl6ZWRLZXkgPSBzYW5pdGl6ZUlucHV0KGtleSwgNTApO1xuICAgIFxuICAgIC8vIFZhbGlkYXRlIGNvbnRleHQgc2l6ZVxuICAgIGNvbnN0IGNvbnRleHRTdHIgPSBKU09OLnN0cmluZ2lmeSh7IC4uLnRoaXMuc3RhdGUuY29udGV4dCwgW3Nhbml0aXplZEtleV06IHZhbHVlIH0pO1xuICAgIGlmIChjb250ZXh0U3RyLmxlbmd0aCA+IEFHRU5UX0xJTUlUUy5NQVhfQ09OVEVYVF9MRU5HVEgpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihgQ29udGV4dCBzaXplIGV4Y2VlZHMgbWF4aW11bSBvZiAke0FHRU5UX0xJTUlUUy5NQVhfQ09OVEVYVF9MRU5HVEh9IGNoYXJhY3RlcnNgLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLkNPTlRFWFRfVE9PX0xBUkdFKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlLmNvbnRleHRbc2FuaXRpemVkS2V5XSA9IHZhbHVlO1xuICAgIHRoaXMuaXNEaXJ0eVN0YXRlID0gdHJ1ZTtcbiAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlIGEgZ29hbFxuICAgKi9cbiAgcHVibGljIGNvbXBsZXRlR29hbChnb2FsSWQ6IHN0cmluZywgb3V0Y29tZTogJ3N1Y2Nlc3MnIHwgJ2ZhaWx1cmUnIHwgJ3BhcnRpYWwnID0gJ3N1Y2Nlc3MnKTogdm9pZCB7XG4gICAgY29uc3QgZ29hbCA9IHRoaXMuc3RhdGUuZ29hbHMuZmluZChnID0+IGcuaWQgPT09IGdvYWxJZCk7XG4gICAgaWYgKCFnb2FsKSB7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoYEdvYWwgJHtnb2FsSWR9IG5vdCBmb3VuZGAsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuR09BTF9OT1RfRk9VTkQpO1xuICAgIH1cblxuICAgIGdvYWwuc3RhdHVzID0gb3V0Y29tZSA9PT0gJ3N1Y2Nlc3MnID8gJ2NvbXBsZXRlZCcgOiAnZmFpbGVkJztcbiAgICBnb2FsLmNvbXBsZXRlZEF0ID0gbmV3IERhdGUoKTtcbiAgICBnb2FsLnVwZGF0ZWRBdCA9IG5ldyBEYXRlKCk7XG5cbiAgICAvLyBVcGRhdGUgYWN0dWFsIGVmZm9ydCBpZiBpdCB3YXMgYmVpbmcgdHJhY2tlZFxuICAgIGlmIChnb2FsLmVzdGltYXRlZEVmZm9ydCAmJiBnb2FsLmNyZWF0ZWRBdCkge1xuICAgICAgY29uc3QgaG91cnNFbGFwc2VkID0gKGdvYWwuY29tcGxldGVkQXQuZ2V0VGltZSgpIC0gZ29hbC5jcmVhdGVkQXQuZ2V0VGltZSgpKSAvICgxMDAwICogNjAgKiA2MCk7XG4gICAgICBnb2FsLmFjdHVhbEVmZm9ydCA9IE1hdGgucm91bmQoaG91cnNFbGFwc2VkICogMTApIC8gMTA7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGRlY2lzaW9uIG91dGNvbWVzXG4gICAgY29uc3QgZGVjaXNpb25zID0gdGhpcy5zdGF0ZS5kZWNpc2lvbnMuZmlsdGVyKGQgPT4gZC5nb2FsSWQgPT09IGdvYWxJZCk7XG4gICAgZGVjaXNpb25zLmZvckVhY2goZCA9PiB7XG4gICAgICBpZiAoIWQub3V0Y29tZSkge1xuICAgICAgICBkLm91dGNvbWUgPSBvdXRjb21lO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5pc0RpcnR5U3RhdGUgPSB0cnVlO1xuICAgIHRoaXMubWFya0RpcnR5KCk7XG5cbiAgICBsb2dnZXIuaW5mbyhgR29hbCAke2dvYWxJZH0gY29tcGxldGVkIHdpdGggb3V0Y29tZTogJHtvdXRjb21lfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCBkZXBlbmRlbmN5IGN5Y2xlcyBpbiBnb2FsIGRlcGVuZGVuY2llc1xuICAgKiBNRURJVU0gUFJJT1JJVFkgSU1QUk9WRU1FTlQ6IFByZXZlbnRzIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBiZXR3ZWVuIGdvYWxzXG4gICAqL1xuICBwcml2YXRlIGRldGVjdERlcGVuZGVuY3lDeWNsZShcbiAgICBuZXdHb2FsSWQ6IHN0cmluZywgXG4gICAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXVxuICApOiB7IGhhc0N5Y2xlOiBib29sZWFuOyBwYXRoOiBzdHJpbmdbXSB9IHtcbiAgICAvLyBCdWlsZCBkZXBlbmRlbmN5IGdyYXBoIGluY2x1ZGluZyB0aGUgbmV3IGdvYWxcbiAgICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgcmVjdXJzaW9uU3RhY2sgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBwYXRoOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHBlcmZvcm0gREZTXG4gICAgY29uc3QgaGFzQ3ljbGVERlMgPSAoZ29hbElkOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICAgIHZpc2l0ZWQuYWRkKGdvYWxJZCk7XG4gICAgICByZWN1cnNpb25TdGFjay5hZGQoZ29hbElkKTtcbiAgICAgIHBhdGgucHVzaChnb2FsSWQpO1xuXG4gICAgICAvLyBHZXQgZGVwZW5kZW5jaWVzIGZvciBjdXJyZW50IGdvYWxcbiAgICAgIGxldCBkZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWYgKGdvYWxJZCA9PT0gbmV3R29hbElkKSB7XG4gICAgICAgIC8vIEZvciB0aGUgbmV3IGdvYWwgYmVpbmcgYWRkZWQsIHVzZSBwcm92aWRlZCBkZXBlbmRlbmNpZXNcbiAgICAgICAgZGVwcyA9IGRlcGVuZGVuY2llcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBleGlzdGluZyBnb2FscywgZ2V0IGZyb20gc3RhdGVcbiAgICAgICAgY29uc3QgZ29hbCA9IHRoaXMuc3RhdGUuZ29hbHMuZmluZChnID0+IGcuaWQgPT09IGdvYWxJZCk7XG4gICAgICAgIGRlcHMgPSBnb2FsPy5kZXBlbmRlbmNpZXMgfHwgW107XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGVhY2ggZGVwZW5kZW5jeVxuICAgICAgZm9yIChjb25zdCBkZXBJZCBvZiBkZXBzKSB7XG4gICAgICAgIGlmICghdmlzaXRlZC5oYXMoZGVwSWQpKSB7XG4gICAgICAgICAgaWYgKGhhc0N5Y2xlREZTKGRlcElkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHJlY3Vyc2lvblN0YWNrLmhhcyhkZXBJZCkpIHtcbiAgICAgICAgICAvLyBGb3VuZCBhIGN5Y2xlIC0gYWRkIHRoZSByZXBlYXRlZCBub2RlIHRvIHNob3cgdGhlIGN5Y2xlXG4gICAgICAgICAgcGF0aC5wdXNoKGRlcElkKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZWN1cnNpb25TdGFjay5kZWxldGUoZ29hbElkKTtcbiAgICAgIC8vIE9ubHkgcG9wIGZyb20gcGF0aCBpZiB3ZSdyZSBub3QgcmV0dXJuaW5nIGEgY3ljbGVcbiAgICAgIGlmICghZGVwcy5zb21lKGRlcElkID0+IHJlY3Vyc2lvblN0YWNrLmhhcyhkZXBJZCkpKSB7XG4gICAgICAgIHBhdGgucG9wKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIENoZWNrIGlmIGFkZGluZyB0aGlzIGdvYWwgd291bGQgY3JlYXRlIGEgY3ljbGVcbiAgICBjb25zdCBoYXNDeWNsZSA9IGhhc0N5Y2xlREZTKG5ld0dvYWxJZCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaGFzQ3ljbGUsXG4gICAgICBwYXRoOiBoYXNDeWNsZSA/IHBhdGggOiBbXVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGdvYWxzIGJ5IHN0YXR1c1xuICAgKi9cbiAgcHVibGljIGdldEdvYWxzQnlTdGF0dXMoc3RhdHVzOiBBZ2VudEdvYWxbJ3N0YXR1cyddKTogQWdlbnRHb2FsW10ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmdvYWxzLmZpbHRlcihnID0+IGcuc3RhdHVzID09PSBzdGF0dXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBnb2FscyBieSBxdWFkcmFudFxuICAgKi9cbiAgcHVibGljIGdldEdvYWxzQnlRdWFkcmFudChxdWFkcmFudDogQWdlbnRHb2FsWydlaXNlbmhvd2VyUXVhZHJhbnQnXSk6IEFnZW50R29hbFtdIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5nb2Fscy5maWx0ZXIoZyA9PiBnLmVpc2VuaG93ZXJRdWFkcmFudCA9PT0gcXVhZHJhbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBhZ2VudCBwZXJmb3JtYW5jZSBtZXRyaWNzXG4gICAqIE1FRElVTSBQUklPUklUWSBJTVBST1ZFTUVOVDogRW5oYW5jZWQgdG8gaW5jbHVkZSBkZWNpc2lvbiB0aW1pbmcgbWV0cmljc1xuICAgKi9cbiAgcHVibGljIGdldFBlcmZvcm1hbmNlTWV0cmljcygpOiB7XG4gICAgc3VjY2Vzc1JhdGU6IG51bWJlcjtcbiAgICBhdmVyYWdlQ29tcGxldGlvblRpbWU6IG51bWJlcjtcbiAgICBnb2Fsc0NvbXBsZXRlZDogbnVtYmVyO1xuICAgIGdvYWxzSW5Qcm9ncmVzczogbnVtYmVyO1xuICAgIGRlY2lzaW9uQWNjdXJhY3k6IG51bWJlcjtcbiAgICBhdmVyYWdlRGVjaXNpb25UaW1lTXM/OiBudW1iZXI7XG4gICAgYXZlcmFnZUZyYW1ld29ya1RpbWVNcz86IG51bWJlcjtcbiAgICBhdmVyYWdlUmlza0Fzc2Vzc21lbnRUaW1lTXM/OiBudW1iZXI7XG4gIH0ge1xuICAgIGNvbnN0IGNvbXBsZXRlZEdvYWxzID0gdGhpcy5zdGF0ZS5nb2Fscy5maWx0ZXIoZyA9PiBnLnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcpO1xuICAgIGNvbnN0IGZhaWxlZEdvYWxzID0gdGhpcy5zdGF0ZS5nb2Fscy5maWx0ZXIoZyA9PiBnLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpO1xuICAgIGNvbnN0IGluUHJvZ3Jlc3NHb2FscyA9IHRoaXMuc3RhdGUuZ29hbHMuZmlsdGVyKGcgPT4gZy5zdGF0dXMgPT09ICdpbl9wcm9ncmVzcycpO1xuXG4gICAgY29uc3QgdG90YWxDb21wbGV0ZWQgPSBjb21wbGV0ZWRHb2Fscy5sZW5ndGggKyBmYWlsZWRHb2Fscy5sZW5ndGg7XG4gICAgY29uc3Qgc3VjY2Vzc1JhdGUgPSB0b3RhbENvbXBsZXRlZCA+IDAgPyBjb21wbGV0ZWRHb2Fscy5sZW5ndGggLyB0b3RhbENvbXBsZXRlZCA6IDA7XG5cbiAgICAvLyBDYWxjdWxhdGUgYXZlcmFnZSBjb21wbGV0aW9uIHRpbWVcbiAgICBsZXQgdG90YWxUaW1lID0gMDtcbiAgICBsZXQgdGltZUNvdW50ID0gMDtcbiAgICBjb21wbGV0ZWRHb2Fscy5mb3JFYWNoKGdvYWwgPT4ge1xuICAgICAgaWYgKGdvYWwuY29tcGxldGVkQXQgJiYgZ29hbC5jcmVhdGVkQXQpIHtcbiAgICAgICAgdG90YWxUaW1lICs9IGdvYWwuY29tcGxldGVkQXQuZ2V0VGltZSgpIC0gZ29hbC5jcmVhdGVkQXQuZ2V0VGltZSgpO1xuICAgICAgICB0aW1lQ291bnQrKztcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBhdmVyYWdlQ29tcGxldGlvblRpbWUgPSB0aW1lQ291bnQgPiAwID8gdG90YWxUaW1lIC8gdGltZUNvdW50IC8gKDEwMDAgKiA2MCAqIDYwKSA6IDA7IC8vIGluIGhvdXJzXG5cbiAgICAvLyBDYWxjdWxhdGUgZGVjaXNpb24gYWNjdXJhY3lcbiAgICBjb25zdCBkZWNpc2lvbnNXaXRoT3V0Y29tZSA9IHRoaXMuc3RhdGUuZGVjaXNpb25zLmZpbHRlcihkID0+IGQub3V0Y29tZSk7XG4gICAgY29uc3Qgc3VjY2Vzc2Z1bERlY2lzaW9ucyA9IGRlY2lzaW9uc1dpdGhPdXRjb21lLmZpbHRlcihkID0+IGQub3V0Y29tZSA9PT0gJ3N1Y2Nlc3MnKTtcbiAgICBjb25zdCBkZWNpc2lvbkFjY3VyYWN5ID0gZGVjaXNpb25zV2l0aE91dGNvbWUubGVuZ3RoID4gMFxuICAgICAgPyBzdWNjZXNzZnVsRGVjaXNpb25zLmxlbmd0aCAvIGRlY2lzaW9uc1dpdGhPdXRjb21lLmxlbmd0aFxuICAgICAgOiAwO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGF2ZXJhZ2UgZGVjaXNpb24gdGltaW5nIG1ldHJpY3NcbiAgICBjb25zdCBkZWNpc2lvbnNXaXRoTWV0cmljcyA9IHRoaXMuc3RhdGUuZGVjaXNpb25zLmZpbHRlcihkID0+IGQucGVyZm9ybWFuY2VNZXRyaWNzKTtcbiAgICBsZXQgYXZnRGVjaXNpb25UaW1lID0gMDtcbiAgICBsZXQgYXZnRnJhbWV3b3JrVGltZSA9IDA7XG4gICAgbGV0IGF2Z1Jpc2tUaW1lID0gMDtcbiAgICBcbiAgICBpZiAoZGVjaXNpb25zV2l0aE1ldHJpY3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgdG90YWxEZWNpc2lvblRpbWUgPSBkZWNpc2lvbnNXaXRoTWV0cmljcy5yZWR1Y2UoXG4gICAgICAgIChzdW0sIGQpID0+IHN1bSArIChkLnBlcmZvcm1hbmNlTWV0cmljcz8uZGVjaXNpb25UaW1lTXMgfHwgMCksIDBcbiAgICAgICk7XG4gICAgICBjb25zdCB0b3RhbEZyYW1ld29ya1RpbWUgPSBkZWNpc2lvbnNXaXRoTWV0cmljcy5yZWR1Y2UoXG4gICAgICAgIChzdW0sIGQpID0+IHN1bSArIChkLnBlcmZvcm1hbmNlTWV0cmljcz8uZnJhbWV3b3JrVGltZU1zIHx8IDApLCAwXG4gICAgICApO1xuICAgICAgY29uc3QgdG90YWxSaXNrVGltZSA9IGRlY2lzaW9uc1dpdGhNZXRyaWNzLnJlZHVjZShcbiAgICAgICAgKHN1bSwgZCkgPT4gc3VtICsgKGQucGVyZm9ybWFuY2VNZXRyaWNzPy5yaXNrQXNzZXNzbWVudFRpbWVNcyB8fCAwKSwgMFxuICAgICAgKTtcbiAgICAgIFxuICAgICAgYXZnRGVjaXNpb25UaW1lID0gdG90YWxEZWNpc2lvblRpbWUgLyBkZWNpc2lvbnNXaXRoTWV0cmljcy5sZW5ndGg7XG4gICAgICBhdmdGcmFtZXdvcmtUaW1lID0gdG90YWxGcmFtZXdvcmtUaW1lIC8gZGVjaXNpb25zV2l0aE1ldHJpY3MubGVuZ3RoO1xuICAgICAgYXZnUmlza1RpbWUgPSB0b3RhbFJpc2tUaW1lIC8gZGVjaXNpb25zV2l0aE1ldHJpY3MubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzUmF0ZSxcbiAgICAgIGF2ZXJhZ2VDb21wbGV0aW9uVGltZSxcbiAgICAgIGdvYWxzQ29tcGxldGVkOiBjb21wbGV0ZWRHb2Fscy5sZW5ndGgsXG4gICAgICBnb2Fsc0luUHJvZ3Jlc3M6IGluUHJvZ3Jlc3NHb2Fscy5sZW5ndGgsXG4gICAgICBkZWNpc2lvbkFjY3VyYWN5LFxuICAgICAgYXZlcmFnZURlY2lzaW9uVGltZU1zOiBkZWNpc2lvbnNXaXRoTWV0cmljcy5sZW5ndGggPiAwID8gYXZnRGVjaXNpb25UaW1lIDogdW5kZWZpbmVkLFxuICAgICAgYXZlcmFnZUZyYW1ld29ya1RpbWVNczogZGVjaXNpb25zV2l0aE1ldHJpY3MubGVuZ3RoID4gMCA/IGF2Z0ZyYW1ld29ya1RpbWUgOiB1bmRlZmluZWQsXG4gICAgICBhdmVyYWdlUmlza0Fzc2Vzc21lbnRUaW1lTXM6IGRlY2lzaW9uc1dpdGhNZXRyaWNzLmxlbmd0aCA+IDAgPyBhdmdSaXNrVGltZSA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhlIGFnZW50XG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgdmFsaWRhdGUoKTogRWxlbWVudFZhbGlkYXRpb25SZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLnZhbGlkYXRlKCk7XG4gICAgY29uc3QgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JbXSA9IHJlc3VsdC5lcnJvcnMgfHwgW107XG4gICAgY29uc3Qgd2FybmluZ3M6IFZhbGlkYXRpb25XYXJuaW5nW10gPSByZXN1bHQud2FybmluZ3MgfHwgW107XG4gICAgY29uc3Qgc3VnZ2VzdGlvbnM6IHN0cmluZ1tdID0gcmVzdWx0LnN1Z2dlc3Rpb25zIHx8IFtdO1xuXG4gICAgLy8gVmFsaWRhdGUgZGVjaXNpb24gZnJhbWV3b3JrXG4gICAgaWYgKHRoaXMuZXh0ZW5zaW9ucz8uZGVjaXNpb25GcmFtZXdvcmsgJiYgIURFQ0lTSU9OX0ZSQU1FV09SS1MuaW5jbHVkZXModGhpcy5leHRlbnNpb25zLmRlY2lzaW9uRnJhbWV3b3JrIGFzIGFueSkpIHtcbiAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgZmllbGQ6ICdleHRlbnNpb25zLmRlY2lzaW9uRnJhbWV3b3JrJyxcbiAgICAgICAgbWVzc2FnZTogYEludmFsaWQgZGVjaXNpb24gZnJhbWV3b3JrLiBNdXN0IGJlIG9uZSBvZjogJHtERUNJU0lPTl9GUkFNRVdPUktTLmpvaW4oJywgJyl9YFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgcmlzayB0b2xlcmFuY2VcbiAgICBpZiAodGhpcy5leHRlbnNpb25zPy5yaXNrVG9sZXJhbmNlICYmICFSSVNLX1RPTEVSQU5DRV9MRVZFTFMuaW5jbHVkZXModGhpcy5leHRlbnNpb25zLnJpc2tUb2xlcmFuY2UgYXMgYW55KSkge1xuICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICBmaWVsZDogJ2V4dGVuc2lvbnMucmlza1RvbGVyYW5jZScsXG4gICAgICAgIG1lc3NhZ2U6IGBJbnZhbGlkIHJpc2sgdG9sZXJhbmNlLiBNdXN0IGJlIG9uZSBvZjogJHtSSVNLX1RPTEVSQU5DRV9MRVZFTFMuam9pbignLCAnKX1gXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBzdGF0ZSBzaXplXG4gICAgY29uc3Qgc3RhdGVTaXplID0gSlNPTi5zdHJpbmdpZnkodGhpcy5zdGF0ZSkubGVuZ3RoO1xuICAgIGlmIChzdGF0ZVNpemUgPiBBR0VOVF9MSU1JVFMuTUFYX1NUQVRFX1NJWkUpIHtcbiAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgZmllbGQ6ICdzdGF0ZScsXG4gICAgICAgIG1lc3NhZ2U6IGBTdGF0ZSBzaXplICgke3N0YXRlU2l6ZX0gYnl0ZXMpIGV4Y2VlZHMgbWF4aW11bSBvZiAke0FHRU5UX0xJTUlUUy5NQVhfU1RBVEVfU0laRX0gYnl0ZXNgXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3Igb3JwaGFuZWQgZGVwZW5kZW5jaWVzXG4gICAgY29uc3QgYWxsR29hbElkcyA9IG5ldyBTZXQodGhpcy5zdGF0ZS5nb2Fscy5tYXAoZyA9PiBnLmlkKSk7XG4gICAgdGhpcy5zdGF0ZS5nb2Fscy5mb3JFYWNoKGdvYWwgPT4ge1xuICAgICAgaWYgKGdvYWwuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGdvYWwuZGVwZW5kZW5jaWVzLmZvckVhY2goZGVwSWQgPT4ge1xuICAgICAgICAgIGlmICghYWxsR29hbElkcy5oYXMoZGVwSWQpKSB7XG4gICAgICAgICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICAgICAgZmllbGQ6IGBnb2FsLiR7Z29hbC5pZH0uZGVwZW5kZW5jaWVzYCxcbiAgICAgICAgICAgICAgbWVzc2FnZTogYERlcGVuZGVuY3kgJHtkZXBJZH0gbm90IGZvdW5kYCxcbiAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdtZWRpdW0nXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU3VnZ2VzdGlvbnNcbiAgICBpZiAodGhpcy5zdGF0ZS5nb2Fscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goJ0FkZCBzb21lIGdvYWxzIHRvIG1ha2UgdGhlIGFnZW50IGZ1bmN0aW9uYWwnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZXh0ZW5zaW9ucz8uc3BlY2lhbGl6YXRpb25zIHx8IHRoaXMuZXh0ZW5zaW9ucy5zcGVjaWFsaXphdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBzdWdnZXN0aW9ucy5wdXNoKCdDb25zaWRlciBhZGRpbmcgc3BlY2lhbGl6YXRpb25zIHRvIGltcHJvdmUgYWdlbnQgZm9jdXMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRyaWNzID0gdGhpcy5nZXRQZXJmb3JtYW5jZU1ldHJpY3MoKTtcbiAgICBpZiAobWV0cmljcy5zdWNjZXNzUmF0ZSA8IDAuNSAmJiBtZXRyaWNzLmdvYWxzQ29tcGxldGVkID4gNSkge1xuICAgICAgc3VnZ2VzdGlvbnMucHVzaCgnTG93IHN1Y2Nlc3MgcmF0ZSBkZXRlY3RlZC4gQ29uc2lkZXIgcmV2aWV3aW5nIGdvYWwgZGlmZmljdWx0eSBvciBkZWNpc2lvbiBmcmFtZXdvcmsnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsaWQ6IGVycm9ycy5sZW5ndGggPT09IDAsXG4gICAgICBlcnJvcnM6IGVycm9ycy5sZW5ndGggPiAwID8gZXJyb3JzIDogdW5kZWZpbmVkLFxuICAgICAgd2FybmluZ3M6IHdhcm5pbmdzLmxlbmd0aCA+IDAgPyB3YXJuaW5ncyA6IHVuZGVmaW5lZCxcbiAgICAgIHN1Z2dlc3Rpb25zOiBzdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gc3VnZ2VzdGlvbnMgOiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0byBKU09OIGZvcm1hdCBmb3IgaW50ZXJuYWwgdXNlIGFuZCB0ZXN0aW5nXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgc2VyaWFsaXplVG9KU09OKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIC4uLkpTT04ucGFyc2Uoc3VwZXIuc2VyaWFsaXplVG9KU09OKCkpLFxuICAgICAgc3RhdGU6IHRoaXMuc3RhdGVcbiAgICB9O1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29udGVudCBmb3Igc2VyaWFsaXphdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldENvbnRlbnQoKTogc3RyaW5nIHtcbiAgICBsZXQgY29udGVudCA9IGAjICR7dGhpcy5tZXRhZGF0YS5uYW1lfVxcblxcbmA7XG4gICAgY29udGVudCArPSBgJHt0aGlzLm1ldGFkYXRhLmRlc2NyaXB0aW9ufVxcblxcbmA7XG4gICAgXG4gICAgaWYgKHRoaXMuc3RhdGUuZ29hbHMubGVuZ3RoID4gMCkge1xuICAgICAgY29udGVudCArPSBgIyMgQ3VycmVudCBHb2Fsc1xcblxcbmA7XG4gICAgICB0aGlzLnN0YXRlLmdvYWxzLmZvckVhY2goZ29hbCA9PiB7XG4gICAgICAgIGNvbnRlbnQgKz0gYCMjIyAke2dvYWwuZGVzY3JpcHRpb259XFxuYDtcbiAgICAgICAgY29udGVudCArPSBgLSAqKlByaW9yaXR5Kio6ICR7Z29hbC5wcmlvcml0eX1cXG5gO1xuICAgICAgICBjb250ZW50ICs9IGAtICoqU3RhdHVzKio6ICR7Z29hbC5zdGF0dXN9XFxuYDtcbiAgICAgICAgLy8gUHJvZ3Jlc3MgdHJhY2tpbmcgY291bGQgYmUgYWRkZWQgaW4gZnV0dXJlXG4gICAgICAgIC8vIGlmIChnb2FsLnByb2dyZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gICBjb250ZW50ICs9IGAtICoqUHJvZ3Jlc3MqKjogJHtnb2FsLnByb2dyZXNzfSVcXG5gO1xuICAgICAgICAvLyB9XG4gICAgICAgIGNvbnRlbnQgKz0gJ1xcbic7XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMuc3RhdGUuY29udGV4dCAmJiBPYmplY3Qua2V5cyh0aGlzLnN0YXRlLmNvbnRleHQpLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnRlbnQgKz0gYCMjIENvbnRleHRcXG5cXG5gO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zdGF0ZS5jb250ZXh0KSkge1xuICAgICAgICBjb250ZW50ICs9IGAtICoqJHtrZXl9Kio6ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfVxcbmA7XG4gICAgICB9XG4gICAgICBjb250ZW50ICs9ICdcXG4nO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgYWdlbnQgdG8gbWFya2Rvd24gZm9ybWF0IHdpdGggWUFNTCBmcm9udG1hdHRlclxuICAgKiBGSVg6IENoYW5nZWQgZnJvbSBKU09OIHRvIG1hcmtkb3duIGZvciBHaXRIdWIgcG9ydGZvbGlvIGNvbXBhdGliaWxpdHlcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogc3RyaW5nIHtcbiAgICAvLyBBZGQgYWdlbnQgc3RhdGUgdG8gZXh0ZW5zaW9ucyBmb3IgZnJvbnRtYXR0ZXJcbiAgICBjb25zdCBvcmlnaW5hbEV4dGVuc2lvbnMgPSB0aGlzLmV4dGVuc2lvbnM7XG4gICAgdGhpcy5leHRlbnNpb25zID0ge1xuICAgICAgLi4ub3JpZ2luYWxFeHRlbnNpb25zLFxuICAgICAgc3RhdGU6IHRoaXMuc3RhdGVcbiAgICB9O1xuICAgIFxuICAgIC8vIFVzZSBiYXNlIGNsYXNzIHNlcmlhbGl6ZSB3aGljaCBub3cgb3V0cHV0cyBtYXJrZG93blxuICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLnNlcmlhbGl6ZSgpO1xuICAgIFxuICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgZXh0ZW5zaW9uc1xuICAgIHRoaXMuZXh0ZW5zaW9ucyA9IG9yaWdpbmFsRXh0ZW5zaW9ucztcbiAgICBcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGFnZW50IGluY2x1ZGluZyBzdGF0ZVxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGRlc2VyaWFsaXplKGRhdGE6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShkYXRhKTtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHZhbGlkYXRpb25SZXN1bHQubm9ybWFsaXplZENvbnRlbnQpO1xuICAgIFxuICAgIC8vIERlc2VyaWFsaXplIGJhc2UgcHJvcGVydGllc1xuICAgIHN1cGVyLmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGlkOiBwYXJzZWQuaWQsXG4gICAgICB0eXBlOiBwYXJzZWQudHlwZSxcbiAgICAgIHZlcnNpb246IHBhcnNlZC52ZXJzaW9uLFxuICAgICAgbWV0YWRhdGE6IHBhcnNlZC5tZXRhZGF0YSxcbiAgICAgIHJlZmVyZW5jZXM6IHBhcnNlZC5yZWZlcmVuY2VzLFxuICAgICAgZXh0ZW5zaW9uczogcGFyc2VkLmV4dGVuc2lvbnMsXG4gICAgICByYXRpbmdzOiBwYXJzZWQucmF0aW5nc1xuICAgIH0pKTtcblxuICAgIC8vIERlc2VyaWFsaXplIHN0YXRlIHdpdGggdmFsaWRhdGlvblxuICAgIGlmIChwYXJzZWQuc3RhdGUpIHtcbiAgICAgIC8vIFZhbGlkYXRlIHN0YXRlIHNpemVcbiAgICAgIGNvbnN0IHN0YXRlU3RyID0gSlNPTi5zdHJpbmdpZnkocGFyc2VkLnN0YXRlKTtcbiAgICAgIGlmIChzdGF0ZVN0ci5sZW5ndGggPiBBR0VOVF9MSU1JVFMuTUFYX1NUQVRFX1NJWkUpIHtcbiAgICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGBTdGF0ZSBzaXplIGV4Y2VlZHMgbWF4aW11bSBvZiAke0FHRU5UX0xJTUlUUy5NQVhfU1RBVEVfU0laRX0gYnl0ZXNgLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLlNUQVRFX1RPT19MQVJHRSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc3RvcmUgZGF0ZXNcbiAgICAgIGlmIChwYXJzZWQuc3RhdGUuZ29hbHMpIHtcbiAgICAgICAgcGFyc2VkLnN0YXRlLmdvYWxzLmZvckVhY2goKGdvYWw6IGFueSkgPT4ge1xuICAgICAgICAgIGdvYWwuY3JlYXRlZEF0ID0gbmV3IERhdGUoZ29hbC5jcmVhdGVkQXQpO1xuICAgICAgICAgIGdvYWwudXBkYXRlZEF0ID0gbmV3IERhdGUoZ29hbC51cGRhdGVkQXQpO1xuICAgICAgICAgIGlmIChnb2FsLmNvbXBsZXRlZEF0KSB7XG4gICAgICAgICAgICBnb2FsLmNvbXBsZXRlZEF0ID0gbmV3IERhdGUoZ29hbC5jb21wbGV0ZWRBdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcnNlZC5zdGF0ZS5kZWNpc2lvbnMpIHtcbiAgICAgICAgcGFyc2VkLnN0YXRlLmRlY2lzaW9ucy5mb3JFYWNoKChkZWNpc2lvbjogYW55KSA9PiB7XG4gICAgICAgICAgZGVjaXNpb24udGltZXN0YW1wID0gbmV3IERhdGUoZGVjaXNpb24udGltZXN0YW1wKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJzZWQuc3RhdGUubGFzdEFjdGl2ZSkge1xuICAgICAgICBwYXJzZWQuc3RhdGUubGFzdEFjdGl2ZSA9IG5ldyBEYXRlKHBhcnNlZC5zdGF0ZS5sYXN0QWN0aXZlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdGF0ZSA9IHBhcnNlZC5zdGF0ZTtcbiAgICB9XG5cbiAgICB0aGlzLmlzRGlydHlTdGF0ZSA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFnZW50IGFjdGl2YXRpb25cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBhY3RpdmF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBzdXBlci5hY3RpdmF0ZSgpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzZXNzaW9uIHRyYWNraW5nXG4gICAgdGhpcy5zdGF0ZS5zZXNzaW9uQ291bnQrKztcbiAgICB0aGlzLnN0YXRlLmxhc3RBY3RpdmUgPSBuZXcgRGF0ZSgpO1xuICAgIHRoaXMuaXNEaXJ0eVN0YXRlID0gdHJ1ZTtcblxuICAgIC8vIExvZyBhY3RpdmF0aW9uXG4gICAgbG9nZ2VyLmluZm8oYEFnZW50ICR7dGhpcy5tZXRhZGF0YS5uYW1lfSBhY3RpdmF0ZWRgLCB7XG4gICAgICBzZXNzaW9uQ291bnQ6IHRoaXMuc3RhdGUuc2Vzc2lvbkNvdW50LFxuICAgICAgYWN0aXZlR29hbHM6IHRoaXMuZ2V0R29hbHNCeVN0YXR1cygnaW5fcHJvZ3Jlc3MnKS5sZW5ndGhcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZ2VudCBkZWFjdGl2YXRpb25cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBkZWFjdGl2YXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFNhdmUgYW55IHBlbmRpbmcgc3RhdGVcbiAgICBpZiAodGhpcy5pc0RpcnR5U3RhdGUpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgQWdlbnQgJHt0aGlzLm1ldGFkYXRhLm5hbWV9IGhhcyB1bnNhdmVkIHN0YXRlIGNoYW5nZXNgKTtcbiAgICB9XG5cbiAgICBhd2FpdCBzdXBlci5kZWFjdGl2YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWdlbnQgbmVlZHMgc3RhdGUgcGVyc2lzdGVuY2VcbiAgICovXG4gIHB1YmxpYyBuZWVkc1N0YXRlUGVyc2lzdGVuY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNEaXJ0eVN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmsgc3RhdGUgYXMgcGVyc2lzdGVkXG4gICAqL1xuICBwdWJsaWMgbWFya1N0YXRlUGVyc2lzdGVkKCk6IHZvaWQge1xuICAgIHRoaXMuaXNEaXJ0eVN0YXRlID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZ29hbCBmcm9tIGEgdGVtcGxhdGVcbiAgICogTE9XIFBSSU9SSVRZIElNUFJPVkVNRU5UOiBHb2FsIHRlbXBsYXRlIHN5c3RlbSBmb3IgY29tbW9uIHBhdHRlcm5zXG4gICAqL1xuICBwdWJsaWMgYWRkR29hbEZyb21UZW1wbGF0ZShcbiAgICB0ZW1wbGF0ZUlkOiBzdHJpbmcsIFxuICAgIGN1c3RvbUZpZWxkczogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBBZ2VudEdvYWwge1xuICAgIC8vIEFwcGx5IHRlbXBsYXRlIHRvIGdldCBnb2FsIGRhdGFcbiAgICBjb25zdCBnb2FsRGF0YSA9IGFwcGx5R29hbFRlbXBsYXRlKHRlbXBsYXRlSWQsIGN1c3RvbUZpZWxkcyk7XG4gICAgXG4gICAgLy8gQ3JlYXRlIGdvYWwgdXNpbmcgdGhlIHRlbXBsYXRlIGRhdGFcbiAgICByZXR1cm4gdGhpcy5hZGRHb2FsKGdvYWxEYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGVtcGxhdGUgcmVjb21tZW5kYXRpb25zIGJhc2VkIG9uIGdvYWwgZGVzY3JpcHRpb25cbiAgICovXG4gIHB1YmxpYyBnZXRHb2FsVGVtcGxhdGVSZWNvbW1lbmRhdGlvbnMoZGVzY3JpcHRpb246IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gcmVjb21tZW5kR29hbFRlbXBsYXRlKGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIGdvYWwgYWdhaW5zdCBpdHMgdGVtcGxhdGVcbiAgICovXG4gIHB1YmxpYyB2YWxpZGF0ZUdvYWxUZW1wbGF0ZShnb2FsSWQ6IHN0cmluZyk6IHsgdmFsaWQ6IGJvb2xlYW47IGVycm9yczogc3RyaW5nW10gfSB7XG4gICAgY29uc3QgZ29hbCA9IHRoaXMuc3RhdGUuZ29hbHMuZmluZChnID0+IGcuaWQgPT09IGdvYWxJZCk7XG4gICAgaWYgKCFnb2FsKSB7XG4gICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yczogWydHb2FsIG5vdCBmb3VuZCddIH07XG4gICAgfVxuXG4gICAgLy8gSWYgZ29hbCB3YXMgY3JlYXRlZCBmcm9tIHRlbXBsYXRlLCB2YWxpZGF0ZSBhZ2FpbnN0IGl0XG4gICAgY29uc3QgdGVtcGxhdGVJZCA9IChnb2FsIGFzIGFueSkudGVtcGxhdGVJZDtcbiAgICByZXR1cm4gdmFsaWRhdGVHb2FsQWdhaW5zdFRlbXBsYXRlKGdvYWwsIHRlbXBsYXRlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBydWxlIGVuZ2luZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlUnVsZUVuZ2luZUNvbmZpZyhjb25maWc6IFBhcnRpYWw8UnVsZUVuZ2luZUNvbmZpZz4pOiB2b2lkIHtcbiAgICB0aGlzLnJ1bGVFbmdpbmVDb25maWcgPSB2YWxpZGF0ZVJ1bGVFbmdpbmVDb25maWcoe1xuICAgICAgLi4udGhpcy5ydWxlRW5naW5lQ29uZmlnLFxuICAgICAgLi4uY29uZmlnXG4gICAgfSk7XG4gICAgXG4gICAgLy8gVXBkYXRlIGV4dGVuc2lvbnNcbiAgICB0aGlzLmV4dGVuc2lvbnMgPSB7XG4gICAgICAuLi50aGlzLmV4dGVuc2lvbnMsXG4gICAgICBydWxlRW5naW5lQ29uZmlnOiB0aGlzLnJ1bGVFbmdpbmVDb25maWdcbiAgICB9O1xuICAgIFxuICAgIHRoaXMubWFya0RpcnR5KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgcnVsZSBlbmdpbmUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHVibGljIGdldFJ1bGVFbmdpbmVDb25maWcoKTogUmVhZG9ubHk8UnVsZUVuZ2luZUNvbmZpZz4ge1xuICAgIHJldHVybiB7IC4uLnRoaXMucnVsZUVuZ2luZUNvbmZpZyB9O1xuICB9XG59Il19
|
|
@@ -16,6 +16,7 @@ interface ElementCreationResult {
|
|
|
16
16
|
export declare class AgentManager implements IElementManager<Agent> {
|
|
17
17
|
private readonly agentsPath;
|
|
18
18
|
private readonly stateCache;
|
|
19
|
+
private portfolioManager;
|
|
19
20
|
constructor(portfolioPath: string);
|
|
20
21
|
/**
|
|
21
22
|
* Initialize the agents directory structure
|
|
@@ -39,6 +40,7 @@ export declare class AgentManager implements IElementManager<Agent> {
|
|
|
39
40
|
delete(name: string): Promise<void>;
|
|
40
41
|
/**
|
|
41
42
|
* List all agents
|
|
43
|
+
* SECURITY: Uses PortfolioManager.listElements() which filters test elements
|
|
42
44
|
*/
|
|
43
45
|
list(): Promise<Agent[]>;
|
|
44
46
|
/**
|