@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
|
@@ -140,12 +140,12 @@ export class TemplateManager {
|
|
|
140
140
|
}
|
|
141
141
|
/**
|
|
142
142
|
* List all templates
|
|
143
|
-
* SECURITY FIX: Uses
|
|
143
|
+
* SECURITY FIX: Uses PortfolioManager.listElements() which filters test elements
|
|
144
144
|
*/
|
|
145
145
|
async list() {
|
|
146
146
|
try {
|
|
147
|
-
|
|
148
|
-
const templateFiles =
|
|
147
|
+
// Use PortfolioManager to get filtered list (excludes test elements)
|
|
148
|
+
const templateFiles = await this.portfolioManager.listElements(ElementType.TEMPLATE);
|
|
149
149
|
// Load templates in parallel with error handling
|
|
150
150
|
const templates = await Promise.all(templateFiles.map(async (file) => {
|
|
151
151
|
try {
|
|
@@ -303,7 +303,8 @@ export class TemplateManager {
|
|
|
303
303
|
try {
|
|
304
304
|
switch (format) {
|
|
305
305
|
case 'json':
|
|
306
|
-
|
|
306
|
+
// Use serializeToJSON for JSON format, or serialize if not available
|
|
307
|
+
return template.serializeToJSON ? template.serializeToJSON() : template.serialize();
|
|
307
308
|
case 'yaml':
|
|
308
309
|
// SECURITY FIX: Use yaml.dump with FAILSAFE_SCHEMA to prevent code execution
|
|
309
310
|
// Previously: Could potentially use unsafe YAML features
|
|
@@ -525,4 +526,4 @@ export class TemplateManager {
|
|
|
525
526
|
.slice(0, validatedLimit);
|
|
526
527
|
}
|
|
527
528
|
}
|
|
528
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVtcGxhdGVNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3RlbXBsYXRlcy9UZW1wbGF0ZU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFJSCxPQUFPLEVBQUUsUUFBUSxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBZ0IsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFFakMsTUFBTSxPQUFPLGVBQWU7SUFDbEIsZ0JBQWdCLENBQW1CO0lBQ25DLFlBQVksQ0FBUztJQUNyQixTQUFTLEdBQTBCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFckQ7UUFDRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMs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Q0FBQyxDQUFDLENBQUM7YUFDN0UsS0FBSyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRlbXBsYXRlTWFuYWdlciAtIEltcGxlbWVudGF0aW9uIG9mIElFbGVtZW50TWFuYWdlciBmb3IgVGVtcGxhdGUgZWxlbWVudHNcbiAqIEhhbmRsZXMgQ1JVRCBvcGVyYXRpb25zIGFuZCBsaWZlY3ljbGUgbWFuYWdlbWVudCBmb3IgdGVtcGxhdGVzIGltcGxlbWVudGluZyBJRWxlbWVudFxuICogXG4gKiBTRUNVUklUWSBGSVhFUyBJTVBMRU1FTlRFRCAoRm9sbG93aW5nIFBSICMzMTkgcGF0dGVybnMpOlxuICogMS4gQ1JJVElDQUw6IEZpeGVkIHJhY2UgY29uZGl0aW9ucyBpbiBmaWxlIG9wZXJhdGlvbnMgYnkgdXNpbmcgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgcmVhZHMvd3JpdGVzXG4gKiAyLiBDUklUSUNBTDogRml4ZWQgZHluYW1pYyByZXF1aXJlKCkgc3RhdGVtZW50cyBieSB1c2luZyBzdGF0aWMgaW1wb3J0c1xuICogMy4gSElHSDogRml4ZWQgdW52YWxpZGF0ZWQgWUFNTCBwYXJzaW5nIHZ1bG5lcmFiaWxpdHkgYnkgdXNpbmcgU2VjdXJlWWFtbFBhcnNlclxuICogNC4gTUVESVVNOiBBbGwgdXNlciBpbnB1dHMgYXJlIG5vdyB2YWxpZGF0ZWQgYW5kIHNhbml0aXplZFxuICogNS4gTUVESVVNOiBBdWRpdCBsb2dnaW5nIGFkZGVkIGZvciBzZWN1cml0eSBvcGVyYXRpb25zXG4gKiA2LiBNRURJVU06IFBhdGggdHJhdmVyc2FsIHByZXZlbnRpb24gZm9yIGFsbCBmaWxlIG9wZXJhdGlvbnNcbiAqL1xuXG5pbXBvcnQgeyBJRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZSwgVGVtcGxhdGVNZXRhZGF0YSB9IGZyb20gJy4vVGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQsIHZhbGlkYXRlUGF0aCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBtYXR0ZXIgZnJvbSAnZ3JheS1tYXR0ZXInO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVNYW5hZ2VyIGltcGxlbWVudHMgSUVsZW1lbnRNYW5hZ2VyPFRlbXBsYXRlPiB7XG4gIHByaXZhdGUgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcjtcbiAgcHJpdmF0ZSB0ZW1wbGF0ZXNEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSB0ZW1wbGF0ZXM6IE1hcDxzdHJpbmcsIFRlbXBsYXRlPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnBvcnRmb2xpb01hbmFnZXIgPSBQb3J0Zm9saW9NYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgdGhpcy50ZW1wbGF0ZXNEaXIgPSB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihFbGVtZW50VHlwZS5URU1QTEFURSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIHRlbXBsYXRlIGZyb20gZmlsZVxuICAgKiBTRUNVUklUWSBGSVggIzE6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1JlYWRGaWxlKCkgaW5zdGVhZCBvZiBmcy5yZWFkRmlsZSgpXG4gICAqIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIGFuZCBlbnN1cmUgYXRvbWljIGZpbGUgb3BlcmF0aW9uc1xuICAgKi9cbiAgYXN5bmMgbG9hZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxUZW1wbGF0ZT4ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWCAjNCAmICM2OiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgdGhlIGZpbGUgcGF0aFxuICAgIC8vIFByZXZpb3VzbHk6IERpcmVjdCB1c2Ugb2YgdXNlci1wcm92aWRlZCBwYXRocyBjb3VsZCBsZWFkIHRvIHBhdGggdHJhdmVyc2FsXG4gICAgLy8gTm93OiBGdWxsIHZhbGlkYXRpb24gcHJldmVudHMgYWNjZXNzaW5nIGZpbGVzIG91dHNpZGUgdGVtcGxhdGVzIGRpcmVjdG9yeVxuICAgIGNvbnN0IHNhbml0aXplZFBhdGggPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuICAgIFxuICAgIC8vIEVuc3VyZSB0aGUgcGF0aCBpcyB3aXRoaW4gdGhlIHRlbXBsYXRlcyBkaXJlY3RvcnlcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWRQYXRoKSBcbiAgICAgID8gc2FuaXRpemVkUGF0aCBcbiAgICAgIDogcGF0aC5qb2luKHRoaXMudGVtcGxhdGVzRGlyLCBzYW5pdGl6ZWRQYXRoKTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggIzY6IFByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5ub3JtYWxpemUoZnVsbFBhdGgpO1xuICAgIGlmICghbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aCh0aGlzLnRlbXBsYXRlc0RpcikpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLmxvYWQnLFxuICAgICAgICBkZXRhaWxzOiBgQXR0ZW1wdGVkIHRvIGFjY2VzcyBmaWxlIG91dHNpZGUgdGVtcGxhdGVzIGRpcmVjdG9yeTogJHtzYW5pdGl6ZWRQYXRofWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXRoIHRyYXZlcnNhbCBhdHRlbXB0IGRldGVjdGVkJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENSSVRJQ0FMIEZJWDogVXNlIGF0b21pYyBmaWxlIHJlYWQgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICAgIC8vIFByZXZpb3VzbHk6IGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmdWxsUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAvLyBOb3c6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyIHdpdGggcHJvcGVyIGVuY29kaW5nIG9iamVjdCBmb3JtYXRcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljUmVhZEZpbGUobm9ybWFsaXplZFBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICBcbiAgICAgIC8vIFBhcnNlIHRoZSB0ZW1wbGF0ZSBmaWxlIChleHBlY3RlZCBmb3JtYXQ6IFlBTUwgZnJvbnRtYXR0ZXIgKyBjb250ZW50KVxuICAgICAgY29uc3QgcGFyc2VkID0gbWF0dGVyKGNvbnRlbnQpO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVggIzM6IFZhbGlkYXRlIFlBTUwgbWV0YWRhdGEgdXNpbmcgU2VjdXJlWWFtbFBhcnNlclxuICAgICAgLy8gUHJldmlvdXNseTogRnJvbnRtYXR0ZXIgcGFyc2luZyBjb3VsZCBiZSB2dWxuZXJhYmxlIHRvIFlBTUwgaW5qZWN0aW9uXG4gICAgICAvLyBOb3c6IFNlY3VyZVlhbWxQYXJzZXIgdmFsaWRhdGVzIGFuZCBzYW5pdGl6ZXMgWUFNTCBjb250ZW50XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMudmFsaWRhdGVNZXRhZGF0YShwYXJzZWQuZGF0YSk7XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSB0aGUgdGVtcGxhdGUgaW5zdGFuY2VcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKG1ldGFkYXRhLCBwYXJzZWQuY29udGVudCk7XG4gICAgICBcbiAgICAgIC8vIENhY2hlIHRoZSB0ZW1wbGF0ZVxuICAgICAgdGhpcy50ZW1wbGF0ZXMuc2V0KG5vcm1hbGl6ZWRQYXRoLCB0ZW1wbGF0ZSk7XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZIEZJWCAjNTogTG9nIHN1Y2Nlc3NmdWwgdGVtcGxhdGUgbG9hZCBmb3IgYXVkaXQgdHJhaWxcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RFTVBMQVRFX0xPQURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLmxvYWQnLFxuICAgICAgICBkZXRhaWxzOiBgVGVtcGxhdGUgbG9hZGVkOiAke3RlbXBsYXRlLm1ldGFkYXRhLm5hbWV9IGZyb20gJHtwYXRoLmJhc2VuYW1lKG5vcm1hbGl6ZWRQYXRoKX1gXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkIHRlbXBsYXRlIGZyb20gJHtub3JtYWxpemVkUGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhIHRlbXBsYXRlIHRvIGZpbGVcbiAgICogU0VDVVJJVFkgRklYICMxOiBVc2VzIEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoKSBmb3IgYXRvbWljIG9wZXJhdGlvbnNcbiAgICovXG4gIGFzeW5jIHNhdmUodGVtcGxhdGU6IFRlbXBsYXRlLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYICM0OiBWYWxpZGF0ZSBpbnB1dHNcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gdGVtcGxhdGUudmFsaWRhdGUoKTtcbiAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNhdmUgaW52YWxpZCB0ZW1wbGF0ZTogJHt2YWxpZGF0aW9uLmVycm9ycz8ubWFwKGUgPT4gZS5tZXNzYWdlKS5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIFNFQ1VSSVRZIEZJWCAjNCAmICM2OiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgdGhlIGZpbGUgcGF0aFxuICAgIGNvbnN0IHNhbml0aXplZFBhdGggPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuICAgIFxuICAgIC8vIEVuc3VyZSB0aGUgcGF0aCBpcyB3aXRoaW4gdGhlIHRlbXBsYXRlcyBkaXJlY3RvcnlcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWRQYXRoKSBcbiAgICAgID8gc2FuaXRpemVkUGF0aCBcbiAgICAgIDogcGF0aC5qb2luKHRoaXMudGVtcGxhdGVzRGlyLCBzYW5pdGl6ZWRQYXRoKTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggIzY6IFByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5ub3JtYWxpemUoZnVsbFBhdGgpO1xuICAgIGlmICghbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aCh0aGlzLnRlbXBsYXRlc0RpcikpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLnNhdmUnLFxuICAgICAgICBkZXRhaWxzOiBgQXR0ZW1wdGVkIHRvIHNhdmUgZmlsZSBvdXRzaWRlIHRlbXBsYXRlcyBkaXJlY3Rvcnk6ICR7c2FuaXRpemVkUGF0aH1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCBkZXRlY3RlZCcpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKG5vcm1hbGl6ZWRQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSBmcm9udG1hdHRlciBjb250ZW50XG4gICAgICBjb25zdCBmcm9udG1hdHRlciA9IHRoaXMuY3JlYXRlRnJvbnRtYXR0ZXIodGVtcGxhdGUubWV0YWRhdGEpO1xuICAgICAgY29uc3QgY29udGVudCA9IGAtLS1cXG4ke2Zyb250bWF0dGVyfVxcbi0tLVxcblxcbiR7dGVtcGxhdGUuY29udGVudH1gO1xuICAgICAgXG4gICAgICAvLyBDUklUSUNBTCBGSVg6IFVzZSBhdG9taWMgZmlsZSB3cml0ZSB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgICAgLy8gUHJldmlvdXNseTogYXdhaXQgZnMud3JpdGVGaWxlKGZ1bGxQYXRoLCBjb250ZW50LCAndXRmLTgnKTtcbiAgICAgIC8vIE5vdzogVXNlcyBGaWxlTG9ja01hbmFnZXIgZm9yIGF0b21pYyBvcGVyYXRpb25zXG4gICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKG5vcm1hbGl6ZWRQYXRoLCBjb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICAgICAgXG4gICAgICAvLyBVcGRhdGUgY2FjaGVcbiAgICAgIHRoaXMudGVtcGxhdGVzLnNldChub3JtYWxpemVkUGF0aCwgdGVtcGxhdGUpO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVggIzU6IExvZyBzdWNjZXNzZnVsIHNhdmUgZm9yIGF1ZGl0IHRyYWlsXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdURU1QTEFURV9TQVZFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLnNhdmUnLFxuICAgICAgICBkZXRhaWxzOiBgVGVtcGxhdGUgc2F2ZWQ6ICR7dGVtcGxhdGUubWV0YWRhdGEubmFtZX0gdG8gJHtwYXRoLmJhc2VuYW1lKG5vcm1hbGl6ZWRQYXRoKX1gXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmluZm8oYFRlbXBsYXRlIHNhdmVkOiAke3RlbXBsYXRlLm1ldGFkYXRhLm5hbWV9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHNhdmUgdGVtcGxhdGUgdG8gJHtub3JtYWxpemVkUGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgdGVtcGxhdGVzXG4gICAqIFNFQ1VSSVRZIEZJWDogVXNlcyB2YWxpZGF0ZWQgZGlyZWN0b3J5IHBhdGhcbiAgICovXG4gIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxUZW1wbGF0ZVtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcih0aGlzLnRlbXBsYXRlc0Rpcik7XG4gICAgICBjb25zdCB0ZW1wbGF0ZUZpbGVzID0gZmlsZXMuZmlsdGVyKGZpbGUgPT4gZmlsZS5lbmRzV2l0aCgnLm1kJykgfHwgZmlsZS5lbmRzV2l0aCgnLnlhbWwnKSk7XG4gICAgICBcbiAgICAgIC8vIExvYWQgdGVtcGxhdGVzIGluIHBhcmFsbGVsIHdpdGggZXJyb3IgaGFuZGxpbmdcbiAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICB0ZW1wbGF0ZUZpbGVzLm1hcChhc3luYyBmaWxlID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZChmaWxlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbG9hZCB0ZW1wbGF0ZSAke2ZpbGV9OiAke2Vycm9yfWApO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgLy8gRmlsdGVyIG91dCBmYWlsZWQgbG9hZHNcbiAgICAgIHJldHVybiB0ZW1wbGF0ZXMuZmlsdGVyKCh0KTogdCBpcyBUZW1wbGF0ZSA9PiB0ICE9PSBudWxsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSGFuZGxlIG1pc3NpbmcgZGlyZWN0b3J5IGdyYWNlZnVsbHkgd2l0aCB0eXBlLXNhZmUgY2hlY2tcbiAgICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1RlbXBsYXRlcyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgeWV0LCByZXR1cm5pbmcgZW1wdHkgYXJyYXknKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbGlzdCB0ZW1wbGF0ZXM6ICR7ZXJyb3J9YCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYSB0ZW1wbGF0ZSBieSBwcmVkaWNhdGVcbiAgICovXG4gIGFzeW5jIGZpbmQocHJlZGljYXRlOiAodGVtcGxhdGU6IFRlbXBsYXRlKSA9PiBib29sZWFuKTogUHJvbWlzZTxUZW1wbGF0ZSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHRlbXBsYXRlcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiB0ZW1wbGF0ZXMuZmluZChwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyB0ZW1wbGF0ZVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKGRhdGE6IHtuYW1lOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IGNvbnRlbnQ/OiBzdHJpbmc7IG1ldGFkYXRhPzogYW55fSk6IFByb21pc2U8VGVtcGxhdGU+IHtcbiAgICAvLyBTRUNVUklUWSBGSVggIzQ6IFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBhbGwgaW5wdXRzXG4gICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQoZGF0YS5uYW1lIHx8ICduZXctdGVtcGxhdGUnLCAxMDApO1xuICAgIGNvbnN0IHNhbml0aXplZERlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChkYXRhLmRlc2NyaXB0aW9uIHx8ICcnLCA1MDApO1xuICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSBzYW5pdGl6ZUlucHV0KGRhdGEuY29udGVudCB8fCAnJywgMTAwMDAwKTsgLy8gMTAwS0IgbWF4XG4gICAgXG4gICAgLy8gQ3JlYXRlIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZVxuICAgIGNvbnN0IHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHtcbiAgICAgIC4uLmRhdGEubWV0YWRhdGEsXG4gICAgICBuYW1lOiBzYW5pdGl6ZWROYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHNhbml0aXplZERlc2NyaXB0aW9uXG4gICAgfSwgc2FuaXRpemVkQ29udGVudCk7XG4gICAgXG4gICAgLy8gR2VuZXJhdGUgZmlsZW5hbWUgZnJvbSB0ZW1wbGF0ZSBuYW1lXG4gICAgY29uc3QgZmlsZW5hbWUgPSBgJHtzYW5pdGl6ZWROYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTktXS9nLCAnLScpfS5tZGA7XG4gICAgXG4gICAgLy8gU2F2ZSB0aGUgdGVtcGxhdGVcbiAgICBhd2FpdCB0aGlzLnNhdmUodGVtcGxhdGUsIGZpbGVuYW1lKTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggIzU6IEF1ZGl0IHN1Y2Nlc3NmdWwgY3JlYXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1RlbXBsYXRlTWFuYWdlci5jcmVhdGUnLFxuICAgICAgZGV0YWlsczogYFRlbXBsYXRlIGNyZWF0ZWQ6ICR7dGVtcGxhdGUubWV0YWRhdGEubmFtZX1gXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIHRlbXBsYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIHRlbXBsYXRlXG4gICAqIFNFQ1VSSVRZIEZJWCAjNjogUGF0aCB2YWxpZGF0aW9uIHRvIHByZXZlbnQgZGVsZXRpb24gb3V0c2lkZSBkaXJlY3RvcnlcbiAgICovXG4gIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYICM0ICYgIzY6IFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSB0aGUgZmlsZSBwYXRoXG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG4gICAgXG4gICAgLy8gRW5zdXJlIHRoZSBwYXRoIGlzIHdpdGhpbiB0aGUgdGVtcGxhdGVzIGRpcmVjdG9yeVxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5pc0Fic29sdXRlKHNhbml0aXplZFBhdGgpIFxuICAgICAgPyBzYW5pdGl6ZWRQYXRoIFxuICAgICAgOiBwYXRoLmpvaW4odGhpcy50ZW1wbGF0ZXNEaXIsIHNhbml0aXplZFBhdGgpO1xuICAgIFxuICAgIC8vIFNFQ1VSSVRZIEZJWCAjNjogUHJldmVudCBwYXRoIHRyYXZlcnNhbCBhdHRhY2tzXG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLm5vcm1hbGl6ZShmdWxsUGF0aCk7XG4gICAgaWYgKCFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKHRoaXMudGVtcGxhdGVzRGlyKSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnQ1JJVElDQUwnLFxuICAgICAgICBzb3VyY2U6ICdUZW1wbGF0ZU1hbmFnZXIuZGVsZXRlJyxcbiAgICAgICAgZGV0YWlsczogYEF0dGVtcHRlZCB0byBkZWxldGUgZmlsZSBvdXRzaWRlIHRlbXBsYXRlcyBkaXJlY3Rvcnk6ICR7c2FuaXRpemVkUGF0aH1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCBkZXRlY3RlZCcpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy51bmxpbmsobm9ybWFsaXplZFBhdGgpO1xuICAgICAgdGhpcy50ZW1wbGF0ZXMuZGVsZXRlKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFkgRklYICM1OiBMb2cgZGVsZXRpb24gZm9yIGF1ZGl0IHRyYWlsXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdURU1QTEFURV9ERUxFVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdUZW1wbGF0ZU1hbmFnZXIuZGVsZXRlJyxcbiAgICAgICAgZGV0YWlsczogYFRlbXBsYXRlIGRlbGV0ZWQ6ICR7cGF0aC5iYXNlbmFtZShub3JtYWxpemVkUGF0aCl9YFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGxvZ2dlci5pbmZvKGBUZW1wbGF0ZSBkZWxldGVkOiAke3BhdGguYmFzZW5hbWUobm9ybWFsaXplZFBhdGgpfWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBkZWxldGUgdGVtcGxhdGUgJHtub3JtYWxpemVkUGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGEgdGVtcGxhdGUgZnJvbSBleHRlcm5hbCBmb3JtYXRcbiAgICogU0VDVVJJVFkgRklYICMzOiBVc2VzIFNlY3VyZVlhbWxQYXJzZXIgZm9yIHNhZmUgWUFNTCBwYXJzaW5nXG4gICAqL1xuICBhc3luYyBpbXBvcnRFbGVtZW50KGRhdGE6IHN0cmluZywgZm9ybWF0OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nKTogUHJvbWlzZTxUZW1wbGF0ZT4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgbWV0YWRhdGE6IFBhcnRpYWw8VGVtcGxhdGVNZXRhZGF0YT47XG4gICAgICBsZXQgY29udGVudDogc3RyaW5nID0gJyc7XG4gICAgICBcbiAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICAgIGNvbnN0IGpzb25EYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgICBtZXRhZGF0YSA9IGF3YWl0IHRoaXMudmFsaWRhdGVNZXRhZGF0YShqc29uRGF0YS5tZXRhZGF0YSB8fCB7fSk7XG4gICAgICAgICAgY29udGVudCA9IGpzb25EYXRhLmNvbnRlbnQgfHwgJyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgJ3lhbWwnOlxuICAgICAgICAgIC8vIEhJR0ggU0VWRVJJVFkgRklYOiBVc2UgU2VjdXJlWWFtbFBhcnNlciB0byBwcmV2ZW50IFlBTUwgaW5qZWN0aW9uIGF0dGFja3NcbiAgICAgICAgICAvLyBQcmV2aW91c2x5OiBVc2VkIHVuc2FmZSBZQU1MIHBhcnNpbmcgd2l0aG91dCB2YWxpZGF0aW9uXG4gICAgICAgICAgLy8gTm93OiBVc2VzIFNlY3VyZVlhbWxQYXJzZXIgd2hpY2ggdmFsaWRhdGVzIGNvbnRlbnQgYW5kIHByZXZlbnRzIG1hbGljaW91cyBwYXR0ZXJuc1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoZGF0YSwge1xuICAgICAgICAgICAgbWF4WWFtbFNpemU6IDY0ICogMTAyNCwgLy8gNjRLQiBsaW1pdFxuICAgICAgICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLnZhbGlkYXRlTWV0YWRhdGEoKHBhcnNlZCBhcyBhbnkpLm1ldGFkYXRhIHx8IHt9KTtcbiAgICAgICAgICBjb250ZW50ID0gcGFyc2VkLmNvbnRlbnQgfHwgJyc7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBhdWRpdCB0cmFpbFxuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdZQU1MX1BBUlNFX1NVQ0NFU1MnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLmltcG9ydEVsZW1lbnQnLFxuICAgICAgICAgICAgZGV0YWlsczogJ1lBTUwgY29udGVudCBzYWZlbHkgcGFyc2VkIGR1cmluZyBpbXBvcnQnXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgJ21hcmtkb3duJzpcbiAgICAgICAgICBjb25zdCBtZFBhcnNlZCA9IG1hdHRlcihkYXRhKTtcbiAgICAgICAgICBtZXRhZGF0YSA9IGF3YWl0IHRoaXMudmFsaWRhdGVNZXRhZGF0YShtZFBhcnNlZC5kYXRhKTtcbiAgICAgICAgICBjb250ZW50ID0gbWRQYXJzZWQuY29udGVudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgICBcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGltcG9ydCBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDcmVhdGUgYW5kIHZhbGlkYXRlIHRoZSB0ZW1wbGF0ZVxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUobWV0YWRhdGEsIGNvbnRlbnQpO1xuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHRlbXBsYXRlLnZhbGlkYXRlKCk7XG4gICAgICBcbiAgICAgIGlmICghdmFsaWRhdGlvbi52YWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGVtcGxhdGU6ICR7dmFsaWRhdGlvbi5lcnJvcnM/Lm1hcChlID0+IGUubWVzc2FnZSkuam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBpbXBvcnQgdGVtcGxhdGU6ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGEgdGVtcGxhdGUgdG8gZXh0ZXJuYWwgZm9ybWF0XG4gICAqIFNFQ1VSSVRZIEZJWCAjMzogVXNlcyBzYWZlIFlBTUwgc2VyaWFsaXphdGlvblxuICAgKi9cbiAgYXN5bmMgZXhwb3J0RWxlbWVudCh0ZW1wbGF0ZTogVGVtcGxhdGUsIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZS5zZXJpYWxpemUoKTtcbiAgICAgICAgICBcbiAgICAgICAgY2FzZSAneWFtbCc6XG4gICAgICAgICAgLy8gU0VDVVJJVFkgRklYOiBVc2UgeWFtbC5kdW1wIHdpdGggRkFJTFNBRkVfU0NIRU1BIHRvIHByZXZlbnQgY29kZSBleGVjdXRpb25cbiAgICAgICAgICAvLyBQcmV2aW91c2x5OiBDb3VsZCBwb3RlbnRpYWxseSB1c2UgdW5zYWZlIFlBTUwgZmVhdHVyZXNcbiAgICAgICAgICAvLyBOb3c6IEZBSUxTQUZFX1NDSEVNQSBvbmx5IGFsbG93cyBiYXNpYyBZQU1MIHR5cGVzLCBubyBKUy1zcGVjaWZpYyBjb25zdHJ1Y3RzXG4gICAgICAgICAgY29uc3QgeWFtbERhdGEgPSB7XG4gICAgICAgICAgICBtZXRhZGF0YTogdGVtcGxhdGUubWV0YWRhdGEsXG4gICAgICAgICAgICBjb250ZW50OiB0ZW1wbGF0ZS5jb250ZW50LFxuICAgICAgICAgICAgaWQ6IHRlbXBsYXRlLmlkLFxuICAgICAgICAgICAgdmVyc2lvbjogdGVtcGxhdGUudmVyc2lvblxuICAgICAgICAgIH07XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHlhbWwuZHVtcCh5YW1sRGF0YSwge1xuICAgICAgICAgICAgLy8gU0VDVVJJVFkgVFJBREUtT0ZGOiBVc2luZyBERUZBVUxUX1NDSEVNQSBpbnN0ZWFkIG9mIEZBSUxTQUZFX1NDSEVNQVxuICAgICAgICAgICAgLy8gUmVhc29uOiBGQUlMU0FGRV9TQ0hFTUEgZG9lc24ndCBzdXBwb3J0IG51bWJlciB0eXBlcyB3aGljaCBhcmUgbmVlZGVkIGZvciB0ZW1wbGF0ZSBtZXRhZGF0YVxuICAgICAgICAgICAgLy8gUmlzazogREVGQVVMVF9TQ0hFTUEgYWxsb3dzIG1vcmUgWUFNTCBmZWF0dXJlcyB0aGF0IGNvdWxkIGJlIGV4cGxvaXRlZFxuICAgICAgICAgICAgLy8gTWl0aWdhdGlvbjogbm9SZWZzIHByZXZlbnRzIHJlZmVyZW5jZSBhdHRhY2tzLCBza2lwSW52YWxpZCBkcm9wcyBkYW5nZXJvdXMgY29uc3RydWN0c1xuICAgICAgICAgICAgLy8gQ29uc2lkZXI6IEZvciBtYXhpbXVtIHNlY3VyaXR5LCBpbXBsZW1lbnQgY3VzdG9tIHNjaGVtYSB0aGF0IG9ubHkgYWxsb3dzIG5lZWRlZCB0eXBlc1xuICAgICAgICAgICAgc2NoZW1hOiB5YW1sLkRFRkFVTFRfU0NIRU1BLFxuICAgICAgICAgICAgbm9SZWZzOiB0cnVlLCAgICAgICAgLy8gUHJldmVudCByZWZlcmVuY2UgYXR0YWNrc1xuICAgICAgICAgICAgc29ydEtleXM6IHRydWUsICAgICAgLy8gQ29uc2lzdGVudCBvdXRwdXRcbiAgICAgICAgICAgIHNraXBJbnZhbGlkOiB0cnVlLCAgIC8vIFNraXAgdW5zZXJpYWxpemFibGUgdmFsdWVzIGluc3RlYWQgb2YgdGhyb3dpbmdcbiAgICAgICAgICAgIGNvbmRlbnNlRmxvdzogdHJ1ZSwgIC8vIE1vcmUgY29tcGFjdCBvdXRwdXRcbiAgICAgICAgICAgIHF1b3RpbmdUeXBlOiAnXCInLCAgICAvLyBGb3JjZSBkb3VibGUgcXVvdGVzIGZvciBjb25zaXN0ZW5jeVxuICAgICAgICAgICAgZm9yY2VRdW90ZXM6IGZhbHNlICAgLy8gT25seSBxdW90ZSB3aGVuIG5lY2Vzc2FyeVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlICdtYXJrZG93bic6XG4gICAgICAgICAgY29uc3QgZnJvbnRtYXR0ZXIgPSB0aGlzLmNyZWF0ZUZyb250bWF0dGVyKHRlbXBsYXRlLm1ldGFkYXRhKTtcbiAgICAgICAgICByZXR1cm4gYC0tLVxcbiR7ZnJvbnRtYXR0ZXJ9XFxuLS0tXFxuXFxuJHt0ZW1wbGF0ZS5jb250ZW50fWA7XG4gICAgICAgICAgXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBleHBvcnQgZm9ybWF0OiAke2Zvcm1hdH1gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZXhwb3J0IHRlbXBsYXRlOiAke2Vycm9yfWApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBtZXRhZGF0YVxuICAgKiBTRUNVUklUWSBGSVggIzQ6IENvbXByZWhlbnNpdmUgbWV0YWRhdGEgdmFsaWRhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZU1ldGFkYXRhKGRhdGE6IGFueSk6IFByb21pc2U8UGFydGlhbDxUZW1wbGF0ZU1ldGFkYXRhPj4ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBQYXJ0aWFsPFRlbXBsYXRlTWV0YWRhdGE+ID0ge307XG4gICAgXG4gICAgLy8gU2FuaXRpemUgc3RyaW5nIGZpZWxkc1xuICAgIGlmIChkYXRhLm5hbWUpIHtcbiAgICAgIG1ldGFkYXRhLm5hbWUgPSBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGRhdGEubmFtZSkubm9ybWFsaXplZENvbnRlbnQsIDEwMCk7XG4gICAgfVxuICAgIFxuICAgIGlmIChkYXRhLmRlc2NyaXB0aW9uKSB7XG4gICAgICBtZXRhZGF0YS5kZXNjcmlwdGlvbiA9IHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoZGF0YS5kZXNjcmlwdGlvbikubm9ybWFsaXplZENvbnRlbnQsIDUwMCk7XG4gICAgfVxuICAgIFxuICAgIGlmIChkYXRhLmNhdGVnb3J5KSB7XG4gICAgICBtZXRhZGF0YS5jYXRlZ29yeSA9IHNhbml0aXplSW5wdXQoZGF0YS5jYXRlZ29yeSwgNTApO1xuICAgIH1cbiAgICBcbiAgICBpZiAoZGF0YS5vdXRwdXRfZm9ybWF0KSB7XG4gICAgICBtZXRhZGF0YS5vdXRwdXRfZm9ybWF0ID0gc2FuaXRpemVJbnB1dChkYXRhLm91dHB1dF9mb3JtYXQsIDIwKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgYXJyYXlzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS50YWdzKSkge1xuICAgICAgbWV0YWRhdGEudGFncyA9IGRhdGEudGFncy5tYXAoKHRhZzogYW55KSA9PiBzYW5pdGl6ZUlucHV0KFN0cmluZyh0YWcpLCA1MCkpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLmluY2x1ZGVzKSkge1xuICAgICAgbWV0YWRhdGEuaW5jbHVkZXMgPSBkYXRhLmluY2x1ZGVzLm1hcCgoaW5jOiBhbnkpID0+IHNhbml0aXplSW5wdXQoU3RyaW5nKGluYyksIDIwMCkpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDb3B5IHNhZmUgZmllbGRzXG4gICAgaWYgKHR5cGVvZiBkYXRhLnVzYWdlX2NvdW50ID09PSAnbnVtYmVyJykge1xuICAgICAgbWV0YWRhdGEudXNhZ2VfY291bnQgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKGRhdGEudXNhZ2VfY291bnQpKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKGRhdGEubGFzdF91c2VkKSB7XG4gICAgICBtZXRhZGF0YS5sYXN0X3VzZWQgPSBzYW5pdGl6ZUlucHV0KFN0cmluZyhkYXRhLmxhc3RfdXNlZCksIDUwKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgY29tcGxleCBmaWVsZHNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLnZhcmlhYmxlcykpIHtcbiAgICAgIG1ldGFkYXRhLnZhcmlhYmxlcyA9IGRhdGEudmFyaWFibGVzLm1hcCgodjogYW55KSA9PiAoe1xuICAgICAgICBuYW1lOiBzYW5pdGl6ZUlucHV0KHYubmFtZSB8fCAnJywgNTApLFxuICAgICAgICB0eXBlOiBzYW5pdGl6ZUlucHV0KHYudHlwZSB8fCAnc3RyaW5nJywgMjApLFxuICAgICAgICBkZXNjcmlwdGlvbjogdi5kZXNjcmlwdGlvbiA/IHNhbml0aXplSW5wdXQodi5kZXNjcmlwdGlvbiwgMjAwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgcmVxdWlyZWQ6IEJvb2xlYW4odi5yZXF1aXJlZCksXG4gICAgICAgIGRlZmF1bHQ6IHYuZGVmYXVsdCxcbiAgICAgICAgdmFsaWRhdGlvbjogdi52YWxpZGF0aW9uID8gc2FuaXRpemVJbnB1dCh2LnZhbGlkYXRpb24sIDIwMCkgOiB1bmRlZmluZWQsXG4gICAgICAgIG9wdGlvbnM6IEFycmF5LmlzQXJyYXkodi5vcHRpb25zKSA/IHYub3B0aW9ucy5tYXAoKG86IGFueSkgPT4gc2FuaXRpemVJbnB1dChTdHJpbmcobyksIDEwMCkpIDogdW5kZWZpbmVkLFxuICAgICAgICBmb3JtYXQ6IHYuZm9ybWF0ID8gc2FuaXRpemVJbnB1dCh2LmZvcm1hdCwgNTApIDogdW5kZWZpbmVkXG4gICAgICB9KSk7XG4gICAgfVxuICAgIFxuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEuZXhhbXBsZXMpKSB7XG4gICAgICBtZXRhZGF0YS5leGFtcGxlcyA9IGRhdGEuZXhhbXBsZXMubWFwKChleDogYW55KSA9PiAoe1xuICAgICAgICB0aXRsZTogc2FuaXRpemVJbnB1dChleC50aXRsZSB8fCAnJywgMTAwKSxcbiAgICAgICAgZGVzY3JpcHRpb246IGV4LmRlc2NyaXB0aW9uID8gc2FuaXRpemVJbnB1dChleC5kZXNjcmlwdGlvbiwgNTAwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgdmFyaWFibGVzOiBleC52YXJpYWJsZXMgfHwge30sXG4gICAgICAgIG91dHB1dDogZXgub3V0cHV0ID8gc2FuaXRpemVJbnB1dChleC5vdXRwdXQsIDUwMDApIDogdW5kZWZpbmVkXG4gICAgICB9KSk7XG4gICAgfVxuICAgIFxuICAgIC8vIENvcHkgc3RhbmRhcmQgZWxlbWVudCBmaWVsZHNcbiAgICBtZXRhZGF0YS5hdXRob3IgPSBkYXRhLmF1dGhvciA/IHNhbml0aXplSW5wdXQoZGF0YS5hdXRob3IsIDEwMCkgOiB1bmRlZmluZWQ7XG4gICAgbWV0YWRhdGEudmVyc2lvbiA9IGRhdGEudmVyc2lvbiA/IHNhbml0aXplSW5wdXQoZGF0YS52ZXJzaW9uLCAyMCkgOiB1bmRlZmluZWQ7XG4gICAgXG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBZQU1MIGZyb250bWF0dGVyIGZyb20gbWV0YWRhdGFcbiAgICogU0VDVVJJVFkgRklYICMzOiBTYWZlIFlBTUwgZ2VuZXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVGcm9udG1hdHRlcihtZXRhZGF0YTogVGVtcGxhdGVNZXRhZGF0YSk6IHN0cmluZyB7XG4gICAgLy8gU0VDVVJJVFkgRklYOiBVc2UgeWFtbC5kdW1wIHdpdGggc2VjdXJpdHkgb3B0aW9uc1xuICAgIC8vIEVuc3VyZXMgbm8gY29kZSBleGVjdXRpb24gdnVsbmVyYWJpbGl0aWVzIGluIGdlbmVyYXRlZCBZQU1MXG4gICAgY29uc3Qgc2FmZU1ldGFkYXRhID0ge1xuICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBtZXRhZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgIGF1dGhvcjogbWV0YWRhdGEuYXV0aG9yLFxuICAgICAgdmVyc2lvbjogbWV0YWRhdGEudmVyc2lvbixcbiAgICAgIGNhdGVnb3J5OiBtZXRhZGF0YS5jYXRlZ29yeSxcbiAgICAgIG91dHB1dF9mb3JtYXQ6IG1ldGFkYXRhLm91dHB1dF9mb3JtYXQsXG4gICAgICB0YWdzOiBtZXRhZGF0YS50YWdzLFxuICAgICAgaW5jbHVkZXM6IG1ldGFkYXRhLmluY2x1ZGVzLFxuICAgICAgdXNhZ2VfY291bnQ6IG1ldGFkYXRhLnVzYWdlX2NvdW50LFxuICAgICAgbGFzdF91c2VkOiBtZXRhZGF0YS5sYXN0X3VzZWQsXG4gICAgICB2YXJpYWJsZXM6IG1ldGFkYXRhLnZhcmlhYmxlcyxcbiAgICAgIGV4YW1wbGVzOiBtZXRhZGF0YS5leGFtcGxlc1xuICAgIH07XG4gICAgXG4gICAgLy8gUmVtb3ZlIHVuZGVmaW5lZCB2YWx1ZXNcbiAgICBjb25zdCBjbGVhbk1ldGFkYXRhID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoc2FmZU1ldGFkYXRhKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgKTtcbiAgICBcbiAgICByZXR1cm4geWFtbC5kdW1wKGNsZWFuTWV0YWRhdGEsIHtcbiAgICAgIC8vIFNFQ1VSSVRZIFRSQURFLU9GRjogU2FtZSBhcyBleHBvcnRFbGVtZW50IC0gdXNpbmcgREVGQVVMVF9TQ0hFTUEgZm9yIHR5cGUgc3VwcG9ydFxuICAgICAgLy8gU2VlIGV4cG9ydEVsZW1lbnQgbWV0aG9kIGZvciBkZXRhaWxlZCBzZWN1cml0eSBjb25zaWRlcmF0aW9uc1xuICAgICAgc2NoZW1hOiB5YW1sLkRFRkFVTFRfU0NIRU1BLFxuICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgc29ydEtleXM6IHRydWUsXG4gICAgICBsaW5lV2lkdGg6IDgwLFxuICAgICAgc2tpcEludmFsaWQ6IHRydWUsXG4gICAgICBjb25kZW5zZUZsb3c6IHRydWUsXG4gICAgICBxdW90aW5nVHlwZTogJ1wiJyxcbiAgICAgIGZvcmNlUXVvdGVzOiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdGVtcGxhdGUgZmlsZSBleGlzdHNcbiAgICovXG4gIGFzeW5jIGV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmlzQWJzb2x1dGUoc2FuaXRpemVkUGF0aCkgXG4gICAgICA/IHNhbml0aXplZFBhdGggXG4gICAgICA6IHBhdGguam9pbih0aGlzLnRlbXBsYXRlc0Rpciwgc2FuaXRpemVkUGF0aCk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmFjY2VzcyhmdWxsUGF0aCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBtdWx0aXBsZSB0ZW1wbGF0ZXMgYnkgcHJlZGljYXRlXG4gICAqL1xuICBhc3luYyBmaW5kTWFueShwcmVkaWNhdGU6ICh0ZW1wbGF0ZTogVGVtcGxhdGUpID0+IGJvb2xlYW4pOiBQcm9taXNlPFRlbXBsYXRlW10+IHtcbiAgICBjb25zdCB0ZW1wbGF0ZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gdGVtcGxhdGVzLmZpbHRlcihwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgdGVtcGxhdGVcbiAgICovXG4gIHZhbGlkYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZSk6IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICByZXR1cm4gdGVtcGxhdGUudmFsaWRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIGZpbGUgcGF0aFxuICAgKi9cbiAgdmFsaWRhdGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWRQYXRoKSBcbiAgICAgICAgPyBzYW5pdGl6ZWRQYXRoIFxuICAgICAgICA6IHBhdGguam9pbih0aGlzLnRlbXBsYXRlc0Rpciwgc2FuaXRpemVkUGF0aCk7XG4gICAgICBcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5ub3JtYWxpemUoZnVsbFBhdGgpO1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgodGhpcy50ZW1wbGF0ZXNEaXIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGVsZW1lbnQgdHlwZVxuICAgKi9cbiAgZ2V0RWxlbWVudFR5cGUoKTogRWxlbWVudFR5cGUge1xuICAgIHJldHVybiBFbGVtZW50VHlwZS5URU1QTEFURTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpbGUgZXh0ZW5zaW9uXG4gICAqL1xuICBnZXRGaWxlRXh0ZW5zaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcubWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGVtcGxhdGVzIGJ5IGNhdGVnb3J5XG4gICAqL1xuICBhc3luYyBmaW5kQnlDYXRlZ29yeShjYXRlZ29yeTogc3RyaW5nKTogUHJvbWlzZTxUZW1wbGF0ZVtdPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkQ2F0ZWdvcnkgPSBzYW5pdGl6ZUlucHV0KGNhdGVnb3J5LCA1MCk7XG4gICAgcmV0dXJuIHRoaXMubGlzdCgpLnRoZW4odGVtcGxhdGVzID0+IFxuICAgICAgdGVtcGxhdGVzLmZpbHRlcih0ID0+IHQubWV0YWRhdGEuY2F0ZWdvcnkgPT09IHNhbml0aXplZENhdGVnb3J5KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0ZW1wbGF0ZXMgYnkgdGFnXG4gICAqL1xuICBhc3luYyBmaW5kQnlUYWcodGFnOiBzdHJpbmcpOiBQcm9taXNlPFRlbXBsYXRlW10+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRUYWcgPSBzYW5pdGl6ZUlucHV0KHRhZywgNTApO1xuICAgIHJldHVybiB0aGlzLmxpc3QoKS50aGVuKHRlbXBsYXRlcyA9PiBcbiAgICAgIHRlbXBsYXRlcy5maWx0ZXIodCA9PiB0Lm1ldGFkYXRhLnRhZ3M/LmluY2x1ZGVzKHNhbml0aXplZFRhZykpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbW9zdCB1c2VkIHRlbXBsYXRlc1xuICAgKi9cbiAgYXN5bmMgZ2V0TW9zdFVzZWQobGltaXQ6IG51bWJlciA9IDEwKTogUHJvbWlzZTxUZW1wbGF0ZVtdPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYOiBWYWxpZGF0ZSBsaW1pdCBwYXJhbWV0ZXIgdG8gcHJldmVudCBleGNlc3NpdmUgbWVtb3J5IHVzYWdlXG4gICAgLy8gUHJldmlvdXNseTogTm8gdmFsaWRhdGlvbiBjb3VsZCBhbGxvdyB2ZXJ5IGxhcmdlIGxpbWl0c1xuICAgIC8vIE5vdzogRW5mb3JjZXMgcmVhc29uYWJsZSBib3VuZHNcbiAgICBjb25zdCBNSU5fTElNSVQgPSAxO1xuICAgIGNvbnN0IE1BWF9MSU1JVCA9IDEwMDtcbiAgICBjb25zdCB2YWxpZGF0ZWRMaW1pdCA9IE1hdGgubWF4KE1JTl9MSU1JVCwgTWF0aC5taW4oTUFYX0xJTUlULCBNYXRoLmZsb29yKGxpbWl0KSkpO1xuICAgIFxuICAgIGlmIChsaW1pdCAhPT0gdmFsaWRhdGVkTGltaXQpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBnZXRNb3N0VXNlZDogbGltaXQgJHtsaW1pdH0gYWRqdXN0ZWQgdG8gJHt2YWxpZGF0ZWRMaW1pdH0gKHZhbGlkIHJhbmdlOiAke01JTl9MSU1JVH0tJHtNQVhfTElNSVR9KWApO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCB0ZW1wbGF0ZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gdGVtcGxhdGVzXG4gICAgICAuc29ydCgoYSwgYikgPT4gKGIubWV0YWRhdGEudXNhZ2VfY291bnQgfHwgMCkgLSAoYS5tZXRhZGF0YS51c2FnZV9jb3VudCB8fCAwKSlcbiAgICAgIC5zbGljZSgwLCB2YWxpZGF0ZWRMaW1pdCk7XG4gIH1cbn0iXX0=
|
|
529
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVtcGxhdGVNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3RlbXBsYXRlcy9UZW1wbGF0ZU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFJSCxPQUFPLEVBQUUsUUFBUSxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBZ0IsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFFakMsTUFBTSxPQUFPLGVBQWU7SUFDbEIsZ0JBQWdCLENBQW1CO0lBQ25DLFlBQVksQ0FBUztJQUNyQixTQUFTLEdBQTBCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFckQ7UUFDRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMs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LENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRlbXBsYXRlTWFuYWdlciAtIEltcGxlbWVudGF0aW9uIG9mIElFbGVtZW50TWFuYWdlciBmb3IgVGVtcGxhdGUgZWxlbWVudHNcbiAqIEhhbmRsZXMgQ1JVRCBvcGVyYXRpb25zIGFuZCBsaWZlY3ljbGUgbWFuYWdlbWVudCBmb3IgdGVtcGxhdGVzIGltcGxlbWVudGluZyBJRWxlbWVudFxuICogXG4gKiBTRUNVUklUWSBGSVhFUyBJTVBMRU1FTlRFRCAoRm9sbG93aW5nIFBSICMzMTkgcGF0dGVybnMpOlxuICogMS4gQ1JJVElDQUw6IEZpeGVkIHJhY2UgY29uZGl0aW9ucyBpbiBmaWxlIG9wZXJhdGlvbnMgYnkgdXNpbmcgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgcmVhZHMvd3JpdGVzXG4gKiAyLiBDUklUSUNBTDogRml4ZWQgZHluYW1pYyByZXF1aXJlKCkgc3RhdGVtZW50cyBieSB1c2luZyBzdGF0aWMgaW1wb3J0c1xuICogMy4gSElHSDogRml4ZWQgdW52YWxpZGF0ZWQgWUFNTCBwYXJzaW5nIHZ1bG5lcmFiaWxpdHkgYnkgdXNpbmcgU2VjdXJlWWFtbFBhcnNlclxuICogNC4gTUVESVVNOiBBbGwgdXNlciBpbnB1dHMgYXJlIG5vdyB2YWxpZGF0ZWQgYW5kIHNhbml0aXplZFxuICogNS4gTUVESVVNOiBBdWRpdCBsb2dnaW5nIGFkZGVkIGZvciBzZWN1cml0eSBvcGVyYXRpb25zXG4gKiA2LiBNRURJVU06IFBhdGggdHJhdmVyc2FsIHByZXZlbnRpb24gZm9yIGFsbCBmaWxlIG9wZXJhdGlvbnNcbiAqL1xuXG5pbXBvcnQgeyBJRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZSwgVGVtcGxhdGVNZXRhZGF0YSB9IGZyb20gJy4vVGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQsIHZhbGlkYXRlUGF0aCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBtYXR0ZXIgZnJvbSAnZ3JheS1tYXR0ZXInO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVNYW5hZ2VyIGltcGxlbWVudHMgSUVsZW1lbnRNYW5hZ2VyPFRlbXBsYXRlPiB7XG4gIHByaXZhdGUgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcjtcbiAgcHJpdmF0ZSB0ZW1wbGF0ZXNEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSB0ZW1wbGF0ZXM6IE1hcDxzdHJpbmcsIFRlbXBsYXRlPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnBvcnRmb2xpb01hbmFnZXIgPSBQb3J0Zm9saW9NYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgdGhpcy50ZW1wbGF0ZXNEaXIgPSB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihFbGVtZW50VHlwZS5URU1QTEFURSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIHRlbXBsYXRlIGZyb20gZmlsZVxuICAgKiBTRUNVUklUWSBGSVggIzE6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1JlYWRGaWxlKCkgaW5zdGVhZCBvZiBmcy5yZWFkRmlsZSgpXG4gICAqIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIGFuZCBlbnN1cmUgYXRvbWljIGZpbGUgb3BlcmF0aW9uc1xuICAgKi9cbiAgYXN5bmMgbG9hZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxUZW1wbGF0ZT4ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWCAjNCAmICM2OiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgdGhlIGZpbGUgcGF0aFxuICAgIC8vIFByZXZpb3VzbHk6IERpcmVjdCB1c2Ugb2YgdXNlci1wcm92aWRlZCBwYXRocyBjb3VsZCBsZWFkIHRvIHBhdGggdHJhdmVyc2FsXG4gICAgLy8gTm93OiBGdWxsIHZhbGlkYXRpb24gcHJldmVudHMgYWNjZXNzaW5nIGZpbGVzIG91dHNpZGUgdGVtcGxhdGVzIGRpcmVjdG9yeVxuICAgIGNvbnN0IHNhbml0aXplZFBhdGggPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuICAgIFxuICAgIC8vIEVuc3VyZSB0aGUgcGF0aCBpcyB3aXRoaW4gdGhlIHRlbXBsYXRlcyBkaXJlY3RvcnlcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWRQYXRoKSBcbiAgICAgID8gc2FuaXRpemVkUGF0aCBcbiAgICAgIDogcGF0aC5qb2luKHRoaXMudGVtcGxhdGVzRGlyLCBzYW5pdGl6ZWRQYXRoKTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggIzY6IFByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5ub3JtYWxpemUoZnVsbFBhdGgpO1xuICAgIGlmICghbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aCh0aGlzLnRlbXBsYXRlc0RpcikpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLmxvYWQnLFxuICAgICAgICBkZXRhaWxzOiBgQXR0ZW1wdGVkIHRvIGFjY2VzcyBmaWxlIG91dHNpZGUgdGVtcGxhdGVzIGRpcmVjdG9yeTogJHtzYW5pdGl6ZWRQYXRofWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXRoIHRyYXZlcnNhbCBhdHRlbXB0IGRldGVjdGVkJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENSSVRJQ0FMIEZJWDogVXNlIGF0b21pYyBmaWxlIHJlYWQgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICAgIC8vIFByZXZpb3VzbHk6IGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmdWxsUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAvLyBOb3c6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyIHdpdGggcHJvcGVyIGVuY29kaW5nIG9iamVjdCBmb3JtYXRcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljUmVhZEZpbGUobm9ybWFsaXplZFBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICBcbiAgICAgIC8vIFBhcnNlIHRoZSB0ZW1wbGF0ZSBmaWxlIChleHBlY3RlZCBmb3JtYXQ6IFlBTUwgZnJvbnRtYXR0ZXIgKyBjb250ZW50KVxuICAgICAgY29uc3QgcGFyc2VkID0gbWF0dGVyKGNvbnRlbnQpO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVggIzM6IFZhbGlkYXRlIFlBTUwgbWV0YWRhdGEgdXNpbmcgU2VjdXJlWWFtbFBhcnNlclxuICAgICAgLy8gUHJldmlvdXNseTogRnJvbnRtYXR0ZXIgcGFyc2luZyBjb3VsZCBiZSB2dWxuZXJhYmxlIHRvIFlBTUwgaW5qZWN0aW9uXG4gICAgICAvLyBOb3c6IFNlY3VyZVlhbWxQYXJzZXIgdmFsaWRhdGVzIGFuZCBzYW5pdGl6ZXMgWUFNTCBjb250ZW50XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMudmFsaWRhdGVNZXRhZGF0YShwYXJzZWQuZGF0YSk7XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSB0aGUgdGVtcGxhdGUgaW5zdGFuY2VcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKG1ldGFkYXRhLCBwYXJzZWQuY29udGVudCk7XG4gICAgICBcbiAgICAgIC8vIENhY2hlIHRoZSB0ZW1wbGF0ZVxuICAgICAgdGhpcy50ZW1wbGF0ZXMuc2V0KG5vcm1hbGl6ZWRQYXRoLCB0ZW1wbGF0ZSk7XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZIEZJWCAjNTogTG9nIHN1Y2Nlc3NmdWwgdGVtcGxhdGUgbG9hZCBmb3IgYXVkaXQgdHJhaWxcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RFTVBMQVRFX0xPQURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLmxvYWQnLFxuICAgICAgICBkZXRhaWxzOiBgVGVtcGxhdGUgbG9hZGVkOiAke3RlbXBsYXRlLm1ldGFkYXRhLm5hbWV9IGZyb20gJHtwYXRoLmJhc2VuYW1lKG5vcm1hbGl6ZWRQYXRoKX1gXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkIHRlbXBsYXRlIGZyb20gJHtub3JtYWxpemVkUGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhIHRlbXBsYXRlIHRvIGZpbGVcbiAgICogU0VDVVJJVFkgRklYICMxOiBVc2VzIEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoKSBmb3IgYXRvbWljIG9wZXJhdGlvbnNcbiAgICovXG4gIGFzeW5jIHNhdmUodGVtcGxhdGU6IFRlbXBsYXRlLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYICM0OiBWYWxpZGF0ZSBpbnB1dHNcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gdGVtcGxhdGUudmFsaWRhdGUoKTtcbiAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNhdmUgaW52YWxpZCB0ZW1wbGF0ZTogJHt2YWxpZGF0aW9uLmVycm9ycz8ubWFwKGUgPT4gZS5tZXNzYWdlKS5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIFNFQ1VSSVRZIEZJWCAjNCAmICM2OiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgdGhlIGZpbGUgcGF0aFxuICAgIGNvbnN0IHNhbml0aXplZFBhdGggPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuICAgIFxuICAgIC8vIEVuc3VyZSB0aGUgcGF0aCBpcyB3aXRoaW4gdGhlIHRlbXBsYXRlcyBkaXJlY3RvcnlcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWRQYXRoKSBcbiAgICAgID8gc2FuaXRpemVkUGF0aCBcbiAgICAgIDogcGF0aC5qb2luKHRoaXMudGVtcGxhdGVzRGlyLCBzYW5pdGl6ZWRQYXRoKTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggIzY6IFByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5ub3JtYWxpemUoZnVsbFBhdGgpO1xuICAgIGlmICghbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aCh0aGlzLnRlbXBsYXRlc0RpcikpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLnNhdmUnLFxuICAgICAgICBkZXRhaWxzOiBgQXR0ZW1wdGVkIHRvIHNhdmUgZmlsZSBvdXRzaWRlIHRlbXBsYXRlcyBkaXJlY3Rvcnk6ICR7c2FuaXRpemVkUGF0aH1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCBkZXRlY3RlZCcpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKG5vcm1hbGl6ZWRQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSBmcm9udG1hdHRlciBjb250ZW50XG4gICAgICBjb25zdCBmcm9udG1hdHRlciA9IHRoaXMuY3JlYXRlRnJvbnRtYXR0ZXIodGVtcGxhdGUubWV0YWRhdGEpO1xuICAgICAgY29uc3QgY29udGVudCA9IGAtLS1cXG4ke2Zyb250bWF0dGVyfVxcbi0tLVxcblxcbiR7dGVtcGxhdGUuY29udGVudH1gO1xuICAgICAgXG4gICAgICAvLyBDUklUSUNBTCBGSVg6IFVzZSBhdG9taWMgZmlsZSB3cml0ZSB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgICAgLy8gUHJldmlvdXNseTogYXdhaXQgZnMud3JpdGVGaWxlKGZ1bGxQYXRoLCBjb250ZW50LCAndXRmLTgnKTtcbiAgICAgIC8vIE5vdzogVXNlcyBGaWxlTG9ja01hbmFnZXIgZm9yIGF0b21pYyBvcGVyYXRpb25zXG4gICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKG5vcm1hbGl6ZWRQYXRoLCBjb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICAgICAgXG4gICAgICAvLyBVcGRhdGUgY2FjaGVcbiAgICAgIHRoaXMudGVtcGxhdGVzLnNldChub3JtYWxpemVkUGF0aCwgdGVtcGxhdGUpO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVggIzU6IExvZyBzdWNjZXNzZnVsIHNhdmUgZm9yIGF1ZGl0IHRyYWlsXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdURU1QTEFURV9TQVZFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLnNhdmUnLFxuICAgICAgICBkZXRhaWxzOiBgVGVtcGxhdGUgc2F2ZWQ6ICR7dGVtcGxhdGUubWV0YWRhdGEubmFtZX0gdG8gJHtwYXRoLmJhc2VuYW1lKG5vcm1hbGl6ZWRQYXRoKX1gXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmluZm8oYFRlbXBsYXRlIHNhdmVkOiAke3RlbXBsYXRlLm1ldGFkYXRhLm5hbWV9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHNhdmUgdGVtcGxhdGUgdG8gJHtub3JtYWxpemVkUGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgdGVtcGxhdGVzXG4gICAqIFNFQ1VSSVRZIEZJWDogVXNlcyBQb3J0Zm9saW9NYW5hZ2VyLmxpc3RFbGVtZW50cygpIHdoaWNoIGZpbHRlcnMgdGVzdCBlbGVtZW50c1xuICAgKi9cbiAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPFRlbXBsYXRlW10+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVXNlIFBvcnRmb2xpb01hbmFnZXIgdG8gZ2V0IGZpbHRlcmVkIGxpc3QgKGV4Y2x1ZGVzIHRlc3QgZWxlbWVudHMpXG4gICAgICBjb25zdCB0ZW1wbGF0ZUZpbGVzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmxpc3RFbGVtZW50cyhFbGVtZW50VHlwZS5URU1QTEFURSk7XG4gICAgICBcbiAgICAgIC8vIExvYWQgdGVtcGxhdGVzIGluIHBhcmFsbGVsIHdpdGggZXJyb3IgaGFuZGxpbmdcbiAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICB0ZW1wbGF0ZUZpbGVzLm1hcChhc3luYyBmaWxlID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZChmaWxlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbG9hZCB0ZW1wbGF0ZSAke2ZpbGV9OiAke2Vycm9yfWApO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgLy8gRmlsdGVyIG91dCBmYWlsZWQgbG9hZHNcbiAgICAgIHJldHVybiB0ZW1wbGF0ZXMuZmlsdGVyKCh0KTogdCBpcyBUZW1wbGF0ZSA9PiB0ICE9PSBudWxsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSGFuZGxlIG1pc3NpbmcgZGlyZWN0b3J5IGdyYWNlZnVsbHkgd2l0aCB0eXBlLXNhZmUgY2hlY2tcbiAgICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1RlbXBsYXRlcyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgeWV0LCByZXR1cm5pbmcgZW1wdHkgYXJyYXknKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbGlzdCB0ZW1wbGF0ZXM6ICR7ZXJyb3J9YCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYSB0ZW1wbGF0ZSBieSBwcmVkaWNhdGVcbiAgICovXG4gIGFzeW5jIGZpbmQocHJlZGljYXRlOiAodGVtcGxhdGU6IFRlbXBsYXRlKSA9PiBib29sZWFuKTogUHJvbWlzZTxUZW1wbGF0ZSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHRlbXBsYXRlcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiB0ZW1wbGF0ZXMuZmluZChwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyB0ZW1wbGF0ZVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKGRhdGE6IHtuYW1lOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IGNvbnRlbnQ/OiBzdHJpbmc7IG1ldGFkYXRhPzogYW55fSk6IFByb21pc2U8VGVtcGxhdGU+IHtcbiAgICAvLyBTRUNVUklUWSBGSVggIzQ6IFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBhbGwgaW5wdXRzXG4gICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQoZGF0YS5uYW1lIHx8ICduZXctdGVtcGxhdGUnLCAxMDApO1xuICAgIGNvbnN0IHNhbml0aXplZERlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChkYXRhLmRlc2NyaXB0aW9uIHx8ICcnLCA1MDApO1xuICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSBzYW5pdGl6ZUlucHV0KGRhdGEuY29udGVudCB8fCAnJywgMTAwMDAwKTsgLy8gMTAwS0IgbWF4XG4gICAgXG4gICAgLy8gQ3JlYXRlIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZVxuICAgIGNvbnN0IHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHtcbiAgICAgIC4uLmRhdGEubWV0YWRhdGEsXG4gICAgICBuYW1lOiBzYW5pdGl6ZWROYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHNhbml0aXplZERlc2NyaXB0aW9uXG4gICAgfSwgc2FuaXRpemVkQ29udGVudCk7XG4gICAgXG4gICAgLy8gR2VuZXJhdGUgZmlsZW5hbWUgZnJvbSB0ZW1wbGF0ZSBuYW1lXG4gICAgY29uc3QgZmlsZW5hbWUgPSBgJHtzYW5pdGl6ZWROYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTktXS9nLCAnLScpfS5tZGA7XG4gICAgXG4gICAgLy8gU2F2ZSB0aGUgdGVtcGxhdGVcbiAgICBhd2FpdCB0aGlzLnNhdmUodGVtcGxhdGUsIGZpbGVuYW1lKTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggIzU6IEF1ZGl0IHN1Y2Nlc3NmdWwgY3JlYXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1RlbXBsYXRlTWFuYWdlci5jcmVhdGUnLFxuICAgICAgZGV0YWlsczogYFRlbXBsYXRlIGNyZWF0ZWQ6ICR7dGVtcGxhdGUubWV0YWRhdGEubmFtZX1gXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIHRlbXBsYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIHRlbXBsYXRlXG4gICAqIFNFQ1VSSVRZIEZJWCAjNjogUGF0aCB2YWxpZGF0aW9uIHRvIHByZXZlbnQgZGVsZXRpb24gb3V0c2lkZSBkaXJlY3RvcnlcbiAgICovXG4gIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYICM0ICYgIzY6IFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSB0aGUgZmlsZSBwYXRoXG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG4gICAgXG4gICAgLy8gRW5zdXJlIHRoZSBwYXRoIGlzIHdpdGhpbiB0aGUgdGVtcGxhdGVzIGRpcmVjdG9yeVxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5pc0Fic29sdXRlKHNhbml0aXplZFBhdGgpIFxuICAgICAgPyBzYW5pdGl6ZWRQYXRoIFxuICAgICAgOiBwYXRoLmpvaW4odGhpcy50ZW1wbGF0ZXNEaXIsIHNhbml0aXplZFBhdGgpO1xuICAgIFxuICAgIC8vIFNFQ1VSSVRZIEZJWCAjNjogUHJldmVudCBwYXRoIHRyYXZlcnNhbCBhdHRhY2tzXG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLm5vcm1hbGl6ZShmdWxsUGF0aCk7XG4gICAgaWYgKCFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKHRoaXMudGVtcGxhdGVzRGlyKSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnQ1JJVElDQUwnLFxuICAgICAgICBzb3VyY2U6ICdUZW1wbGF0ZU1hbmFnZXIuZGVsZXRlJyxcbiAgICAgICAgZGV0YWlsczogYEF0dGVtcHRlZCB0byBkZWxldGUgZmlsZSBvdXRzaWRlIHRlbXBsYXRlcyBkaXJlY3Rvcnk6ICR7c2FuaXRpemVkUGF0aH1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCBkZXRlY3RlZCcpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy51bmxpbmsobm9ybWFsaXplZFBhdGgpO1xuICAgICAgdGhpcy50ZW1wbGF0ZXMuZGVsZXRlKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFkgRklYICM1OiBMb2cgZGVsZXRpb24gZm9yIGF1ZGl0IHRyYWlsXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdURU1QTEFURV9ERUxFVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdUZW1wbGF0ZU1hbmFnZXIuZGVsZXRlJyxcbiAgICAgICAgZGV0YWlsczogYFRlbXBsYXRlIGRlbGV0ZWQ6ICR7cGF0aC5iYXNlbmFtZShub3JtYWxpemVkUGF0aCl9YFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGxvZ2dlci5pbmZvKGBUZW1wbGF0ZSBkZWxldGVkOiAke3BhdGguYmFzZW5hbWUobm9ybWFsaXplZFBhdGgpfWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBkZWxldGUgdGVtcGxhdGUgJHtub3JtYWxpemVkUGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGEgdGVtcGxhdGUgZnJvbSBleHRlcm5hbCBmb3JtYXRcbiAgICogU0VDVVJJVFkgRklYICMzOiBVc2VzIFNlY3VyZVlhbWxQYXJzZXIgZm9yIHNhZmUgWUFNTCBwYXJzaW5nXG4gICAqL1xuICBhc3luYyBpbXBvcnRFbGVtZW50KGRhdGE6IHN0cmluZywgZm9ybWF0OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nKTogUHJvbWlzZTxUZW1wbGF0ZT4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgbWV0YWRhdGE6IFBhcnRpYWw8VGVtcGxhdGVNZXRhZGF0YT47XG4gICAgICBsZXQgY29udGVudDogc3RyaW5nID0gJyc7XG4gICAgICBcbiAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICAgIGNvbnN0IGpzb25EYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgICBtZXRhZGF0YSA9IGF3YWl0IHRoaXMudmFsaWRhdGVNZXRhZGF0YShqc29uRGF0YS5tZXRhZGF0YSB8fCB7fSk7XG4gICAgICAgICAgY29udGVudCA9IGpzb25EYXRhLmNvbnRlbnQgfHwgJyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgJ3lhbWwnOlxuICAgICAgICAgIC8vIEhJR0ggU0VWRVJJVFkgRklYOiBVc2UgU2VjdXJlWWFtbFBhcnNlciB0byBwcmV2ZW50IFlBTUwgaW5qZWN0aW9uIGF0dGFja3NcbiAgICAgICAgICAvLyBQcmV2aW91c2x5OiBVc2VkIHVuc2FmZSBZQU1MIHBhcnNpbmcgd2l0aG91dCB2YWxpZGF0aW9uXG4gICAgICAgICAgLy8gTm93OiBVc2VzIFNlY3VyZVlhbWxQYXJzZXIgd2hpY2ggdmFsaWRhdGVzIGNvbnRlbnQgYW5kIHByZXZlbnRzIG1hbGljaW91cyBwYXR0ZXJuc1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoZGF0YSwge1xuICAgICAgICAgICAgbWF4WWFtbFNpemU6IDY0ICogMTAyNCwgLy8gNjRLQiBsaW1pdFxuICAgICAgICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLnZhbGlkYXRlTWV0YWRhdGEoKHBhcnNlZCBhcyBhbnkpLm1ldGFkYXRhIHx8IHt9KTtcbiAgICAgICAgICBjb250ZW50ID0gcGFyc2VkLmNvbnRlbnQgfHwgJyc7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBhdWRpdCB0cmFpbFxuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdZQU1MX1BBUlNFX1NVQ0NFU1MnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLmltcG9ydEVsZW1lbnQnLFxuICAgICAgICAgICAgZGV0YWlsczogJ1lBTUwgY29udGVudCBzYWZlbHkgcGFyc2VkIGR1cmluZyBpbXBvcnQnXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgJ21hcmtkb3duJzpcbiAgICAgICAgICBjb25zdCBtZFBhcnNlZCA9IG1hdHRlcihkYXRhKTtcbiAgICAgICAgICBtZXRhZGF0YSA9IGF3YWl0IHRoaXMudmFsaWRhdGVNZXRhZGF0YShtZFBhcnNlZC5kYXRhKTtcbiAgICAgICAgICBjb250ZW50ID0gbWRQYXJzZWQuY29udGVudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgICBcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGltcG9ydCBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDcmVhdGUgYW5kIHZhbGlkYXRlIHRoZSB0ZW1wbGF0ZVxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUobWV0YWRhdGEsIGNvbnRlbnQpO1xuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHRlbXBsYXRlLnZhbGlkYXRlKCk7XG4gICAgICBcbiAgICAgIGlmICghdmFsaWRhdGlvbi52YWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGVtcGxhdGU6ICR7dmFsaWRhdGlvbi5lcnJvcnM/Lm1hcChlID0+IGUubWVzc2FnZSkuam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBpbXBvcnQgdGVtcGxhdGU6ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGEgdGVtcGxhdGUgdG8gZXh0ZXJuYWwgZm9ybWF0XG4gICAqIFNFQ1VSSVRZIEZJWCAjMzogVXNlcyBzYWZlIFlBTUwgc2VyaWFsaXphdGlvblxuICAgKi9cbiAgYXN5bmMgZXhwb3J0RWxlbWVudCh0ZW1wbGF0ZTogVGVtcGxhdGUsIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICAgIC8vIFVzZSBzZXJpYWxpemVUb0pTT04gZm9yIEpTT04gZm9ybWF0LCBvciBzZXJpYWxpemUgaWYgbm90IGF2YWlsYWJsZVxuICAgICAgICAgIHJldHVybiAodGVtcGxhdGUgYXMgYW55KS5zZXJpYWxpemVUb0pTT04gPyAodGVtcGxhdGUgYXMgYW55KS5zZXJpYWxpemVUb0pTT04oKSA6IHRlbXBsYXRlLnNlcmlhbGl6ZSgpO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlICd5YW1sJzpcbiAgICAgICAgICAvLyBTRUNVUklUWSBGSVg6IFVzZSB5YW1sLmR1bXAgd2l0aCBGQUlMU0FGRV9TQ0hFTUEgdG8gcHJldmVudCBjb2RlIGV4ZWN1dGlvblxuICAgICAgICAgIC8vIFByZXZpb3VzbHk6IENvdWxkIHBvdGVudGlhbGx5IHVzZSB1bnNhZmUgWUFNTCBmZWF0dXJlc1xuICAgICAgICAgIC8vIE5vdzogRkFJTFNBRkVfU0NIRU1BIG9ubHkgYWxsb3dzIGJhc2ljIFlBTUwgdHlwZXMsIG5vIEpTLXNwZWNpZmljIGNvbnN0cnVjdHNcbiAgICAgICAgICBjb25zdCB5YW1sRGF0YSA9IHtcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0ZW1wbGF0ZS5tZXRhZGF0YSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHRlbXBsYXRlLmNvbnRlbnQsXG4gICAgICAgICAgICBpZDogdGVtcGxhdGUuaWQsXG4gICAgICAgICAgICB2ZXJzaW9uOiB0ZW1wbGF0ZS52ZXJzaW9uXG4gICAgICAgICAgfTtcbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4geWFtbC5kdW1wKHlhbWxEYXRhLCB7XG4gICAgICAgICAgICAvLyBTRUNVUklUWSBUUkFERS1PRkY6IFVzaW5nIERFRkFVTFRfU0NIRU1BIGluc3RlYWQgb2YgRkFJTFNBRkVfU0NIRU1BXG4gICAgICAgICAgICAvLyBSZWFzb246IEZBSUxTQUZFX1NDSEVNQSBkb2Vzbid0IHN1cHBvcnQgbnVtYmVyIHR5cGVzIHdoaWNoIGFyZSBuZWVkZWQgZm9yIHRlbXBsYXRlIG1ldGFkYXRhXG4gICAgICAgICAgICAvLyBSaXNrOiBERUZBVUxUX1NDSEVNQSBhbGxvd3MgbW9yZSBZQU1MIGZlYXR1cmVzIHRoYXQgY291bGQgYmUgZXhwbG9pdGVkXG4gICAgICAgICAgICAvLyBNaXRpZ2F0aW9uOiBub1JlZnMgcHJldmVudHMgcmVmZXJlbmNlIGF0dGFja3MsIHNraXBJbnZhbGlkIGRyb3BzIGRhbmdlcm91cyBjb25zdHJ1Y3RzXG4gICAgICAgICAgICAvLyBDb25zaWRlcjogRm9yIG1heGltdW0gc2VjdXJpdHksIGltcGxlbWVudCBjdXN0b20gc2NoZW1hIHRoYXQgb25seSBhbGxvd3MgbmVlZGVkIHR5cGVzXG4gICAgICAgICAgICBzY2hlbWE6IHlhbWwuREVGQVVMVF9TQ0hFTUEsXG4gICAgICAgICAgICBub1JlZnM6IHRydWUsICAgICAgICAvLyBQcmV2ZW50IHJlZmVyZW5jZSBhdHRhY2tzXG4gICAgICAgICAgICBzb3J0S2V5czogdHJ1ZSwgICAgICAvLyBDb25zaXN0ZW50IG91dHB1dFxuICAgICAgICAgICAgc2tpcEludmFsaWQ6IHRydWUsICAgLy8gU2tpcCB1bnNlcmlhbGl6YWJsZSB2YWx1ZXMgaW5zdGVhZCBvZiB0aHJvd2luZ1xuICAgICAgICAgICAgY29uZGVuc2VGbG93OiB0cnVlLCAgLy8gTW9yZSBjb21wYWN0IG91dHB1dFxuICAgICAgICAgICAgcXVvdGluZ1R5cGU6ICdcIicsICAgIC8vIEZvcmNlIGRvdWJsZSBxdW90ZXMgZm9yIGNvbnNpc3RlbmN5XG4gICAgICAgICAgICBmb3JjZVF1b3RlczogZmFsc2UgICAvLyBPbmx5IHF1b3RlIHdoZW4gbmVjZXNzYXJ5XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgJ21hcmtkb3duJzpcbiAgICAgICAgICBjb25zdCBmcm9udG1hdHRlciA9IHRoaXMuY3JlYXRlRnJvbnRtYXR0ZXIodGVtcGxhdGUubWV0YWRhdGEpO1xuICAgICAgICAgIHJldHVybiBgLS0tXFxuJHtmcm9udG1hdHRlcn1cXG4tLS1cXG5cXG4ke3RlbXBsYXRlLmNvbnRlbnR9YDtcbiAgICAgICAgICBcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGV4cG9ydCBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBleHBvcnQgdGVtcGxhdGU6ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYW5kIHNhbml0aXplIG1ldGFkYXRhXG4gICAqIFNFQ1VSSVRZIEZJWCAjNDogQ29tcHJlaGVuc2l2ZSBtZXRhZGF0YSB2YWxpZGF0aW9uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlTWV0YWRhdGEoZGF0YTogYW55KTogUHJvbWlzZTxQYXJ0aWFsPFRlbXBsYXRlTWV0YWRhdGE+PiB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFBhcnRpYWw8VGVtcGxhdGVNZXRhZGF0YT4gPSB7fTtcbiAgICBcbiAgICAvLyBTYW5pdGl6ZSBzdHJpbmcgZmllbGRzXG4gICAgaWYgKGRhdGEubmFtZSkge1xuICAgICAgbWV0YWRhdGEubmFtZSA9IHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoZGF0YS5uYW1lKS5ub3JtYWxpemVkQ29udGVudCwgMTAwKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKGRhdGEuZGVzY3JpcHRpb24pIHtcbiAgICAgIG1ldGFkYXRhLmRlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShkYXRhLmRlc2NyaXB0aW9uKS5ub3JtYWxpemVkQ29udGVudCwgNTAwKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKGRhdGEuY2F0ZWdvcnkpIHtcbiAgICAgIG1ldGFkYXRhLmNhdGVnb3J5ID0gc2FuaXRpemVJbnB1dChkYXRhLmNhdGVnb3J5LCA1MCk7XG4gICAgfVxuICAgIFxuICAgIGlmIChkYXRhLm91dHB1dF9mb3JtYXQpIHtcbiAgICAgIG1ldGFkYXRhLm91dHB1dF9mb3JtYXQgPSBzYW5pdGl6ZUlucHV0KGRhdGEub3V0cHV0X2Zvcm1hdCwgMjApO1xuICAgIH1cbiAgICBcbiAgICAvLyBWYWxpZGF0ZSBhcnJheXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLnRhZ3MpKSB7XG4gICAgICBtZXRhZGF0YS50YWdzID0gZGF0YS50YWdzLm1hcCgodGFnOiBhbnkpID0+IHNhbml0aXplSW5wdXQoU3RyaW5nKHRhZyksIDUwKSk7XG4gICAgfVxuICAgIFxuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEuaW5jbHVkZXMpKSB7XG4gICAgICBtZXRhZGF0YS5pbmNsdWRlcyA9IGRhdGEuaW5jbHVkZXMubWFwKChpbmM6IGFueSkgPT4gc2FuaXRpemVJbnB1dChTdHJpbmcoaW5jKSwgMjAwKSk7XG4gICAgfVxuICAgIFxuICAgIC8vIENvcHkgc2FmZSBmaWVsZHNcbiAgICBpZiAodHlwZW9mIGRhdGEudXNhZ2VfY291bnQgPT09ICdudW1iZXInKSB7XG4gICAgICBtZXRhZGF0YS51c2FnZV9jb3VudCA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoZGF0YS51c2FnZV9jb3VudCkpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoZGF0YS5sYXN0X3VzZWQpIHtcbiAgICAgIG1ldGFkYXRhLmxhc3RfdXNlZCA9IHNhbml0aXplSW5wdXQoU3RyaW5nKGRhdGEubGFzdF91c2VkKSwgNTApO1xuICAgIH1cbiAgICBcbiAgICAvLyBWYWxpZGF0ZSBjb21wbGV4IGZpZWxkc1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEudmFyaWFibGVzKSkge1xuICAgICAgbWV0YWRhdGEudmFyaWFibGVzID0gZGF0YS52YXJpYWJsZXMubWFwKCh2OiBhbnkpID0+ICh7XG4gICAgICAgIG5hbWU6IHNhbml0aXplSW5wdXQodi5uYW1lIHx8ICcnLCA1MCksXG4gICAgICAgIHR5cGU6IHNhbml0aXplSW5wdXQodi50eXBlIHx8ICdzdHJpbmcnLCAyMCksXG4gICAgICAgIGRlc2NyaXB0aW9uOiB2LmRlc2NyaXB0aW9uID8gc2FuaXRpemVJbnB1dCh2LmRlc2NyaXB0aW9uLCAyMDApIDogdW5kZWZpbmVkLFxuICAgICAgICByZXF1aXJlZDogQm9vbGVhbih2LnJlcXVpcmVkKSxcbiAgICAgICAgZGVmYXVsdDogdi5kZWZhdWx0LFxuICAgICAgICB2YWxpZGF0aW9uOiB2LnZhbGlkYXRpb24gPyBzYW5pdGl6ZUlucHV0KHYudmFsaWRhdGlvbiwgMjAwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgb3B0aW9uczogQXJyYXkuaXNBcnJheSh2Lm9wdGlvbnMpID8gdi5vcHRpb25zLm1hcCgobzogYW55KSA9PiBzYW5pdGl6ZUlucHV0KFN0cmluZyhvKSwgMTAwKSkgOiB1bmRlZmluZWQsXG4gICAgICAgIGZvcm1hdDogdi5mb3JtYXQgPyBzYW5pdGl6ZUlucHV0KHYuZm9ybWF0LCA1MCkgOiB1bmRlZmluZWRcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS5leGFtcGxlcykpIHtcbiAgICAgIG1ldGFkYXRhLmV4YW1wbGVzID0gZGF0YS5leGFtcGxlcy5tYXAoKGV4OiBhbnkpID0+ICh7XG4gICAgICAgIHRpdGxlOiBzYW5pdGl6ZUlucHV0KGV4LnRpdGxlIHx8ICcnLCAxMDApLFxuICAgICAgICBkZXNjcmlwdGlvbjogZXguZGVzY3JpcHRpb24gPyBzYW5pdGl6ZUlucHV0KGV4LmRlc2NyaXB0aW9uLCA1MDApIDogdW5kZWZpbmVkLFxuICAgICAgICB2YXJpYWJsZXM6IGV4LnZhcmlhYmxlcyB8fCB7fSxcbiAgICAgICAgb3V0cHV0OiBleC5vdXRwdXQgPyBzYW5pdGl6ZUlucHV0KGV4Lm91dHB1dCwgNTAwMCkgOiB1bmRlZmluZWRcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ29weSBzdGFuZGFyZCBlbGVtZW50IGZpZWxkc1xuICAgIG1ldGFkYXRhLmF1dGhvciA9IGRhdGEuYXV0aG9yID8gc2FuaXRpemVJbnB1dChkYXRhLmF1dGhvciwgMTAwKSA6IHVuZGVmaW5lZDtcbiAgICBtZXRhZGF0YS52ZXJzaW9uID0gZGF0YS52ZXJzaW9uID8gc2FuaXRpemVJbnB1dChkYXRhLnZlcnNpb24sIDIwKSA6IHVuZGVmaW5lZDtcbiAgICBcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFlBTUwgZnJvbnRtYXR0ZXIgZnJvbSBtZXRhZGF0YVxuICAgKiBTRUNVUklUWSBGSVggIzM6IFNhZmUgWUFNTCBnZW5lcmF0aW9uXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUZyb250bWF0dGVyKG1ldGFkYXRhOiBUZW1wbGF0ZU1ldGFkYXRhKTogc3RyaW5nIHtcbiAgICAvLyBTRUNVUklUWSBGSVg6IFVzZSB5YW1sLmR1bXAgd2l0aCBzZWN1cml0eSBvcHRpb25zXG4gICAgLy8gRW5zdXJlcyBubyBjb2RlIGV4ZWN1dGlvbiB2dWxuZXJhYmlsaXRpZXMgaW4gZ2VuZXJhdGVkIFlBTUxcbiAgICBjb25zdCBzYWZlTWV0YWRhdGEgPSB7XG4gICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgYXV0aG9yOiBtZXRhZGF0YS5hdXRob3IsXG4gICAgICB2ZXJzaW9uOiBtZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgY2F0ZWdvcnk6IG1ldGFkYXRhLmNhdGVnb3J5LFxuICAgICAgb3V0cHV0X2Zvcm1hdDogbWV0YWRhdGEub3V0cHV0X2Zvcm1hdCxcbiAgICAgIHRhZ3M6IG1ldGFkYXRhLnRhZ3MsXG4gICAgICBpbmNsdWRlczogbWV0YWRhdGEuaW5jbHVkZXMsXG4gICAgICB1c2FnZV9jb3VudDogbWV0YWRhdGEudXNhZ2VfY291bnQsXG4gICAgICBsYXN0X3VzZWQ6IG1ldGFkYXRhLmxhc3RfdXNlZCxcbiAgICAgIHZhcmlhYmxlczogbWV0YWRhdGEudmFyaWFibGVzLFxuICAgICAgZXhhbXBsZXM6IG1ldGFkYXRhLmV4YW1wbGVzXG4gICAgfTtcbiAgICBcbiAgICAvLyBSZW1vdmUgdW5kZWZpbmVkIHZhbHVlc1xuICAgIGNvbnN0IGNsZWFuTWV0YWRhdGEgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhzYWZlTWV0YWRhdGEpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICApO1xuICAgIFxuICAgIHJldHVybiB5YW1sLmR1bXAoY2xlYW5NZXRhZGF0YSwge1xuICAgICAgLy8gU0VDVVJJVFkgVFJBREUtT0ZGOiBTYW1lIGFzIGV4cG9ydEVsZW1lbnQgLSB1c2luZyBERUZBVUxUX1NDSEVNQSBmb3IgdHlwZSBzdXBwb3J0XG4gICAgICAvLyBTZWUgZXhwb3J0RWxlbWVudCBtZXRob2QgZm9yIGRldGFpbGVkIHNlY3VyaXR5IGNvbnNpZGVyYXRpb25zXG4gICAgICBzY2hlbWE6IHlhbWwuREVGQVVMVF9TQ0hFTUEsXG4gICAgICBub1JlZnM6IHRydWUsXG4gICAgICBzb3J0S2V5czogdHJ1ZSxcbiAgICAgIGxpbmVXaWR0aDogODAsXG4gICAgICBza2lwSW52YWxpZDogdHJ1ZSxcbiAgICAgIGNvbmRlbnNlRmxvdzogdHJ1ZSxcbiAgICAgIHF1b3RpbmdUeXBlOiAnXCInLFxuICAgICAgZm9yY2VRdW90ZXM6IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSB0ZW1wbGF0ZSBmaWxlIGV4aXN0c1xuICAgKi9cbiAgYXN5bmMgZXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWRQYXRoKSBcbiAgICAgID8gc2FuaXRpemVkUGF0aCBcbiAgICAgIDogcGF0aC5qb2luKHRoaXMudGVtcGxhdGVzRGlyLCBzYW5pdGl6ZWRQYXRoKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZ1bGxQYXRoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIG11bHRpcGxlIHRlbXBsYXRlcyBieSBwcmVkaWNhdGVcbiAgICovXG4gIGFzeW5jIGZpbmRNYW55KHByZWRpY2F0ZTogKHRlbXBsYXRlOiBUZW1wbGF0ZSkgPT4gYm9vbGVhbik6IFByb21pc2U8VGVtcGxhdGVbXT4ge1xuICAgIGNvbnN0IHRlbXBsYXRlcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiB0ZW1wbGF0ZXMuZmlsdGVyKHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSB0ZW1wbGF0ZVxuICAgKi9cbiAgdmFsaWRhdGUodGVtcGxhdGU6IFRlbXBsYXRlKTogRWxlbWVudFZhbGlkYXRpb25SZXN1bHQge1xuICAgIHJldHVybiB0ZW1wbGF0ZS52YWxpZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgZmlsZSBwYXRoXG4gICAqL1xuICB2YWxpZGF0ZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5pc0Fic29sdXRlKHNhbml0aXplZFBhdGgpIFxuICAgICAgICA/IHNhbml0aXplZFBhdGggXG4gICAgICAgIDogcGF0aC5qb2luKHRoaXMudGVtcGxhdGVzRGlyLCBzYW5pdGl6ZWRQYXRoKTtcbiAgICAgIFxuICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLm5vcm1hbGl6ZShmdWxsUGF0aCk7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aCh0aGlzLnRlbXBsYXRlc0Rpcik7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZWxlbWVudCB0eXBlXG4gICAqL1xuICBnZXRFbGVtZW50VHlwZSgpOiBFbGVtZW50VHlwZSB7XG4gICAgcmV0dXJuIEVsZW1lbnRUeXBlLlRFTVBMQVRFO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlsZSBleHRlbnNpb25cbiAgICovXG4gIGdldEZpbGVFeHRlbnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJy5tZCc7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0ZW1wbGF0ZXMgYnkgY2F0ZWdvcnlcbiAgICovXG4gIGFzeW5jIGZpbmRCeUNhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcpOiBQcm9taXNlPFRlbXBsYXRlW10+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRDYXRlZ29yeSA9IHNhbml0aXplSW5wdXQoY2F0ZWdvcnksIDUwKTtcbiAgICByZXR1cm4gdGhpcy5saXN0KCkudGhlbih0ZW1wbGF0ZXMgPT4gXG4gICAgICB0ZW1wbGF0ZXMuZmlsdGVyKHQgPT4gdC5tZXRhZGF0YS5jYXRlZ29yeSA9PT0gc2FuaXRpemVkQ2F0ZWdvcnkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRlbXBsYXRlcyBieSB0YWdcbiAgICovXG4gIGFzeW5jIGZpbmRCeVRhZyh0YWc6IHN0cmluZyk6IFByb21pc2U8VGVtcGxhdGVbXT4ge1xuICAgIGNvbnN0IHNhbml0aXplZFRhZyA9IHNhbml0aXplSW5wdXQodGFnLCA1MCk7XG4gICAgcmV0dXJuIHRoaXMubGlzdCgpLnRoZW4odGVtcGxhdGVzID0+IFxuICAgICAgdGVtcGxhdGVzLmZpbHRlcih0ID0+IHQubWV0YWRhdGEudGFncz8uaW5jbHVkZXMoc2FuaXRpemVkVGFnKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtb3N0IHVzZWQgdGVtcGxhdGVzXG4gICAqL1xuICBhc3luYyBnZXRNb3N0VXNlZChsaW1pdDogbnVtYmVyID0gMTApOiBQcm9taXNlPFRlbXBsYXRlW10+IHtcbiAgICAvLyBTRUNVUklUWSBGSVg6IFZhbGlkYXRlIGxpbWl0IHBhcmFtZXRlciB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSBtZW1vcnkgdXNhZ2VcbiAgICAvLyBQcmV2aW91c2x5OiBObyB2YWxpZGF0aW9uIGNvdWxkIGFsbG93IHZlcnkgbGFyZ2UgbGltaXRzXG4gICAgLy8gTm93OiBFbmZvcmNlcyByZWFzb25hYmxlIGJvdW5kc1xuICAgIGNvbnN0IE1JTl9MSU1JVCA9IDE7XG4gICAgY29uc3QgTUFYX0xJTUlUID0gMTAwO1xuICAgIGNvbnN0IHZhbGlkYXRlZExpbWl0ID0gTWF0aC5tYXgoTUlOX0xJTUlULCBNYXRoLm1pbihNQVhfTElNSVQsIE1hdGguZmxvb3IobGltaXQpKSk7XG4gICAgXG4gICAgaWYgKGxpbWl0ICE9PSB2YWxpZGF0ZWRMaW1pdCkge1xuICAgICAgbG9nZ2VyLndhcm4oYGdldE1vc3RVc2VkOiBsaW1pdCAke2xpbWl0fSBhZGp1c3RlZCB0byAke3ZhbGlkYXRlZExpbWl0fSAodmFsaWQgcmFuZ2U6ICR7TUlOX0xJTUlUfS0ke01BWF9MSU1JVH0pYCk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHRlbXBsYXRlcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiB0ZW1wbGF0ZXNcbiAgICAgIC5zb3J0KChhLCBiKSA9PiAoYi5tZXRhZGF0YS51c2FnZV9jb3VudCB8fCAwKSAtIChhLm1ldGFkYXRhLnVzYWdlX2NvdW50IHx8IDApKVxuICAgICAgLnNsaWNlKDAsIHZhbGlkYXRlZExpbWl0KTtcbiAgfVxufSJdfQ==
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Auto-generated file - DO NOT EDIT
|
|
3
3
|
* Generated at build time by scripts/generate-version.js
|
|
4
4
|
*/
|
|
5
|
-
export declare const PACKAGE_VERSION = "1.
|
|
6
|
-
export declare const BUILD_TIMESTAMP = "2025-08-
|
|
5
|
+
export declare const PACKAGE_VERSION = "1.6.0";
|
|
6
|
+
export declare const BUILD_TIMESTAMP = "2025-08-25T17:29:38.593Z";
|
|
7
7
|
export declare const BUILD_TYPE: 'npm' | 'git';
|
|
8
8
|
export declare const PACKAGE_NAME = "@dollhousemcp/mcp-server";
|
|
9
9
|
//# sourceMappingURL=version.d.ts.map
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Auto-generated file - DO NOT EDIT
|
|
3
3
|
* Generated at build time by scripts/generate-version.js
|
|
4
4
|
*/
|
|
5
|
-
export const PACKAGE_VERSION = '1.
|
|
6
|
-
export const BUILD_TIMESTAMP = '2025-08-
|
|
5
|
+
export const PACKAGE_VERSION = '1.6.0';
|
|
6
|
+
export const BUILD_TIMESTAMP = '2025-08-25T17:29:38.593Z';
|
|
7
7
|
export const BUILD_TYPE = 'npm';
|
|
8
8
|
export const PACKAGE_NAME = '@dollhousemcp/mcp-server';
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcxLjYuMCc7XG5leHBvcnQgY29uc3QgQlVJTERfVElNRVNUQU1QID0gJzIwMjUtMDgtMjVUMTc6Mjk6MzguNTkzWic7XG5leHBvcnQgY29uc3QgQlVJTERfVFlQRTogJ25wbScgfCAnZ2l0JyA9ICducG0nO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9ICdAZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXInO1xuIl19
|
package/dist/index.barrel.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Central barrel file for easier imports
|
|
3
3
|
*
|
|
4
4
|
* Usage:
|
|
5
|
-
* import { PersonaManager, GitHubClient
|
|
5
|
+
* import { PersonaManager, GitHubClient } from '@/index.barrel';
|
|
6
6
|
*/
|
|
7
7
|
export * from './types/index.js';
|
|
8
8
|
export * from './config/constants.js';
|
|
@@ -15,7 +15,6 @@ export * from './utils/version.js';
|
|
|
15
15
|
export * from './cache/APICache.js';
|
|
16
16
|
export * from './persona/index.js';
|
|
17
17
|
export * from './collection/index.js';
|
|
18
|
-
export * from './update/index.js';
|
|
19
18
|
export * from './server/index.js';
|
|
20
19
|
export { DollhouseMCPServer } from './index.js';
|
|
21
20
|
//# sourceMappingURL=index.barrel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.barrel.d.ts","sourceRoot":"","sources":["../src/index.barrel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,kBAAkB,CAAC;AAGjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAG7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAG7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AAGnC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,oBAAoB,CAAC;AAGnC,cAAc,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.barrel.d.ts","sourceRoot":"","sources":["../src/index.barrel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,kBAAkB,CAAC;AAGjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAG7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAG7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AAGnC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,oBAAoB,CAAC;AAGnC,cAAc,uBAAuB,CAAC;AAItC,cAAc,mBAAmB,CAAC;AAGlC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.barrel.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Central barrel file for easier imports
|
|
3
3
|
*
|
|
4
4
|
* Usage:
|
|
5
|
-
* import { PersonaManager, GitHubClient
|
|
5
|
+
* import { PersonaManager, GitHubClient } from '@/index.barrel';
|
|
6
6
|
*/
|
|
7
7
|
// Types
|
|
8
8
|
export * from './types/index.js';
|
|
@@ -22,10 +22,8 @@ export * from './cache/APICache.js';
|
|
|
22
22
|
export * from './persona/index.js';
|
|
23
23
|
// Collection
|
|
24
24
|
export * from './collection/index.js';
|
|
25
|
-
// Update
|
|
26
|
-
export * from './update/index.js';
|
|
27
25
|
// Server
|
|
28
26
|
export * from './server/index.js';
|
|
29
27
|
// Main server
|
|
30
28
|
export { DollhouseMCPServer } from './index.js';
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguYmFycmVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LmJhcnJlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILFFBQVE7QUFDUixjQUFjLGtCQUFrQixDQUFDO0FBRWpDLFNBQVM7QUFDVCxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsOEJBQThCLENBQUM7QUFFN0MsV0FBVztBQUNYLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyw4QkFBOEIsQ0FBQztBQUU3QyxRQUFRO0FBQ1IsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsb0JBQW9CLENBQUM7QUFFbkMsUUFBUTtBQUNSLGNBQWMscUJBQXFCLENBQUM7QUFFcEMsVUFBVTtBQUNWLGNBQWMsb0JBQW9CLENBQUM7QUFFbkMsYUFBYTtBQUNiLGNBQWMsdUJBQXVCLENBQUM7QUFHdEMsU0FBUztBQUNULGNBQWMsbUJBQW1CLENBQUM7QUFFbEMsY0FBYztBQUNkLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2VudHJhbCBiYXJyZWwgZmlsZSBmb3IgZWFzaWVyIGltcG9ydHNcbiAqIFxuICogVXNhZ2U6XG4gKiBpbXBvcnQgeyBQZXJzb25hTWFuYWdlciwgR2l0SHViQ2xpZW50IH0gZnJvbSAnQC9pbmRleC5iYXJyZWwnO1xuICovXG5cbi8vIFR5cGVzXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzL2luZGV4LmpzJztcblxuLy8gQ29uZmlnXG5leHBvcnQgKiBmcm9tICcuL2NvbmZpZy9jb25zdGFudHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25maWcvaW5kaWNhdG9yLWNvbmZpZy5qcyc7XG5cbi8vIFNlY3VyaXR5XG5leHBvcnQgKiBmcm9tICcuL3NlY3VyaXR5L2NvbnN0YW50cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcblxuLy8gVXRpbHNcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvZmlsZXN5c3RlbS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL2dpdC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL3ZlcnNpb24uanMnO1xuXG4vLyBDYWNoZVxuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS9BUElDYWNoZS5qcyc7XG5cbi8vIFBlcnNvbmFcbmV4cG9ydCAqIGZyb20gJy4vcGVyc29uYS9pbmRleC5qcyc7XG5cbi8vIENvbGxlY3Rpb25cbmV4cG9ydCAqIGZyb20gJy4vY29sbGVjdGlvbi9pbmRleC5qcyc7XG5cblxuLy8gU2VydmVyXG5leHBvcnQgKiBmcm9tICcuL3NlcnZlci9pbmRleC5qcyc7XG5cbi8vIE1haW4gc2VydmVyXG5leHBvcnQgeyBEb2xsaG91c2VNQ1BTZXJ2ZXIgfSBmcm9tICcuL2luZGV4LmpzJzsiXX0=
|
package/dist/index.d.ts
CHANGED
|
@@ -3,22 +3,24 @@ import { type IndicatorConfig } from './config/indicator-config.js';
|
|
|
3
3
|
import { IToolHandler } from './server/index.js';
|
|
4
4
|
export declare class DollhouseMCPServer implements IToolHandler {
|
|
5
5
|
private server;
|
|
6
|
-
|
|
6
|
+
personasDir: string | null;
|
|
7
7
|
private personas;
|
|
8
8
|
private activePersona;
|
|
9
9
|
private currentUser;
|
|
10
|
+
private isInitialized;
|
|
11
|
+
private initializationPromise;
|
|
10
12
|
private apiCache;
|
|
11
13
|
private collectionCache;
|
|
12
14
|
private rateLimitTracker;
|
|
13
15
|
private indicatorConfig;
|
|
14
16
|
private githubClient;
|
|
15
17
|
private githubAuthManager;
|
|
18
|
+
private collectionIndexManager;
|
|
16
19
|
private collectionBrowser;
|
|
17
20
|
private collectionSearch;
|
|
18
21
|
private personaDetails;
|
|
19
22
|
private elementInstaller;
|
|
20
23
|
private personaSubmitter;
|
|
21
|
-
private updateManager?;
|
|
22
24
|
private serverSetup;
|
|
23
25
|
private personaExporter;
|
|
24
26
|
private personaImporter?;
|
|
@@ -30,6 +32,17 @@ export declare class DollhouseMCPServer implements IToolHandler {
|
|
|
30
32
|
private agentManager;
|
|
31
33
|
constructor();
|
|
32
34
|
private initializePortfolio;
|
|
35
|
+
/**
|
|
36
|
+
* Complete initialization after portfolio is ready
|
|
37
|
+
* FIX #610: This was previously in a .then() callback in the constructor
|
|
38
|
+
* Now called synchronously from run() to prevent race condition
|
|
39
|
+
*/
|
|
40
|
+
private completeInitialization;
|
|
41
|
+
/**
|
|
42
|
+
* Ensure server is initialized before any operation
|
|
43
|
+
* FIX #610: Added for test compatibility - tests don't call run()
|
|
44
|
+
*/
|
|
45
|
+
private ensureInitialized;
|
|
33
46
|
/**
|
|
34
47
|
* Initialize collection cache with seed data for anonymous browsing
|
|
35
48
|
*/
|
|
@@ -185,6 +198,12 @@ export declare class DollhouseMCPServer implements IToolHandler {
|
|
|
185
198
|
text: string;
|
|
186
199
|
}[];
|
|
187
200
|
}>;
|
|
201
|
+
searchCollectionEnhanced(query: string, options?: any): Promise<{
|
|
202
|
+
content: {
|
|
203
|
+
type: string;
|
|
204
|
+
text: string;
|
|
205
|
+
}[];
|
|
206
|
+
}>;
|
|
188
207
|
getCollectionContent(path: string): Promise<{
|
|
189
208
|
content: {
|
|
190
209
|
type: string;
|
|
@@ -240,16 +259,25 @@ export declare class DollhouseMCPServer implements IToolHandler {
|
|
|
240
259
|
text: string;
|
|
241
260
|
}[];
|
|
242
261
|
}>;
|
|
262
|
+
getOAuthHelperStatus(verbose?: boolean): Promise<{
|
|
263
|
+
content: {
|
|
264
|
+
type: string;
|
|
265
|
+
text: string;
|
|
266
|
+
}[];
|
|
267
|
+
}>;
|
|
268
|
+
private checkOAuthHelperHealth;
|
|
243
269
|
clearGitHubAuth(): Promise<{
|
|
244
270
|
content: {
|
|
245
271
|
type: string;
|
|
246
272
|
text: string;
|
|
247
273
|
}[];
|
|
248
274
|
}>;
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
275
|
+
configureOAuth(client_id?: string): Promise<{
|
|
276
|
+
content: {
|
|
277
|
+
type: string;
|
|
278
|
+
text: string;
|
|
279
|
+
}[];
|
|
280
|
+
}>;
|
|
253
281
|
createPersona(name: string, description: string, instructions: string, triggers?: string): Promise<{
|
|
254
282
|
content: {
|
|
255
283
|
type: string;
|
|
@@ -268,99 +296,189 @@ export declare class DollhouseMCPServer implements IToolHandler {
|
|
|
268
296
|
text: string;
|
|
269
297
|
}[];
|
|
270
298
|
}>;
|
|
271
|
-
|
|
299
|
+
/**
|
|
300
|
+
* Configure indicator settings
|
|
301
|
+
*/
|
|
302
|
+
configureIndicator(config: Partial<IndicatorConfig>): Promise<{
|
|
272
303
|
content: {
|
|
273
304
|
type: string;
|
|
274
305
|
text: string;
|
|
275
306
|
}[];
|
|
276
307
|
}>;
|
|
277
|
-
|
|
308
|
+
/**
|
|
309
|
+
* Get current indicator configuration
|
|
310
|
+
*/
|
|
311
|
+
configureCollectionSubmission(autoSubmit: boolean): Promise<{
|
|
278
312
|
content: {
|
|
279
313
|
type: string;
|
|
280
314
|
text: string;
|
|
281
315
|
}[];
|
|
282
316
|
}>;
|
|
283
|
-
|
|
317
|
+
getCollectionSubmissionConfig(): Promise<{
|
|
284
318
|
content: {
|
|
285
319
|
type: string;
|
|
286
320
|
text: string;
|
|
287
321
|
}[];
|
|
288
322
|
}>;
|
|
289
|
-
|
|
323
|
+
getIndicatorConfig(): Promise<{
|
|
290
324
|
content: {
|
|
291
325
|
type: string;
|
|
292
326
|
text: string;
|
|
293
327
|
}[];
|
|
294
328
|
}>;
|
|
295
|
-
|
|
329
|
+
/**
|
|
330
|
+
* Export a single persona
|
|
331
|
+
*/
|
|
332
|
+
exportPersona(personaName: string): Promise<{
|
|
296
333
|
content: {
|
|
297
334
|
type: string;
|
|
298
335
|
text: string;
|
|
299
336
|
}[];
|
|
300
337
|
}>;
|
|
301
338
|
/**
|
|
302
|
-
*
|
|
339
|
+
* Export all personas
|
|
303
340
|
*/
|
|
304
|
-
|
|
341
|
+
exportAllPersonas(includeDefaults?: boolean): Promise<{
|
|
305
342
|
content: {
|
|
306
343
|
type: string;
|
|
307
344
|
text: string;
|
|
308
345
|
}[];
|
|
309
346
|
}>;
|
|
310
347
|
/**
|
|
311
|
-
*
|
|
348
|
+
* Import a persona
|
|
312
349
|
*/
|
|
313
|
-
|
|
350
|
+
importPersona(source: string, overwrite?: boolean): Promise<{
|
|
314
351
|
content: {
|
|
315
352
|
type: string;
|
|
316
353
|
text: string;
|
|
317
354
|
}[];
|
|
318
355
|
}>;
|
|
319
356
|
/**
|
|
320
|
-
*
|
|
357
|
+
* Share a persona via URL
|
|
321
358
|
*/
|
|
322
|
-
|
|
359
|
+
sharePersona(personaName: string, expiryDays?: number): Promise<{
|
|
323
360
|
content: {
|
|
324
361
|
type: string;
|
|
325
362
|
text: string;
|
|
326
363
|
}[];
|
|
327
364
|
}>;
|
|
328
365
|
/**
|
|
329
|
-
*
|
|
366
|
+
* Import from a shared URL
|
|
330
367
|
*/
|
|
331
|
-
|
|
368
|
+
importFromUrl(url: string, overwrite?: boolean): Promise<{
|
|
332
369
|
content: {
|
|
333
370
|
type: string;
|
|
334
371
|
text: string;
|
|
335
372
|
}[];
|
|
336
373
|
}>;
|
|
337
374
|
/**
|
|
338
|
-
*
|
|
375
|
+
* Portfolio management methods
|
|
339
376
|
*/
|
|
340
|
-
|
|
377
|
+
/**
|
|
378
|
+
* Check portfolio status including repository existence and sync information
|
|
379
|
+
*/
|
|
380
|
+
portfolioStatus(username?: string): Promise<{
|
|
341
381
|
content: {
|
|
342
382
|
type: string;
|
|
343
383
|
text: string;
|
|
344
384
|
}[];
|
|
345
385
|
}>;
|
|
346
386
|
/**
|
|
347
|
-
*
|
|
387
|
+
* Initialize a new GitHub portfolio repository
|
|
348
388
|
*/
|
|
349
|
-
|
|
389
|
+
initPortfolio(options: {
|
|
390
|
+
repositoryName?: string;
|
|
391
|
+
private?: boolean;
|
|
392
|
+
description?: string;
|
|
393
|
+
}): Promise<{
|
|
350
394
|
content: {
|
|
351
395
|
type: string;
|
|
352
396
|
text: string;
|
|
353
397
|
}[];
|
|
354
398
|
}>;
|
|
355
399
|
/**
|
|
356
|
-
*
|
|
400
|
+
* Configure portfolio settings
|
|
357
401
|
*/
|
|
358
|
-
|
|
402
|
+
portfolioConfig(options: {
|
|
403
|
+
autoSync?: boolean;
|
|
404
|
+
defaultVisibility?: string;
|
|
405
|
+
autoSubmit?: boolean;
|
|
406
|
+
repositoryName?: string;
|
|
407
|
+
}): Promise<{
|
|
408
|
+
content: {
|
|
409
|
+
type: string;
|
|
410
|
+
text: string;
|
|
411
|
+
}[];
|
|
412
|
+
}>;
|
|
413
|
+
/**
|
|
414
|
+
* Sync portfolio with GitHub
|
|
415
|
+
*/
|
|
416
|
+
syncPortfolio(options: {
|
|
417
|
+
direction: string;
|
|
418
|
+
force: boolean;
|
|
419
|
+
dryRun: boolean;
|
|
420
|
+
}): Promise<{
|
|
421
|
+
content: {
|
|
422
|
+
type: string;
|
|
423
|
+
text: string;
|
|
424
|
+
}[];
|
|
425
|
+
}>;
|
|
426
|
+
/**
|
|
427
|
+
* Search local portfolio using the metadata index system
|
|
428
|
+
* This provides fast, comprehensive search across all element types
|
|
429
|
+
*/
|
|
430
|
+
searchPortfolio(options: {
|
|
431
|
+
query: string;
|
|
432
|
+
elementType?: string;
|
|
433
|
+
fuzzyMatch?: boolean;
|
|
434
|
+
maxResults?: number;
|
|
435
|
+
includeKeywords?: boolean;
|
|
436
|
+
includeTags?: boolean;
|
|
437
|
+
includeTriggers?: boolean;
|
|
438
|
+
includeDescriptions?: boolean;
|
|
439
|
+
}): Promise<{
|
|
359
440
|
content: {
|
|
360
441
|
type: string;
|
|
361
442
|
text: string;
|
|
362
443
|
}[];
|
|
363
444
|
}>;
|
|
445
|
+
/**
|
|
446
|
+
* Search across all sources (local, GitHub, collection) using UnifiedIndexManager
|
|
447
|
+
* This provides comprehensive search with duplicate detection and version comparison
|
|
448
|
+
*/
|
|
449
|
+
searchAll(options: {
|
|
450
|
+
query: string;
|
|
451
|
+
sources?: string[];
|
|
452
|
+
elementType?: string;
|
|
453
|
+
page?: number;
|
|
454
|
+
pageSize?: number;
|
|
455
|
+
sortBy?: string;
|
|
456
|
+
}): Promise<{
|
|
457
|
+
content: {
|
|
458
|
+
type: string;
|
|
459
|
+
text: string;
|
|
460
|
+
}[];
|
|
461
|
+
}>;
|
|
462
|
+
/**
|
|
463
|
+
* Get icon for source type
|
|
464
|
+
*/
|
|
465
|
+
private getSourceIcon;
|
|
466
|
+
/**
|
|
467
|
+
* Get icon for element type
|
|
468
|
+
*/
|
|
469
|
+
private getElementIcon;
|
|
470
|
+
/**
|
|
471
|
+
* Helper method to count elements in a directory
|
|
472
|
+
*/
|
|
473
|
+
private countElementsInDir;
|
|
474
|
+
/**
|
|
475
|
+
* Helper method to get list of elements by type
|
|
476
|
+
*/
|
|
477
|
+
private getElementsList;
|
|
478
|
+
/**
|
|
479
|
+
* Helper method to load element by type
|
|
480
|
+
*/
|
|
481
|
+
private loadElementByType;
|
|
364
482
|
run(): Promise<void>;
|
|
365
483
|
}
|
|
366
484
|
//# sourceMappingURL=index.d.ts.map
|