@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionSearch.d.ts","sourceRoot":"","sources":["../../src/collection/CollectionSearch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAkB,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"CollectionSearch.d.ts","sourceRoot":"","sources":["../../src/collection/CollectionSearch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAkB,MAAM,6BAA6B,CAAC;AAM9E,OAAO,EAAc,aAAa,EAAE,aAAa,EAAmB,MAAM,wBAAwB,CAAC;AAEnG,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,aAAa,CAAwC;gBAEjD,YAAY,EAAE,YAAY,EAAE,eAAe,CAAC,EAAE,eAAe;IAMzE;;;OAGG;IACG,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IAiCrG;;;OAGG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAwCrD;;OAEG;YACW,eAAe;IA2C7B;;OAEG;IACH,OAAO,CAAC,cAAc;IAmCtB;;OAEG;IACH,OAAO,CAAC,UAAU;IAmBlB;;OAEG;IACH,OAAO,CAAC,+BAA+B;IAcvC;;OAEG;YACW,0BAA0B;IAiBxC;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,GAAE,MAAW,GAAG,MAAM;IAkCvF;;OAEG;YACW,eAAe;IAuC7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAU3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAwBzB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAkC/B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkC5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAQ/B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAYhC;;OAEG;IACH,iCAAiC,CAAC,OAAO,EAAE,aAAa,EAAE,gBAAgB,GAAE,MAAW,GAAG,MAAM;IA8ChG;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC;CASpC"}
|
|
@@ -2,33 +2,74 @@
|
|
|
2
2
|
* Search for content in the collection
|
|
3
3
|
*/
|
|
4
4
|
import { CollectionCache } from '../cache/CollectionCache.js';
|
|
5
|
+
import { CollectionIndexCache } from '../cache/CollectionIndexCache.js';
|
|
5
6
|
import { CollectionSeeder } from './CollectionSeeder.js';
|
|
6
7
|
import { logger } from '../utils/logger.js';
|
|
7
|
-
import { normalizeSearchTerm, validateSearchQuery } from '../utils/searchUtils.js';
|
|
8
|
+
import { normalizeSearchTerm, validateSearchQuery, isSearchMatch, debugNormalization } from '../utils/searchUtils.js';
|
|
9
|
+
import { ErrorHandler } from '../utils/ErrorHandler.js';
|
|
8
10
|
export class CollectionSearch {
|
|
9
11
|
githubClient;
|
|
10
12
|
collectionCache;
|
|
13
|
+
indexCache;
|
|
11
14
|
searchBaseUrl = 'https://api.github.com/search/code';
|
|
12
15
|
constructor(githubClient, collectionCache) {
|
|
13
16
|
this.githubClient = githubClient;
|
|
14
17
|
this.collectionCache = collectionCache || new CollectionCache();
|
|
18
|
+
this.indexCache = new CollectionIndexCache(githubClient);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Enhanced search using collection index with pagination and filtering
|
|
22
|
+
* Falls back to API search and cache when index is unavailable
|
|
23
|
+
*/
|
|
24
|
+
async searchCollectionWithOptions(query, options = {}) {
|
|
25
|
+
const startTime = Date.now();
|
|
26
|
+
logger.debug(`CollectionSearch.searchCollectionWithOptions called with query: "${query}"`, options);
|
|
27
|
+
// Validate search query for security
|
|
28
|
+
try {
|
|
29
|
+
validateSearchQuery(query, 1000);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
33
|
+
logger.error('Search query validation failed:', { query, error: errorMessage });
|
|
34
|
+
ErrorHandler.logError('CollectionSearch.searchWithOptions.validateQuery', error, { query });
|
|
35
|
+
return this.createEmptySearchResults(query, options);
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
// Try index-based search first
|
|
39
|
+
const indexResults = await this.searchFromIndex(query, options);
|
|
40
|
+
const searchTime = Date.now() - startTime;
|
|
41
|
+
logger.debug(`Index search completed in ${searchTime}ms with ${indexResults.items.length} results`);
|
|
42
|
+
return { ...indexResults, searchTime };
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
logger.debug('Index search failed, falling back to legacy search:', error);
|
|
46
|
+
// Fallback to legacy search
|
|
47
|
+
const legacyResults = await this.searchCollection(query);
|
|
48
|
+
const searchTime = Date.now() - startTime;
|
|
49
|
+
// Convert legacy results to new format
|
|
50
|
+
return this.convertLegacyResults(legacyResults, query, options, searchTime);
|
|
51
|
+
}
|
|
15
52
|
}
|
|
16
53
|
/**
|
|
17
54
|
* Search collection for content matching query
|
|
18
55
|
* Falls back to cached data when GitHub API is not available or not authenticated
|
|
19
56
|
*/
|
|
20
57
|
async searchCollection(query) {
|
|
58
|
+
logger.debug(`CollectionSearch.searchCollection called with query: "${query}"`);
|
|
21
59
|
// Validate search query for security
|
|
22
60
|
try {
|
|
23
61
|
validateSearchQuery(query, 1000);
|
|
24
62
|
}
|
|
25
63
|
catch (error) {
|
|
26
|
-
|
|
64
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
65
|
+
logger.error('Search query validation failed:', { query, error: errorMessage });
|
|
66
|
+
ErrorHandler.logError('CollectionSearch.search.validateQuery', error, { query });
|
|
27
67
|
return [];
|
|
28
68
|
}
|
|
29
69
|
try {
|
|
30
70
|
// First, try GitHub API search if authenticated
|
|
31
71
|
const searchUrl = `${this.searchBaseUrl}?q=${encodeURIComponent(query)}+repo:DollhouseMCP/collection+path:library+extension:md`;
|
|
72
|
+
logger.debug(`Attempting GitHub API search with URL: ${searchUrl}`);
|
|
32
73
|
const data = await this.githubClient.fetchFromGitHub(searchUrl, false); // Don't require auth for search
|
|
33
74
|
if (data.items && Array.isArray(data.items)) {
|
|
34
75
|
logger.debug(`Found ${data.items.length} items via GitHub API search`);
|
|
@@ -36,10 +77,13 @@ export class CollectionSearch {
|
|
|
36
77
|
await this.updateCacheFromGitHubItems(data.items);
|
|
37
78
|
return data.items;
|
|
38
79
|
}
|
|
80
|
+
logger.debug('GitHub API search returned no items, falling back to cache');
|
|
39
81
|
return [];
|
|
40
82
|
}
|
|
41
83
|
catch (error) {
|
|
42
|
-
|
|
84
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
85
|
+
logger.debug(`GitHub API search failed: ${errorMessage}. Falling back to cached search.`);
|
|
86
|
+
ErrorHandler.logError('CollectionSearch.search.githubApi', error, { query });
|
|
43
87
|
// Fallback to cached search
|
|
44
88
|
return this.searchFromCache(query);
|
|
45
89
|
}
|
|
@@ -48,6 +92,7 @@ export class CollectionSearch {
|
|
|
48
92
|
* Search cached collection items
|
|
49
93
|
*/
|
|
50
94
|
async searchFromCache(query) {
|
|
95
|
+
logger.debug(`Searching cache for query: "${query}"`);
|
|
51
96
|
try {
|
|
52
97
|
// Try to load from cache first
|
|
53
98
|
const cachedItems = await this.collectionCache.searchCache(query);
|
|
@@ -55,19 +100,29 @@ export class CollectionSearch {
|
|
|
55
100
|
logger.debug(`Found ${cachedItems.length} items from cache`);
|
|
56
101
|
return this.convertCacheItemsToGitHubFormat(cachedItems);
|
|
57
102
|
}
|
|
103
|
+
logger.debug('Cache search returned no results, trying seed data');
|
|
58
104
|
// If cache is empty or no results, use seed data
|
|
59
105
|
const seedItems = this.searchSeedData(query);
|
|
60
106
|
if (seedItems.length > 0) {
|
|
61
107
|
logger.debug(`Found ${seedItems.length} items from seed data`);
|
|
62
108
|
// Save seed data to cache for future use
|
|
63
|
-
|
|
109
|
+
try {
|
|
110
|
+
await this.collectionCache.saveCache(CollectionSeeder.getSeedData());
|
|
111
|
+
logger.debug('Saved seed data to cache');
|
|
112
|
+
}
|
|
113
|
+
catch (cacheError) {
|
|
114
|
+
const cacheErrorMessage = cacheError instanceof Error ? cacheError.message : String(cacheError);
|
|
115
|
+
logger.debug(`Failed to save seed data to cache: ${cacheErrorMessage}`);
|
|
116
|
+
}
|
|
64
117
|
return this.convertCacheItemsToGitHubFormat(seedItems);
|
|
65
118
|
}
|
|
66
119
|
logger.debug('No items found in cache or seed data');
|
|
67
120
|
return [];
|
|
68
121
|
}
|
|
69
122
|
catch (error) {
|
|
70
|
-
|
|
123
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
124
|
+
logger.debug(`Cache search failed: ${errorMessage}`);
|
|
125
|
+
ErrorHandler.logError('CollectionSearch.search.cache', error, { query });
|
|
71
126
|
// Last resort: search seed data without cache
|
|
72
127
|
const seedItems = this.searchSeedData(query);
|
|
73
128
|
logger.debug(`Fallback to seed data found ${seedItems.length} items`);
|
|
@@ -79,13 +134,50 @@ export class CollectionSearch {
|
|
|
79
134
|
*/
|
|
80
135
|
searchSeedData(query) {
|
|
81
136
|
const seedData = CollectionSeeder.getSeedData();
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
137
|
+
const normDebug = debugNormalization(query);
|
|
138
|
+
logger.debug(`Searching seed data - Original: "${normDebug.original}", Normalized: "${normDebug.normalized}", Partial: "${normDebug.partialMatch}"`);
|
|
139
|
+
logger.debug(`Searching against ${seedData.length} seed items`);
|
|
140
|
+
const matches = seedData.filter(item => {
|
|
141
|
+
// Use the improved matching function that tries multiple strategies
|
|
142
|
+
const nameMatches = isSearchMatch(query, item.name);
|
|
143
|
+
const pathMatches = isSearchMatch(query, item.path);
|
|
144
|
+
const isMatch = nameMatches || pathMatches;
|
|
145
|
+
if (isMatch) {
|
|
146
|
+
logger.debug(`✓ Match found: ${item.name} (${item.path}) matches query "${query}"`);
|
|
147
|
+
}
|
|
148
|
+
return isMatch;
|
|
88
149
|
});
|
|
150
|
+
// If no matches found, let's debug what we have
|
|
151
|
+
if (matches.length === 0) {
|
|
152
|
+
logger.debug('No matches found. Available seed data:');
|
|
153
|
+
seedData.slice(0, 10).forEach(item => {
|
|
154
|
+
logger.debug(` - ${item.name} (${item.path})`);
|
|
155
|
+
});
|
|
156
|
+
if (seedData.length > 10) {
|
|
157
|
+
logger.debug(` ... and ${seedData.length - 10} more items`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
logger.debug(`Found ${matches.length} matches in seed data`);
|
|
161
|
+
return matches;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Fuzzy matching algorithm for partial string matches
|
|
165
|
+
*/
|
|
166
|
+
fuzzyMatch(term, target) {
|
|
167
|
+
// Simple fuzzy matching: check if all characters of term appear in order in target
|
|
168
|
+
if (term.length === 0)
|
|
169
|
+
return true;
|
|
170
|
+
if (target.length === 0)
|
|
171
|
+
return false;
|
|
172
|
+
let termIndex = 0;
|
|
173
|
+
let targetIndex = 0;
|
|
174
|
+
while (termIndex < term.length && targetIndex < target.length) {
|
|
175
|
+
if (term[termIndex] === target[targetIndex]) {
|
|
176
|
+
termIndex++;
|
|
177
|
+
}
|
|
178
|
+
targetIndex++;
|
|
179
|
+
}
|
|
180
|
+
return termIndex === term.length;
|
|
89
181
|
}
|
|
90
182
|
/**
|
|
91
183
|
* Convert cache items to GitHub API format for consistent response structure
|
|
@@ -118,7 +210,7 @@ export class CollectionSearch {
|
|
|
118
210
|
logger.debug(`Updated cache with ${cacheItems.length} items from GitHub API`);
|
|
119
211
|
}
|
|
120
212
|
catch (error) {
|
|
121
|
-
|
|
213
|
+
ErrorHandler.logError('CollectionSearch.updateCacheInBackground', error);
|
|
122
214
|
// Don't throw - cache update failures shouldn't break functionality
|
|
123
215
|
}
|
|
124
216
|
}
|
|
@@ -148,5 +240,238 @@ export class CollectionSearch {
|
|
|
148
240
|
});
|
|
149
241
|
return textParts.join('');
|
|
150
242
|
}
|
|
243
|
+
/**
|
|
244
|
+
* Search from collection index with full featured search and pagination
|
|
245
|
+
*/
|
|
246
|
+
async searchFromIndex(query, options) {
|
|
247
|
+
const index = await this.indexCache.getIndex();
|
|
248
|
+
const allEntries = this.flattenIndexEntries(index);
|
|
249
|
+
// Filter by element type if specified
|
|
250
|
+
let filteredEntries = allEntries;
|
|
251
|
+
if (options.elementType) {
|
|
252
|
+
filteredEntries = allEntries.filter(entry => entry.type === options.elementType);
|
|
253
|
+
}
|
|
254
|
+
// Filter by category if specified
|
|
255
|
+
if (options.category) {
|
|
256
|
+
filteredEntries = filteredEntries.filter(entry => entry.category === options.category);
|
|
257
|
+
}
|
|
258
|
+
// Search matching
|
|
259
|
+
const matchedEntries = this.performIndexSearch(query, filteredEntries);
|
|
260
|
+
// Sort results
|
|
261
|
+
const sortedEntries = this.sortSearchResults(matchedEntries, options.sortBy || 'relevance', query);
|
|
262
|
+
// Apply pagination
|
|
263
|
+
const page = options.page || 1;
|
|
264
|
+
const pageSize = options.pageSize || 25;
|
|
265
|
+
const startIndex = (page - 1) * pageSize;
|
|
266
|
+
const endIndex = startIndex + pageSize;
|
|
267
|
+
const paginatedEntries = sortedEntries.slice(startIndex, endIndex);
|
|
268
|
+
return {
|
|
269
|
+
items: paginatedEntries,
|
|
270
|
+
total: sortedEntries.length,
|
|
271
|
+
page,
|
|
272
|
+
pageSize,
|
|
273
|
+
hasMore: endIndex < sortedEntries.length,
|
|
274
|
+
query,
|
|
275
|
+
searchTime: 0 // Will be set by caller
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Flatten index entries from all categories into a single array
|
|
280
|
+
*/
|
|
281
|
+
flattenIndexEntries(index) {
|
|
282
|
+
const entries = [];
|
|
283
|
+
for (const [elementType, typeEntries] of Object.entries(index.index)) {
|
|
284
|
+
entries.push(...typeEntries);
|
|
285
|
+
}
|
|
286
|
+
return entries;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Perform search matching on index entries
|
|
290
|
+
*/
|
|
291
|
+
performIndexSearch(query, entries) {
|
|
292
|
+
const normalizedQuery = normalizeSearchTerm(query);
|
|
293
|
+
const queryWords = normalizedQuery.split(/\s+/).filter(word => word.length > 0);
|
|
294
|
+
return entries.filter(entry => {
|
|
295
|
+
// Search in multiple fields
|
|
296
|
+
const searchableText = [
|
|
297
|
+
entry.name,
|
|
298
|
+
entry.description,
|
|
299
|
+
entry.path,
|
|
300
|
+
...entry.tags
|
|
301
|
+
].join(' ').toLowerCase();
|
|
302
|
+
// Use existing search utilities for consistency
|
|
303
|
+
const nameMatch = isSearchMatch(query, entry.name);
|
|
304
|
+
const descMatch = isSearchMatch(query, entry.description);
|
|
305
|
+
const pathMatch = isSearchMatch(query, entry.path);
|
|
306
|
+
const tagMatch = entry.tags.some(tag => isSearchMatch(query, tag));
|
|
307
|
+
return nameMatch || descMatch || pathMatch || tagMatch;
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Sort search results by relevance, name, or date
|
|
312
|
+
*/
|
|
313
|
+
sortSearchResults(entries, sortBy, query) {
|
|
314
|
+
const sorted = [...entries];
|
|
315
|
+
switch (sortBy) {
|
|
316
|
+
case 'name':
|
|
317
|
+
sorted.sort((a, b) => a.name.localeCompare(b.name));
|
|
318
|
+
break;
|
|
319
|
+
case 'date':
|
|
320
|
+
sorted.sort((a, b) => new Date(b.created).getTime() - new Date(a.created).getTime());
|
|
321
|
+
break;
|
|
322
|
+
case 'relevance':
|
|
323
|
+
default:
|
|
324
|
+
// Calculate relevance scores
|
|
325
|
+
sorted.sort((a, b) => {
|
|
326
|
+
const scoreA = this.calculateRelevanceScore(query, a);
|
|
327
|
+
const scoreB = this.calculateRelevanceScore(query, b);
|
|
328
|
+
return scoreB - scoreA;
|
|
329
|
+
});
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
return sorted;
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Calculate relevance score for search results
|
|
336
|
+
*/
|
|
337
|
+
calculateRelevanceScore(query, entry) {
|
|
338
|
+
const normalizedQuery = normalizeSearchTerm(query);
|
|
339
|
+
let score = 0;
|
|
340
|
+
// Exact name match gets highest score
|
|
341
|
+
if (normalizeSearchTerm(entry.name).includes(normalizedQuery)) {
|
|
342
|
+
score += 100;
|
|
343
|
+
}
|
|
344
|
+
// Description match
|
|
345
|
+
if (normalizeSearchTerm(entry.description).includes(normalizedQuery)) {
|
|
346
|
+
score += 50;
|
|
347
|
+
}
|
|
348
|
+
// Tag matches
|
|
349
|
+
const matchingTags = entry.tags.filter(tag => normalizeSearchTerm(tag).includes(normalizedQuery));
|
|
350
|
+
score += matchingTags.length * 25;
|
|
351
|
+
// Path match (lower priority)
|
|
352
|
+
if (normalizeSearchTerm(entry.path).includes(normalizedQuery)) {
|
|
353
|
+
score += 10;
|
|
354
|
+
}
|
|
355
|
+
// Bonus for recent content
|
|
356
|
+
const daysSinceCreated = (Date.now() - new Date(entry.created).getTime()) / (1000 * 60 * 60 * 24);
|
|
357
|
+
if (daysSinceCreated < 30) {
|
|
358
|
+
score += 5;
|
|
359
|
+
}
|
|
360
|
+
return score;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Convert legacy search results to new SearchResults format
|
|
364
|
+
*/
|
|
365
|
+
convertLegacyResults(legacyResults, query, options, searchTime) {
|
|
366
|
+
// Convert GitHub API format to IndexEntry format
|
|
367
|
+
const entries = legacyResults.map(item => ({
|
|
368
|
+
path: item.path,
|
|
369
|
+
type: this.extractTypeFromPath(item.path),
|
|
370
|
+
name: item.name?.replace('.md', '') || 'Unknown',
|
|
371
|
+
description: 'No description available',
|
|
372
|
+
version: '1.0.0',
|
|
373
|
+
author: 'Unknown',
|
|
374
|
+
tags: [],
|
|
375
|
+
sha: item.sha || '',
|
|
376
|
+
category: this.extractCategoryFromPath(item.path),
|
|
377
|
+
created: new Date().toISOString(),
|
|
378
|
+
license: 'Unknown'
|
|
379
|
+
}));
|
|
380
|
+
// Apply pagination
|
|
381
|
+
const page = options.page || 1;
|
|
382
|
+
const pageSize = options.pageSize || 25;
|
|
383
|
+
const startIndex = (page - 1) * pageSize;
|
|
384
|
+
const endIndex = startIndex + pageSize;
|
|
385
|
+
const paginatedEntries = entries.slice(startIndex, endIndex);
|
|
386
|
+
return {
|
|
387
|
+
items: paginatedEntries,
|
|
388
|
+
total: entries.length,
|
|
389
|
+
page,
|
|
390
|
+
pageSize,
|
|
391
|
+
hasMore: endIndex < entries.length,
|
|
392
|
+
query,
|
|
393
|
+
searchTime
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Extract element type from file path
|
|
398
|
+
*/
|
|
399
|
+
extractTypeFromPath(path) {
|
|
400
|
+
const parts = path.split('/');
|
|
401
|
+
if (parts.length >= 2 && parts[0] === 'library') {
|
|
402
|
+
return parts[1];
|
|
403
|
+
}
|
|
404
|
+
return 'unknown';
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Extract category from file path
|
|
408
|
+
*/
|
|
409
|
+
extractCategoryFromPath(path) {
|
|
410
|
+
const parts = path.split('/');
|
|
411
|
+
if (parts.length >= 3 && parts[0] === 'library') {
|
|
412
|
+
return parts[2];
|
|
413
|
+
}
|
|
414
|
+
return 'uncategorized';
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Create empty search results for error cases
|
|
418
|
+
*/
|
|
419
|
+
createEmptySearchResults(query, options) {
|
|
420
|
+
return {
|
|
421
|
+
items: [],
|
|
422
|
+
total: 0,
|
|
423
|
+
page: options.page || 1,
|
|
424
|
+
pageSize: options.pageSize || 25,
|
|
425
|
+
hasMore: false,
|
|
426
|
+
query,
|
|
427
|
+
searchTime: 0
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Enhanced format for search results with pagination info
|
|
432
|
+
*/
|
|
433
|
+
formatSearchResultsWithPagination(results, personaIndicator = '') {
|
|
434
|
+
if (results.total === 0) {
|
|
435
|
+
return `${personaIndicator}🔍 No content found for query: "${results.query}"`;
|
|
436
|
+
}
|
|
437
|
+
const startItem = (results.page - 1) * results.pageSize + 1;
|
|
438
|
+
const endItem = Math.min(results.page * results.pageSize, results.total);
|
|
439
|
+
const textParts = [
|
|
440
|
+
`${personaIndicator}🔍 **Search Results for "${results.query}"**\n`,
|
|
441
|
+
`📊 Showing ${startItem}-${endItem} of ${results.total} results (Page ${results.page})\n`,
|
|
442
|
+
`⚡ Search time: ${results.searchTime}ms\n\n`
|
|
443
|
+
];
|
|
444
|
+
results.items.forEach((item) => {
|
|
445
|
+
const contentIcons = {
|
|
446
|
+
'personas': '🎭',
|
|
447
|
+
'skills': '🛠️',
|
|
448
|
+
'agents': '🤖',
|
|
449
|
+
'prompts': '💬',
|
|
450
|
+
'templates': '📄',
|
|
451
|
+
'tools': '🔧',
|
|
452
|
+
'ensembles': '🎼',
|
|
453
|
+
'memories': '🧠'
|
|
454
|
+
};
|
|
455
|
+
const icon = contentIcons[item.type] || '📄';
|
|
456
|
+
textParts.push(` ${icon} **${item.name}** (${item.type})\n`, ` 📝 ${item.description}\n`, ` 🏷️ Tags: ${item.tags.join(', ')}\n`, ` 📂 Path: ${item.path}\n`, ` 📥 Install: \`install_content "${item.path}"\`\n`, ` 👁️ Details: \`get_collection_content "${item.path}"\`\n\n`);
|
|
457
|
+
});
|
|
458
|
+
// Add pagination info
|
|
459
|
+
if (results.hasMore) {
|
|
460
|
+
const nextPage = results.page + 1;
|
|
461
|
+
textParts.push(`📄 More results available. Use page ${nextPage} to see next ${results.pageSize} items.\n`);
|
|
462
|
+
}
|
|
463
|
+
return textParts.join('');
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Get cache statistics for debugging
|
|
467
|
+
*/
|
|
468
|
+
async getCacheStats() {
|
|
469
|
+
const indexStats = this.indexCache.getCacheStats();
|
|
470
|
+
const cacheStats = await this.collectionCache.getCacheStats();
|
|
471
|
+
return {
|
|
472
|
+
index: indexStats,
|
|
473
|
+
collection: cacheStats
|
|
474
|
+
};
|
|
475
|
+
}
|
|
151
476
|
}
|
|
152
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sbGVjdGlvblNlYXJjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb2xsZWN0aW9uL0NvbGxlY3Rpb25TZWFyY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFrQixNQUFNLDZCQUE2QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRixNQUFNLE9BQU8sZ0JBQWdCO0lBQ25CLFlBQVksQ0FBZTtJQUMzQixlQUFlLENBQWtCO0lBQ2pDLGFBQWEsR0FBRyxvQ0FBb0MsQ0FBQztJQUU3RCxZQUFZLFlBQTBCLEVBQUUsZUFBaUM7UUFDdkUsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLElBQUksSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQWE7UUFDbEMscUNBQXFDO1FBQ3JDLElBQUksQ0FBQztZQUNILG1CQUFtQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDOUMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsZ0RBQWdEO1lBQ2hELE1BQU0sU0FBUyxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsTUFBTSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMseURBQXlELENBQUM7WUFDaEksTUFB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QUksQ0FBQyxJQUFJLElBQUksRUFDL0Isd0NBQXdDLElBQUksQ0FBQyxJQUFJLE9BQU8sRUFDeEQsZ0RBQWdELElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FDbkUsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2VhcmNoIGZvciBjb250ZW50IGluIHRoZSBjb2xsZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgR2l0SHViQ2xpZW50IH0gZnJvbSAnLi9HaXRIdWJDbGllbnQuanMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkNhY2hlLCBDb2xsZWN0aW9uSXRlbSB9IGZyb20gJy4uL2NhY2hlL0NvbGxlY3Rpb25DYWNoZS5qcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uU2VlZGVyIH0gZnJvbSAnLi9Db2xsZWN0aW9uU2VlZGVyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVTZWFyY2hUZXJtLCB2YWxpZGF0ZVNlYXJjaFF1ZXJ5IH0gZnJvbSAnLi4vdXRpbHMvc2VhcmNoVXRpbHMuanMnO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvblNlYXJjaCB7XG4gIHByaXZhdGUgZ2l0aHViQ2xpZW50OiBHaXRIdWJDbGllbnQ7XG4gIHByaXZhdGUgY29sbGVjdGlvbkNhY2hlOiBDb2xsZWN0aW9uQ2FjaGU7XG4gIHByaXZhdGUgc2VhcmNoQmFzZVVybCA9ICdodHRwczovL2FwaS5naXRodWIuY29tL3NlYXJjaC9jb2RlJztcbiAgXG4gIGNvbnN0cnVjdG9yKGdpdGh1YkNsaWVudDogR2l0SHViQ2xpZW50LCBjb2xsZWN0aW9uQ2FjaGU/OiBDb2xsZWN0aW9uQ2FjaGUpIHtcbiAgICB0aGlzLmdpdGh1YkNsaWVudCA9IGdpdGh1YkNsaWVudDtcbiAgICB0aGlzLmNvbGxlY3Rpb25DYWNoZSA9IGNvbGxlY3Rpb25DYWNoZSB8fCBuZXcgQ29sbGVjdGlvbkNhY2hlKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZWFyY2ggY29sbGVjdGlvbiBmb3IgY29udGVudCBtYXRjaGluZyBxdWVyeVxuICAgKiBGYWxscyBiYWNrIHRvIGNhY2hlZCBkYXRhIHdoZW4gR2l0SHViIEFQSSBpcyBub3QgYXZhaWxhYmxlIG9yIG5vdCBhdXRoZW50aWNhdGVkXG4gICAqL1xuICBhc3luYyBzZWFyY2hDb2xsZWN0aW9uKHF1ZXJ5OiBzdHJpbmcpOiBQcm9taXNlPGFueVtdPiB7XG4gICAgLy8gVmFsaWRhdGUgc2VhcmNoIHF1ZXJ5IGZvciBzZWN1cml0eVxuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZVNlYXJjaFF1ZXJ5KHF1ZXJ5LCAxMDAwKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oYEludmFsaWQgc2VhcmNoIHF1ZXJ5OiAke2Vycm9yfWApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gRmlyc3QsIHRyeSBHaXRIdWIgQVBJIHNlYXJjaCBpZiBhdXRoZW50aWNhdGVkXG4gICAgICBjb25zdCBzZWFyY2hVcmwgPSBgJHt0aGlzLnNlYXJjaEJhc2VVcmx9P3E9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfStyZXBvOkRvbGxob3VzZU1DUC9jb2xsZWN0aW9uK3BhdGg6bGlicmFyeStleHRlbnNpb246bWRgO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZ2l0aHViQ2xpZW50LmZldGNoRnJvbUdpdEh1YihzZWFyY2hVcmwsIGZhbHNlKTsgLy8gRG9uJ3QgcmVxdWlyZSBhdXRoIGZvciBzZWFyY2hcbiAgICAgIFxuICAgICAgaWYgKGRhdGEuaXRlbXMgJiYgQXJyYXkuaXNBcnJheShkYXRhLml0ZW1zKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYEZvdW5kICR7ZGF0YS5pdGVtcy5sZW5ndGh9IGl0ZW1zIHZpYSBHaXRIdWIgQVBJIHNlYXJjaGApO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGNhY2hlIHdpdGggZnJlc2ggZGF0YSBmcm9tIEFQSVxuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNhY2hlRnJvbUdpdEh1Ykl0ZW1zKGRhdGEuaXRlbXMpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGRhdGEuaXRlbXM7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiBbXTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBHaXRIdWIgQVBJIHNlYXJjaCBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBjYWNoZTogJHtlcnJvcn1gKTtcbiAgICAgIFxuICAgICAgLy8gRmFsbGJhY2sgdG8gY2FjaGVkIHNlYXJjaFxuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoRnJvbUNhY2hlKHF1ZXJ5KTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZWFyY2ggY2FjaGVkIGNvbGxlY3Rpb24gaXRlbXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VhcmNoRnJvbUNhY2hlKHF1ZXJ5OiBzdHJpbmcpOiBQcm9taXNlPGFueVtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyeSB0byBsb2FkIGZyb20gY2FjaGUgZmlyc3RcbiAgICAgIGNvbnN0IGNhY2hlZEl0ZW1zID0gYXdhaXQgdGhpcy5jb2xsZWN0aW9uQ2FjaGUuc2VhcmNoQ2FjaGUocXVlcnkpO1xuICAgICAgXG4gICAgICBpZiAoY2FjaGVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYEZvdW5kICR7Y2FjaGVkSXRlbXMubGVuZ3RofSBpdGVtcyBmcm9tIGNhY2hlYCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRDYWNoZUl0ZW1zVG9HaXRIdWJGb3JtYXQoY2FjaGVkSXRlbXMpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBjYWNoZSBpcyBlbXB0eSBvciBubyByZXN1bHRzLCB1c2Ugc2VlZCBkYXRhXG4gICAgICBjb25zdCBzZWVkSXRlbXMgPSB0aGlzLnNlYXJjaFNlZWREYXRhKHF1ZXJ5KTtcbiAgICAgIGlmIChzZWVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYEZvdW5kICR7c2VlZEl0ZW1zLmxlbmd0aH0gaXRlbXMgZnJvbSBzZWVkIGRhdGFgKTtcbiAgICAgICAgLy8gU2F2ZSBzZWVkIGRhdGEgdG8gY2FjaGUgZm9yIGZ1dHVyZSB1c2VcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0aW9uQ2FjaGUuc2F2ZUNhY2hlKENvbGxlY3Rpb25TZWVkZXIuZ2V0U2VlZERhdGEoKSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRDYWNoZUl0ZW1zVG9HaXRIdWJGb3JtYXQoc2VlZEl0ZW1zKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKCdObyBpdGVtcyBmb3VuZCBpbiBjYWNoZSBvciBzZWVkIGRhdGEnKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBDYWNoZSBzZWFyY2ggZmFpbGVkOiAke2Vycm9yfWApO1xuICAgICAgXG4gICAgICAvLyBMYXN0IHJlc29ydDogc2VhcmNoIHNlZWQgZGF0YSB3aXRob3V0IGNhY2hlXG4gICAgICBjb25zdCBzZWVkSXRlbXMgPSB0aGlzLnNlYXJjaFNlZWREYXRhKHF1ZXJ5KTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRmFsbGJhY2sgdG8gc2VlZCBkYXRhIGZvdW5kICR7c2VlZEl0ZW1zLmxlbmd0aH0gaXRlbXNgKTtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRDYWNoZUl0ZW1zVG9HaXRIdWJGb3JtYXQoc2VlZEl0ZW1zKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZWFyY2ggc2VlZCBkYXRhIGZvciBtYXRjaGluZyBpdGVtcyB3aXRoIGZ1enp5IG1hdGNoaW5nXG4gICAqL1xuICBwcml2YXRlIHNlYXJjaFNlZWREYXRhKHF1ZXJ5OiBzdHJpbmcpOiBDb2xsZWN0aW9uSXRlbVtdIHtcbiAgICBjb25zdCBzZWVkRGF0YSA9IENvbGxlY3Rpb25TZWVkZXIuZ2V0U2VlZERhdGEoKTtcbiAgICBjb25zdCBub3JtYWxpemVkUXVlcnkgPSBub3JtYWxpemVTZWFyY2hUZXJtKHF1ZXJ5KTtcbiAgICBcbiAgICByZXR1cm4gc2VlZERhdGEuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBub3JtYWxpemVTZWFyY2hUZXJtKGl0ZW0ubmFtZSk7XG4gICAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZVNlYXJjaFRlcm0oaXRlbS5wYXRoKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKG5vcm1hbGl6ZWRRdWVyeSkgfHwgXG4gICAgICAgICAgICAgbm9ybWFsaXplZFBhdGguaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KTtcbiAgICB9KTtcbiAgfVxuICBcbiAgXG4gIC8qKlxuICAgKiBDb252ZXJ0IGNhY2hlIGl0ZW1zIHRvIEdpdEh1YiBBUEkgZm9ybWF0IGZvciBjb25zaXN0ZW50IHJlc3BvbnNlIHN0cnVjdHVyZVxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0Q2FjaGVJdGVtc1RvR2l0SHViRm9ybWF0KGNhY2hlSXRlbXM6IENvbGxlY3Rpb25JdGVtW10pOiBhbnlbXSB7XG4gICAgcmV0dXJuIGNhY2hlSXRlbXMubWFwKGl0ZW0gPT4gKHtcbiAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcbiAgICAgIHBhdGg6IGl0ZW0ucGF0aCxcbiAgICAgIHNoYTogaXRlbS5zaGEsXG4gICAgICB1cmw6IGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL0RvbGxob3VzZU1DUC9jb2xsZWN0aW9uL2NvbnRlbnRzLyR7aXRlbS5wYXRofWAsXG4gICAgICBodG1sX3VybDogYGh0dHBzOi8vZ2l0aHViLmNvbS9Eb2xsaG91c2VNQ1AvY29sbGVjdGlvbi9ibG9iL21haW4vJHtpdGVtLnBhdGh9YCxcbiAgICAgIHJlcG9zaXRvcnk6IHtcbiAgICAgICAgbmFtZTogJ2NvbGxlY3Rpb24nLFxuICAgICAgICBmdWxsX25hbWU6ICdEb2xsaG91c2VNQ1AvY29sbGVjdGlvbidcbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBVcGRhdGUgY2FjaGUgd2l0aCBmcmVzaCBkYXRhIGZyb20gR2l0SHViIEFQSSBpdGVtc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVDYWNoZUZyb21HaXRIdWJJdGVtcyhnaXRodWJJdGVtczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FjaGVJdGVtczogQ29sbGVjdGlvbkl0ZW1bXSA9IGdpdGh1Ykl0ZW1zLm1hcChpdGVtID0+ICh7XG4gICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcbiAgICAgICAgcGF0aDogaXRlbS5wYXRoLFxuICAgICAgICBzaGE6IGl0ZW0uc2hhLFxuICAgICAgICBsYXN0X21vZGlmaWVkOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICAgIH0pKTtcbiAgICAgIFxuICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0aW9uQ2FjaGUuc2F2ZUNhY2hlKGNhY2hlSXRlbXMpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBVcGRhdGVkIGNhY2hlIHdpdGggJHtjYWNoZUl0ZW1zLmxlbmd0aH0gaXRlbXMgZnJvbSBHaXRIdWIgQVBJYCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIHVwZGF0ZSBjYWNoZTogJHtlcnJvcn1gKTtcbiAgICAgIC8vIERvbid0IHRocm93IC0gY2FjaGUgdXBkYXRlIGZhaWx1cmVzIHNob3VsZG4ndCBicmVhayBmdW5jdGlvbmFsaXR5XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogRm9ybWF0IHNlYXJjaCByZXN1bHRzXG4gICAqL1xuICBmb3JtYXRTZWFyY2hSZXN1bHRzKGl0ZW1zOiBhbnlbXSwgcXVlcnk6IHN0cmluZywgcGVyc29uYUluZGljYXRvcjogc3RyaW5nID0gJycpOiBzdHJpbmcge1xuICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBgJHtwZXJzb25hSW5kaWNhdG9yffCflI0gTm8gY29udGVudCBmb3VuZCBmb3IgcXVlcnk6IFwiJHtxdWVyeX1cImA7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHRleHRQYXJ0cyA9IFtgJHtwZXJzb25hSW5kaWNhdG9yffCflI0gKipTZWFyY2ggUmVzdWx0cyBmb3IgXCIke3F1ZXJ5fVwiKiogKCR7aXRlbXMubGVuZ3RofSBmb3VuZClcXG5cXG5gXTtcbiAgICBcbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgIC8vIEV4dHJhY3QgY29udGVudCB0eXBlIGZyb20gcGF0aCAobGlicmFyeS9wZXJzb25hcy9jcmVhdGl2ZS93cml0ZXIubWQgLT4gcGVyc29uYXMpXG4gICAgICBjb25zdCBwYXRoUGFydHMgPSBpdGVtLnBhdGguc3BsaXQoJy8nKTtcbiAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcGF0aFBhcnRzWzFdIHx8ICdjb250ZW50JztcbiAgICAgIFxuICAgICAgY29uc3QgY29udGVudEljb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAncGVyc29uYXMnOiAn8J+OrScsXG4gICAgICAgICdza2lsbHMnOiAn8J+boO+4jycsXG4gICAgICAgICdhZ2VudHMnOiAn8J+klicsXG4gICAgICAgICdwcm9tcHRzJzogJ/CfkqwnLFxuICAgICAgICAndGVtcGxhdGVzJzogJ/Cfk4QnLFxuICAgICAgICAndG9vbHMnOiAn8J+UpycsXG4gICAgICAgICdlbnNlbWJsZXMnOiAn8J+OvCdcbiAgICAgIH07XG4gICAgICBjb25zdCBpY29uID0gY29udGVudEljb25zW2NvbnRlbnRUeXBlXSB8fCAn8J+ThCc7XG4gICAgICBcbiAgICAgIHRleHRQYXJ0cy5wdXNoKFxuICAgICAgICBgICAgJHtpY29ufSAqKiR7aXRlbS5uYW1lLnJlcGxhY2UoJy5tZCcsICcnKX0qKlxcbmAsXG4gICAgICAgIGAgICAgICDwn5OCIFBhdGg6ICR7aXRlbS5wYXRofVxcbmAsXG4gICAgICAgIGAgICAgICDwn5OlIEluc3RhbGw6IFxcYGluc3RhbGxfY29udGVudCBcIiR7aXRlbS5wYXRofVwiXFxgXFxuYCxcbiAgICAgICAgYCAgICAgIPCfkYHvuI8gRGV0YWlsczogXFxgZ2V0X2NvbGxlY3Rpb25fY29udGVudCBcIiR7aXRlbS5wYXRofVwiXFxgXFxuXFxuYFxuICAgICAgKTtcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gdGV4dFBhcnRzLmpvaW4oJycpO1xuICB9XG59Il19
|
|
477
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sbGVjdGlvblNlYXJjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb2xsZWN0aW9uL0NvbGxlY3Rpb25TZWFyY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFrQixNQUFNLDZCQUE2QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEgsT0FBTyxFQUFFLFlBQVksRUFBaUIsTUFBTSwwQkFBMEIsQ0FBQztBQUd2RSxNQUFNLE9BQU8sZ0JBQWdCO0lBQ25CLFlBQVksQ0FBZTtJQUMzQixlQUFlLENBQWtCO0lBQ2pDLFVBQVUsQ0FBdUI7SUFDakMsYUFBYSxHQUFHLG9DQUFvQyxDQUFDO0lBRTdELFlBQVksWUFBMEIsRUFBRSxlQUFpQztRQUN2RSxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsSUFBSSxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLDJCQUEyQixDQUFDLEtBQWEsRUFBRSxVQUF5QixFQUFFO1FBQzFFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM3QixNQUFNLENBQUMsS0FBSyxDQUFDLG9FQUFvRSxLQUFLLEdBQUcsRUFBRSxPQUFPLENBQUMs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Q0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQzNDLGtCQUFrQixJQUFJLENBQUMsSUFBSSxJQUFJLEVBQy9CLHdDQUF3QyxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQ3hELGdEQUFnRCxJQUFJLENBQUMsSUFBSSxTQUFTLENBQ25FLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILHNCQUFzQjtRQUN0QixJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwQixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNsQyxTQUFTLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxRQUFRLGdCQUFnQixPQUFPLENBQUMsUUFBUSxXQUFXLENBQUMsQ0FBQztRQUM3RyxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxhQUFhO1FBQ2pCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkQsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRTlELE9BQU87WUFDTCxLQUFLLEVBQUUsVUFBVTtZQUNqQixVQUFVLEVBQUUsVUFBVTtTQUN2QixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZWFyY2ggZm9yIGNvbnRlbnQgaW4gdGhlIGNvbGxlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBHaXRIdWJDbGllbnQgfSBmcm9tICcuL0dpdEh1YkNsaWVudC5qcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uQ2FjaGUsIENvbGxlY3Rpb25JdGVtIH0gZnJvbSAnLi4vY2FjaGUvQ29sbGVjdGlvbkNhY2hlLmpzJztcbmltcG9ydCB7IENvbGxlY3Rpb25JbmRleENhY2hlIH0gZnJvbSAnLi4vY2FjaGUvQ29sbGVjdGlvbkluZGV4Q2FjaGUuanMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvblNlZWRlciB9IGZyb20gJy4vQ29sbGVjdGlvblNlZWRlci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplU2VhcmNoVGVybSwgdmFsaWRhdGVTZWFyY2hRdWVyeSwgaXNTZWFyY2hNYXRjaCwgZGVidWdOb3JtYWxpemF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvc2VhcmNoVXRpbHMuanMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyLCBFcnJvckNhdGVnb3J5IH0gZnJvbSAnLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IEluZGV4RW50cnksIFNlYXJjaFJlc3VsdHMsIFNlYXJjaE9wdGlvbnMsIENvbGxlY3Rpb25JbmRleCB9IGZyb20gJy4uL3R5cGVzL2NvbGxlY3Rpb24uanMnO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvblNlYXJjaCB7XG4gIHByaXZhdGUgZ2l0aHViQ2xpZW50OiBHaXRIdWJDbGllbnQ7XG4gIHByaXZhdGUgY29sbGVjdGlvbkNhY2hlOiBDb2xsZWN0aW9uQ2FjaGU7XG4gIHByaXZhdGUgaW5kZXhDYWNoZTogQ29sbGVjdGlvbkluZGV4Q2FjaGU7XG4gIHByaXZhdGUgc2VhcmNoQmFzZVVybCA9ICdodHRwczovL2FwaS5naXRodWIuY29tL3NlYXJjaC9jb2RlJztcbiAgXG4gIGNvbnN0cnVjdG9yKGdpdGh1YkNsaWVudDogR2l0SHViQ2xpZW50LCBjb2xsZWN0aW9uQ2FjaGU/OiBDb2xsZWN0aW9uQ2FjaGUpIHtcbiAgICB0aGlzLmdpdGh1YkNsaWVudCA9IGdpdGh1YkNsaWVudDtcbiAgICB0aGlzLmNvbGxlY3Rpb25DYWNoZSA9IGNvbGxlY3Rpb25DYWNoZSB8fCBuZXcgQ29sbGVjdGlvbkNhY2hlKCk7XG4gICAgdGhpcy5pbmRleENhY2hlID0gbmV3IENvbGxlY3Rpb25JbmRleENhY2hlKGdpdGh1YkNsaWVudCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBFbmhhbmNlZCBzZWFyY2ggdXNpbmcgY29sbGVjdGlvbiBpbmRleCB3aXRoIHBhZ2luYXRpb24gYW5kIGZpbHRlcmluZ1xuICAgKiBGYWxscyBiYWNrIHRvIEFQSSBzZWFyY2ggYW5kIGNhY2hlIHdoZW4gaW5kZXggaXMgdW5hdmFpbGFibGVcbiAgICovXG4gIGFzeW5jIHNlYXJjaENvbGxlY3Rpb25XaXRoT3B0aW9ucyhxdWVyeTogc3RyaW5nLCBvcHRpb25zOiBTZWFyY2hPcHRpb25zID0ge30pOiBQcm9taXNlPFNlYXJjaFJlc3VsdHM+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgQ29sbGVjdGlvblNlYXJjaC5zZWFyY2hDb2xsZWN0aW9uV2l0aE9wdGlvbnMgY2FsbGVkIHdpdGggcXVlcnk6IFwiJHtxdWVyeX1cImAsIG9wdGlvbnMpO1xuICAgIFxuICAgIC8vIFZhbGlkYXRlIHNlYXJjaCBxdWVyeSBmb3Igc2VjdXJpdHlcbiAgICB0cnkge1xuICAgICAgdmFsaWRhdGVTZWFyY2hRdWVyeShxdWVyeSwgMTAwMCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGxvZ2dlci5lcnJvcignU2VhcmNoIHF1ZXJ5IHZhbGlkYXRpb24gZmFpbGVkOicsIHsgcXVlcnksIGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0NvbGxlY3Rpb25TZWFyY2guc2VhcmNoV2l0aE9wdGlvbnMudmFsaWRhdGVRdWVyeScsIGVycm9yLCB7IHF1ZXJ5IH0pO1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRW1wdHlTZWFyY2hSZXN1bHRzKHF1ZXJ5LCBvcHRpb25zKTtcbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyeSBpbmRleC1iYXNlZCBzZWFyY2ggZmlyc3RcbiAgICAgIGNvbnN0IGluZGV4UmVzdWx0cyA9IGF3YWl0IHRoaXMuc2VhcmNoRnJvbUluZGV4KHF1ZXJ5LCBvcHRpb25zKTtcbiAgICAgIGNvbnN0IHNlYXJjaFRpbWUgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoYEluZGV4IHNlYXJjaCBjb21wbGV0ZWQgaW4gJHtzZWFyY2hUaW1lfW1zIHdpdGggJHtpbmRleFJlc3VsdHMuaXRlbXMubGVuZ3RofSByZXN1bHRzYCk7XG4gICAgICByZXR1cm4geyAuLi5pbmRleFJlc3VsdHMsIHNlYXJjaFRpbWUgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdJbmRleCBzZWFyY2ggZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gbGVnYWN5IHNlYXJjaDonLCBlcnJvcik7XG4gICAgICBcbiAgICAgIC8vIEZhbGxiYWNrIHRvIGxlZ2FjeSBzZWFyY2hcbiAgICAgIGNvbnN0IGxlZ2FjeVJlc3VsdHMgPSBhd2FpdCB0aGlzLnNlYXJjaENvbGxlY3Rpb24ocXVlcnkpO1xuICAgICAgY29uc3Qgc2VhcmNoVGltZSA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICBcbiAgICAgIC8vIENvbnZlcnQgbGVnYWN5IHJlc3VsdHMgdG8gbmV3IGZvcm1hdFxuICAgICAgcmV0dXJuIHRoaXMuY29udmVydExlZ2FjeVJlc3VsdHMobGVnYWN5UmVzdWx0cywgcXVlcnksIG9wdGlvbnMsIHNlYXJjaFRpbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggY29sbGVjdGlvbiBmb3IgY29udGVudCBtYXRjaGluZyBxdWVyeVxuICAgKiBGYWxscyBiYWNrIHRvIGNhY2hlZCBkYXRhIHdoZW4gR2l0SHViIEFQSSBpcyBub3QgYXZhaWxhYmxlIG9yIG5vdCBhdXRoZW50aWNhdGVkXG4gICAqL1xuICBhc3luYyBzZWFyY2hDb2xsZWN0aW9uKHF1ZXJ5OiBzdHJpbmcpOiBQcm9taXNlPGFueVtdPiB7XG4gICAgbG9nZ2VyLmRlYnVnKGBDb2xsZWN0aW9uU2VhcmNoLnNlYXJjaENvbGxlY3Rpb24gY2FsbGVkIHdpdGggcXVlcnk6IFwiJHtxdWVyeX1cImApO1xuICAgIFxuICAgIC8vIFZhbGlkYXRlIHNlYXJjaCBxdWVyeSBmb3Igc2VjdXJpdHlcbiAgICB0cnkge1xuICAgICAgdmFsaWRhdGVTZWFyY2hRdWVyeShxdWVyeSwgMTAwMCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGxvZ2dlci5lcnJvcignU2VhcmNoIHF1ZXJ5IHZhbGlkYXRpb24gZmFpbGVkOicsIHsgcXVlcnksIGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0NvbGxlY3Rpb25TZWFyY2guc2VhcmNoLnZhbGlkYXRlUXVlcnknLCBlcnJvciwgeyBxdWVyeSB9KTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIEZpcnN0LCB0cnkgR2l0SHViIEFQSSBzZWFyY2ggaWYgYXV0aGVudGljYXRlZFxuICAgICAgY29uc3Qgc2VhcmNoVXJsID0gYCR7dGhpcy5zZWFyY2hCYXNlVXJsfT9xPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX0rcmVwbzpEb2xsaG91c2VNQ1AvY29sbGVjdGlvbitwYXRoOmxpYnJhcnkrZXh0ZW5zaW9uOm1kYDtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgQXR0ZW1wdGluZyBHaXRIdWIgQVBJIHNlYXJjaCB3aXRoIFVSTDogJHtzZWFyY2hVcmx9YCk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5naXRodWJDbGllbnQuZmV0Y2hGcm9tR2l0SHViKHNlYXJjaFVybCwgZmFsc2UpOyAvLyBEb24ndCByZXF1aXJlIGF1dGggZm9yIHNlYXJjaFxuICAgICAgXG4gICAgICBpZiAoZGF0YS5pdGVtcyAmJiBBcnJheS5pc0FycmF5KGRhdGEuaXRlbXMpKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRm91bmQgJHtkYXRhLml0ZW1zLmxlbmd0aH0gaXRlbXMgdmlhIEdpdEh1YiBBUEkgc2VhcmNoYCk7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgY2FjaGUgd2l0aCBmcmVzaCBkYXRhIGZyb20gQVBJXG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ2FjaGVGcm9tR2l0SHViSXRlbXMoZGF0YS5pdGVtcyk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gZGF0YS5pdGVtcztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKCdHaXRIdWIgQVBJIHNlYXJjaCByZXR1cm5lZCBubyBpdGVtcywgZmFsbGluZyBiYWNrIHRvIGNhY2hlJyk7XG4gICAgICByZXR1cm4gW107XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgR2l0SHViIEFQSSBzZWFyY2ggZmFpbGVkOiAke2Vycm9yTWVzc2FnZX0uIEZhbGxpbmcgYmFjayB0byBjYWNoZWQgc2VhcmNoLmApO1xuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdDb2xsZWN0aW9uU2VhcmNoLnNlYXJjaC5naXRodWJBcGknLCBlcnJvciwgeyBxdWVyeSB9KTtcbiAgICAgIFxuICAgICAgLy8gRmFsbGJhY2sgdG8gY2FjaGVkIHNlYXJjaFxuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoRnJvbUNhY2hlKHF1ZXJ5KTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZWFyY2ggY2FjaGVkIGNvbGxlY3Rpb24gaXRlbXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VhcmNoRnJvbUNhY2hlKHF1ZXJ5OiBzdHJpbmcpOiBQcm9taXNlPGFueVtdPiB7XG4gICAgbG9nZ2VyLmRlYnVnKGBTZWFyY2hpbmcgY2FjaGUgZm9yIHF1ZXJ5OiBcIiR7cXVlcnl9XCJgKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gVHJ5IHRvIGxvYWQgZnJvbSBjYWNoZSBmaXJzdFxuICAgICAgY29uc3QgY2FjaGVkSXRlbXMgPSBhd2FpdCB0aGlzLmNvbGxlY3Rpb25DYWNoZS5zZWFyY2hDYWNoZShxdWVyeSk7XG4gICAgICBcbiAgICAgIGlmIChjYWNoZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRm91bmQgJHtjYWNoZWRJdGVtcy5sZW5ndGh9IGl0ZW1zIGZyb20gY2FjaGVgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydENhY2hlSXRlbXNUb0dpdEh1YkZvcm1hdChjYWNoZWRJdGVtcyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGxvZ2dlci5kZWJ1ZygnQ2FjaGUgc2VhcmNoIHJldHVybmVkIG5vIHJlc3VsdHMsIHRyeWluZyBzZWVkIGRhdGEnKTtcbiAgICAgIFxuICAgICAgLy8gSWYgY2FjaGUgaXMgZW1wdHkgb3Igbm8gcmVzdWx0cywgdXNlIHNlZWQgZGF0YVxuICAgICAgY29uc3Qgc2VlZEl0ZW1zID0gdGhpcy5zZWFyY2hTZWVkRGF0YShxdWVyeSk7XG4gICAgICBpZiAoc2VlZEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBGb3VuZCAke3NlZWRJdGVtcy5sZW5ndGh9IGl0ZW1zIGZyb20gc2VlZCBkYXRhYCk7XG4gICAgICAgIC8vIFNhdmUgc2VlZCBkYXRhIHRvIGNhY2hlIGZvciBmdXR1cmUgdXNlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0aW9uQ2FjaGUuc2F2ZUNhY2hlKENvbGxlY3Rpb25TZWVkZXIuZ2V0U2VlZERhdGEoKSk7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTYXZlZCBzZWVkIGRhdGEgdG8gY2FjaGUnKTtcbiAgICAgICAgfSBjYXRjaCAoY2FjaGVFcnJvcikge1xuICAgICAgICAgIGNvbnN0IGNhY2hlRXJyb3JNZXNzYWdlID0gY2FjaGVFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gY2FjaGVFcnJvci5tZXNzYWdlIDogU3RyaW5nKGNhY2hlRXJyb3IpO1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIHNhdmUgc2VlZCBkYXRhIHRvIGNhY2hlOiAke2NhY2hlRXJyb3JNZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRDYWNoZUl0ZW1zVG9HaXRIdWJGb3JtYXQoc2VlZEl0ZW1zKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKCdObyBpdGVtcyBmb3VuZCBpbiBjYWNoZSBvciBzZWVkIGRhdGEnKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBDYWNoZSBzZWFyY2ggZmFpbGVkOiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignQ29sbGVjdGlvblNlYXJjaC5zZWFyY2guY2FjaGUnLCBlcnJvciwgeyBxdWVyeSB9KTtcbiAgICAgIFxuICAgICAgLy8gTGFzdCByZXNvcnQ6IHNlYXJjaCBzZWVkIGRhdGEgd2l0aG91dCBjYWNoZVxuICAgICAgY29uc3Qgc2VlZEl0ZW1zID0gdGhpcy5zZWFyY2hTZWVkRGF0YShxdWVyeSk7XG4gICAgICBsb2dnZXIuZGVidWcoYEZhbGxiYWNrIHRvIHNlZWQgZGF0YSBmb3VuZCAke3NlZWRJdGVtcy5sZW5ndGh9IGl0ZW1zYCk7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Q2FjaGVJdGVtc1RvR2l0SHViRm9ybWF0KHNlZWRJdGVtcyk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogU2VhcmNoIHNlZWQgZGF0YSBmb3IgbWF0Y2hpbmcgaXRlbXMgd2l0aCBmdXp6eSBtYXRjaGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBzZWFyY2hTZWVkRGF0YShxdWVyeTogc3RyaW5nKTogQ29sbGVjdGlvbkl0ZW1bXSB7XG4gICAgY29uc3Qgc2VlZERhdGEgPSBDb2xsZWN0aW9uU2VlZGVyLmdldFNlZWREYXRhKCk7XG4gICAgY29uc3Qgbm9ybURlYnVnID0gZGVidWdOb3JtYWxpemF0aW9uKHF1ZXJ5KTtcbiAgICBsb2dnZXIuZGVidWcoYFNlYXJjaGluZyBzZWVkIGRhdGEgLSBPcmlnaW5hbDogXCIke25vcm1EZWJ1Zy5vcmlnaW5hbH1cIiwgTm9ybWFsaXplZDogXCIke25vcm1EZWJ1Zy5ub3JtYWxpemVkfVwiLCBQYXJ0aWFsOiBcIiR7bm9ybURlYnVnLnBhcnRpYWxNYXRjaH1cImApO1xuICAgIGxvZ2dlci5kZWJ1ZyhgU2VhcmNoaW5nIGFnYWluc3QgJHtzZWVkRGF0YS5sZW5ndGh9IHNlZWQgaXRlbXNgKTtcbiAgICBcbiAgICBjb25zdCBtYXRjaGVzID0gc2VlZERhdGEuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgLy8gVXNlIHRoZSBpbXByb3ZlZCBtYXRjaGluZyBmdW5jdGlvbiB0aGF0IHRyaWVzIG11bHRpcGxlIHN0cmF0ZWdpZXNcbiAgICAgIGNvbnN0IG5hbWVNYXRjaGVzID0gaXNTZWFyY2hNYXRjaChxdWVyeSwgaXRlbS5uYW1lKTtcbiAgICAgIGNvbnN0IHBhdGhNYXRjaGVzID0gaXNTZWFyY2hNYXRjaChxdWVyeSwgaXRlbS5wYXRoKTtcbiAgICAgIFxuICAgICAgY29uc3QgaXNNYXRjaCA9IG5hbWVNYXRjaGVzIHx8IHBhdGhNYXRjaGVzO1xuICAgICAgXG4gICAgICBpZiAoaXNNYXRjaCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYOKckyBNYXRjaCBmb3VuZDogJHtpdGVtLm5hbWV9ICgke2l0ZW0ucGF0aH0pIG1hdGNoZXMgcXVlcnkgXCIke3F1ZXJ5fVwiYCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiBpc01hdGNoO1xuICAgIH0pO1xuICAgIFxuICAgIC8vIElmIG5vIG1hdGNoZXMgZm91bmQsIGxldCdzIGRlYnVnIHdoYXQgd2UgaGF2ZVxuICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdObyBtYXRjaGVzIGZvdW5kLiBBdmFpbGFibGUgc2VlZCBkYXRhOicpO1xuICAgICAgc2VlZERhdGEuc2xpY2UoMCwgMTApLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgICAtICR7aXRlbS5uYW1lfSAoJHtpdGVtLnBhdGh9KWApO1xuICAgICAgfSk7XG4gICAgICBpZiAoc2VlZERhdGEubGVuZ3RoID4gMTApIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGAgIC4uLiBhbmQgJHtzZWVkRGF0YS5sZW5ndGggLSAxMH0gbW9yZSBpdGVtc2ApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBsb2dnZXIuZGVidWcoYEZvdW5kICR7bWF0Y2hlcy5sZW5ndGh9IG1hdGNoZXMgaW4gc2VlZCBkYXRhYCk7XG4gICAgcmV0dXJuIG1hdGNoZXM7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGdXp6eSBtYXRjaGluZyBhbGdvcml0aG0gZm9yIHBhcnRpYWwgc3RyaW5nIG1hdGNoZXNcbiAgICovXG4gIHByaXZhdGUgZnV6enlNYXRjaCh0ZXJtOiBzdHJpbmcsIHRhcmdldDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gU2ltcGxlIGZ1enp5IG1hdGNoaW5nOiBjaGVjayBpZiBhbGwgY2hhcmFjdGVycyBvZiB0ZXJtIGFwcGVhciBpbiBvcmRlciBpbiB0YXJnZXRcbiAgICBpZiAodGVybS5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICAgIGlmICh0YXJnZXQubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgXG4gICAgbGV0IHRlcm1JbmRleCA9IDA7XG4gICAgbGV0IHRhcmdldEluZGV4ID0gMDtcbiAgICBcbiAgICB3aGlsZSAodGVybUluZGV4IDwgdGVybS5sZW5ndGggJiYgdGFyZ2V0SW5kZXggPCB0YXJnZXQubGVuZ3RoKSB7XG4gICAgICBpZiAodGVybVt0ZXJtSW5kZXhdID09PSB0YXJnZXRbdGFyZ2V0SW5kZXhdKSB7XG4gICAgICAgIHRlcm1JbmRleCsrO1xuICAgICAgfVxuICAgICAgdGFyZ2V0SW5kZXgrKztcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRlcm1JbmRleCA9PT0gdGVybS5sZW5ndGg7XG4gIH1cbiAgXG4gIFxuICAvKipcbiAgICogQ29udmVydCBjYWNoZSBpdGVtcyB0byBHaXRIdWIgQVBJIGZvcm1hdCBmb3IgY29uc2lzdGVudCByZXNwb25zZSBzdHJ1Y3R1cmVcbiAgICovXG4gIHByaXZhdGUgY29udmVydENhY2hlSXRlbXNUb0dpdEh1YkZvcm1hdChjYWNoZUl0ZW1zOiBDb2xsZWN0aW9uSXRlbVtdKTogYW55W10ge1xuICAgIHJldHVybiBjYWNoZUl0ZW1zLm1hcChpdGVtID0+ICh7XG4gICAgICBuYW1lOiBpdGVtLm5hbWUsXG4gICAgICBwYXRoOiBpdGVtLnBhdGgsXG4gICAgICBzaGE6IGl0ZW0uc2hhLFxuICAgICAgdXJsOiBgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9Eb2xsaG91c2VNQ1AvY29sbGVjdGlvbi9jb250ZW50cy8ke2l0ZW0ucGF0aH1gLFxuICAgICAgaHRtbF91cmw6IGBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL2NvbGxlY3Rpb24vYmxvYi9tYWluLyR7aXRlbS5wYXRofWAsXG4gICAgICByZXBvc2l0b3J5OiB7XG4gICAgICAgIG5hbWU6ICdjb2xsZWN0aW9uJyxcbiAgICAgICAgZnVsbF9uYW1lOiAnRG9sbGhvdXNlTUNQL2NvbGxlY3Rpb24nXG4gICAgICB9XG4gICAgfSkpO1xuICB9XG4gIFxuICAvKipcbiAgICogVXBkYXRlIGNhY2hlIHdpdGggZnJlc2ggZGF0YSBmcm9tIEdpdEh1YiBBUEkgaXRlbXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlQ2FjaGVGcm9tR2l0SHViSXRlbXMoZ2l0aHViSXRlbXM6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhY2hlSXRlbXM6IENvbGxlY3Rpb25JdGVtW10gPSBnaXRodWJJdGVtcy5tYXAoaXRlbSA9PiAoe1xuICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXG4gICAgICAgIHBhdGg6IGl0ZW0ucGF0aCxcbiAgICAgICAgc2hhOiBpdGVtLnNoYSxcbiAgICAgICAgbGFzdF9tb2RpZmllZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgICB9KSk7XG4gICAgICBcbiAgICAgIGF3YWl0IHRoaXMuY29sbGVjdGlvbkNhY2hlLnNhdmVDYWNoZShjYWNoZUl0ZW1zKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgVXBkYXRlZCBjYWNoZSB3aXRoICR7Y2FjaGVJdGVtcy5sZW5ndGh9IGl0ZW1zIGZyb20gR2l0SHViIEFQSWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0NvbGxlY3Rpb25TZWFyY2gudXBkYXRlQ2FjaGVJbkJhY2tncm91bmQnLCBlcnJvcik7XG4gICAgICAvLyBEb24ndCB0aHJvdyAtIGNhY2hlIHVwZGF0ZSBmYWlsdXJlcyBzaG91bGRuJ3QgYnJlYWsgZnVuY3Rpb25hbGl0eVxuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEZvcm1hdCBzZWFyY2ggcmVzdWx0c1xuICAgKi9cbiAgZm9ybWF0U2VhcmNoUmVzdWx0cyhpdGVtczogYW55W10sIHF1ZXJ5OiBzdHJpbmcsIHBlcnNvbmFJbmRpY2F0b3I6IHN0cmluZyA9ICcnKTogc3RyaW5nIHtcbiAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gYCR7cGVyc29uYUluZGljYXRvcn3wn5SNIE5vIGNvbnRlbnQgZm91bmQgZm9yIHF1ZXJ5OiBcIiR7cXVlcnl9XCJgO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCB0ZXh0UGFydHMgPSBbYCR7cGVyc29uYUluZGljYXRvcn3wn5SNICoqU2VhcmNoIFJlc3VsdHMgZm9yIFwiJHtxdWVyeX1cIioqICgke2l0ZW1zLmxlbmd0aH0gZm91bmQpXFxuXFxuYF07XG4gICAgXG4gICAgaXRlbXMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAvLyBFeHRyYWN0IGNvbnRlbnQgdHlwZSBmcm9tIHBhdGggKGxpYnJhcnkvcGVyc29uYXMvY3JlYXRpdmUvd3JpdGVyLm1kIC0+IHBlcnNvbmFzKVxuICAgICAgY29uc3QgcGF0aFBhcnRzID0gaXRlbS5wYXRoLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCBjb250ZW50VHlwZSA9IHBhdGhQYXJ0c1sxXSB8fCAnY29udGVudCc7XG4gICAgICBcbiAgICAgIGNvbnN0IGNvbnRlbnRJY29uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgJ3BlcnNvbmFzJzogJ/Cfjq0nLFxuICAgICAgICAnc2tpbGxzJzogJ/Cfm6DvuI8nLFxuICAgICAgICAnYWdlbnRzJzogJ/CfpJYnLFxuICAgICAgICAncHJvbXB0cyc6ICfwn5KsJyxcbiAgICAgICAgJ3RlbXBsYXRlcyc6ICfwn5OEJyxcbiAgICAgICAgJ3Rvb2xzJzogJ/CflKcnLFxuICAgICAgICAnZW5zZW1ibGVzJzogJ/CfjrwnXG4gICAgICB9O1xuICAgICAgY29uc3QgaWNvbiA9IGNvbnRlbnRJY29uc1tjb250ZW50VHlwZV0gfHwgJ/Cfk4QnO1xuICAgICAgXG4gICAgICB0ZXh0UGFydHMucHVzaChcbiAgICAgICAgYCAgICR7aWNvbn0gKioke2l0ZW0ubmFtZS5yZXBsYWNlKCcubWQnLCAnJyl9KipcXG5gLFxuICAgICAgICBgICAgICAg8J+TgiBQYXRoOiAke2l0ZW0ucGF0aH1cXG5gLFxuICAgICAgICBgICAgICAg8J+TpSBJbnN0YWxsOiBcXGBpbnN0YWxsX2NvbnRlbnQgXCIke2l0ZW0ucGF0aH1cIlxcYFxcbmAsXG4gICAgICAgIGAgICAgICDwn5GB77iPIERldGFpbHM6IFxcYGdldF9jb2xsZWN0aW9uX2NvbnRlbnQgXCIke2l0ZW0ucGF0aH1cIlxcYFxcblxcbmBcbiAgICAgICk7XG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIHRleHRQYXJ0cy5qb2luKCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggZnJvbSBjb2xsZWN0aW9uIGluZGV4IHdpdGggZnVsbCBmZWF0dXJlZCBzZWFyY2ggYW5kIHBhZ2luYXRpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VhcmNoRnJvbUluZGV4KHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM6IFNlYXJjaE9wdGlvbnMpOiBQcm9taXNlPFNlYXJjaFJlc3VsdHM+IHtcbiAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMuaW5kZXhDYWNoZS5nZXRJbmRleCgpO1xuICAgIGNvbnN0IGFsbEVudHJpZXMgPSB0aGlzLmZsYXR0ZW5JbmRleEVudHJpZXMoaW5kZXgpO1xuICAgIFxuICAgIC8vIEZpbHRlciBieSBlbGVtZW50IHR5cGUgaWYgc3BlY2lmaWVkXG4gICAgbGV0IGZpbHRlcmVkRW50cmllcyA9IGFsbEVudHJpZXM7XG4gICAgaWYgKG9wdGlvbnMuZWxlbWVudFR5cGUpIHtcbiAgICAgIGZpbHRlcmVkRW50cmllcyA9IGFsbEVudHJpZXMuZmlsdGVyKGVudHJ5ID0+IGVudHJ5LnR5cGUgPT09IG9wdGlvbnMuZWxlbWVudFR5cGUpO1xuICAgIH1cbiAgICBcbiAgICAvLyBGaWx0ZXIgYnkgY2F0ZWdvcnkgaWYgc3BlY2lmaWVkXG4gICAgaWYgKG9wdGlvbnMuY2F0ZWdvcnkpIHtcbiAgICAgIGZpbHRlcmVkRW50cmllcyA9IGZpbHRlcmVkRW50cmllcy5maWx0ZXIoZW50cnkgPT4gZW50cnkuY2F0ZWdvcnkgPT09IG9wdGlvbnMuY2F0ZWdvcnkpO1xuICAgIH1cbiAgICBcbiAgICAvLyBTZWFyY2ggbWF0Y2hpbmdcbiAgICBjb25zdCBtYXRjaGVkRW50cmllcyA9IHRoaXMucGVyZm9ybUluZGV4U2VhcmNoKHF1ZXJ5LCBmaWx0ZXJlZEVudHJpZXMpO1xuICAgIFxuICAgIC8vIFNvcnQgcmVzdWx0c1xuICAgIGNvbnN0IHNvcnRlZEVudHJpZXMgPSB0aGlzLnNvcnRTZWFyY2hSZXN1bHRzKG1hdGNoZWRFbnRyaWVzLCBvcHRpb25zLnNvcnRCeSB8fCAncmVsZXZhbmNlJywgcXVlcnkpO1xuICAgIFxuICAgIC8vIEFwcGx5IHBhZ2luYXRpb25cbiAgICBjb25zdCBwYWdlID0gb3B0aW9ucy5wYWdlIHx8IDE7XG4gICAgY29uc3QgcGFnZVNpemUgPSBvcHRpb25zLnBhZ2VTaXplIHx8IDI1O1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSAocGFnZSAtIDEpICogcGFnZVNpemU7XG4gICAgY29uc3QgZW5kSW5kZXggPSBzdGFydEluZGV4ICsgcGFnZVNpemU7XG4gICAgY29uc3QgcGFnaW5hdGVkRW50cmllcyA9IHNvcnRlZEVudHJpZXMuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBpdGVtczogcGFnaW5hdGVkRW50cmllcyxcbiAgICAgIHRvdGFsOiBzb3J0ZWRFbnRyaWVzLmxlbmd0aCxcbiAgICAgIHBhZ2UsXG4gICAgICBwYWdlU2l6ZSxcbiAgICAgIGhhc01vcmU6IGVuZEluZGV4IDwgc29ydGVkRW50cmllcy5sZW5ndGgsXG4gICAgICBxdWVyeSxcbiAgICAgIHNlYXJjaFRpbWU6IDAgLy8gV2lsbCBiZSBzZXQgYnkgY2FsbGVyXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGF0dGVuIGluZGV4IGVudHJpZXMgZnJvbSBhbGwgY2F0ZWdvcmllcyBpbnRvIGEgc2luZ2xlIGFycmF5XG4gICAqL1xuICBwcml2YXRlIGZsYXR0ZW5JbmRleEVudHJpZXMoaW5kZXg6IENvbGxlY3Rpb25JbmRleCk6IEluZGV4RW50cnlbXSB7XG4gICAgY29uc3QgZW50cmllczogSW5kZXhFbnRyeVtdID0gW107XG4gICAgXG4gICAgZm9yIChjb25zdCBbZWxlbWVudFR5cGUsIHR5cGVFbnRyaWVzXSBvZiBPYmplY3QuZW50cmllcyhpbmRleC5pbmRleCkpIHtcbiAgICAgIGVudHJpZXMucHVzaCguLi50eXBlRW50cmllcyk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gc2VhcmNoIG1hdGNoaW5nIG9uIGluZGV4IGVudHJpZXNcbiAgICovXG4gIHByaXZhdGUgcGVyZm9ybUluZGV4U2VhcmNoKHF1ZXJ5OiBzdHJpbmcsIGVudHJpZXM6IEluZGV4RW50cnlbXSk6IEluZGV4RW50cnlbXSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFF1ZXJ5ID0gbm9ybWFsaXplU2VhcmNoVGVybShxdWVyeSk7XG4gICAgY29uc3QgcXVlcnlXb3JkcyA9IG5vcm1hbGl6ZWRRdWVyeS5zcGxpdCgvXFxzKy8pLmZpbHRlcih3b3JkID0+IHdvcmQubGVuZ3RoID4gMCk7XG4gICAgXG4gICAgcmV0dXJuIGVudHJpZXMuZmlsdGVyKGVudHJ5ID0+IHtcbiAgICAgIC8vIFNlYXJjaCBpbiBtdWx0aXBsZSBmaWVsZHNcbiAgICAgIGNvbnN0IHNlYXJjaGFibGVUZXh0ID0gW1xuICAgICAgICBlbnRyeS5uYW1lLFxuICAgICAgICBlbnRyeS5kZXNjcmlwdGlvbixcbiAgICAgICAgZW50cnkucGF0aCxcbiAgICAgICAgLi4uZW50cnkudGFnc1xuICAgICAgXS5qb2luKCcgJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIFxuICAgICAgLy8gVXNlIGV4aXN0aW5nIHNlYXJjaCB1dGlsaXRpZXMgZm9yIGNvbnNpc3RlbmN5XG4gICAgICBjb25zdCBuYW1lTWF0Y2ggPSBpc1NlYXJjaE1hdGNoKHF1ZXJ5LCBlbnRyeS5uYW1lKTtcbiAgICAgIGNvbnN0IGRlc2NNYXRjaCA9IGlzU2VhcmNoTWF0Y2gocXVlcnksIGVudHJ5LmRlc2NyaXB0aW9uKTtcbiAgICAgIGNvbnN0IHBhdGhNYXRjaCA9IGlzU2VhcmNoTWF0Y2gocXVlcnksIGVudHJ5LnBhdGgpO1xuICAgICAgY29uc3QgdGFnTWF0Y2ggPSBlbnRyeS50YWdzLnNvbWUodGFnID0+IGlzU2VhcmNoTWF0Y2gocXVlcnksIHRhZykpO1xuICAgICAgXG4gICAgICByZXR1cm4gbmFtZU1hdGNoIHx8IGRlc2NNYXRjaCB8fCBwYXRoTWF0Y2ggfHwgdGFnTWF0Y2g7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU29ydCBzZWFyY2ggcmVzdWx0cyBieSByZWxldmFuY2UsIG5hbWUsIG9yIGRhdGVcbiAgICovXG4gIHByaXZhdGUgc29ydFNlYXJjaFJlc3VsdHMoZW50cmllczogSW5kZXhFbnRyeVtdLCBzb3J0Qnk6ICdyZWxldmFuY2UnIHwgJ25hbWUnIHwgJ2RhdGUnLCBxdWVyeTogc3RyaW5nKTogSW5kZXhFbnRyeVtdIHtcbiAgICBjb25zdCBzb3J0ZWQgPSBbLi4uZW50cmllc107XG4gICAgXG4gICAgc3dpdGNoIChzb3J0QnkpIHtcbiAgICAgIGNhc2UgJ25hbWUnOlxuICAgICAgICBzb3J0ZWQuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgIHNvcnRlZC5zb3J0KChhLCBiKSA9PiBuZXcgRGF0ZShiLmNyZWF0ZWQpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGEuY3JlYXRlZCkuZ2V0VGltZSgpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZWxldmFuY2UnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHJlbGV2YW5jZSBzY29yZXNcbiAgICAgICAgc29ydGVkLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICBjb25zdCBzY29yZUEgPSB0aGlzLmNhbGN1bGF0ZVJlbGV2YW5jZVNjb3JlKHF1ZXJ5LCBhKTtcbiAgICAgICAgICBjb25zdCBzY29yZUIgPSB0aGlzLmNhbGN1bGF0ZVJlbGV2YW5jZVNjb3JlKHF1ZXJ5LCBiKTtcbiAgICAgICAgICByZXR1cm4gc2NvcmVCIC0gc2NvcmVBO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBzb3J0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHJlbGV2YW5jZSBzY29yZSBmb3Igc2VhcmNoIHJlc3VsdHNcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlUmVsZXZhbmNlU2NvcmUocXVlcnk6IHN0cmluZywgZW50cnk6IEluZGV4RW50cnkpOiBudW1iZXIge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRRdWVyeSA9IG5vcm1hbGl6ZVNlYXJjaFRlcm0ocXVlcnkpO1xuICAgIGxldCBzY29yZSA9IDA7XG4gICAgXG4gICAgLy8gRXhhY3QgbmFtZSBtYXRjaCBnZXRzIGhpZ2hlc3Qgc2NvcmVcbiAgICBpZiAobm9ybWFsaXplU2VhcmNoVGVybShlbnRyeS5uYW1lKS5pbmNsdWRlcyhub3JtYWxpemVkUXVlcnkpKSB7XG4gICAgICBzY29yZSArPSAxMDA7XG4gICAgfVxuICAgIFxuICAgIC8vIERlc2NyaXB0aW9uIG1hdGNoXG4gICAgaWYgKG5vcm1hbGl6ZVNlYXJjaFRlcm0oZW50cnkuZGVzY3JpcHRpb24pLmluY2x1ZGVzKG5vcm1hbGl6ZWRRdWVyeSkpIHtcbiAgICAgIHNjb3JlICs9IDUwO1xuICAgIH1cbiAgICBcbiAgICAvLyBUYWcgbWF0Y2hlc1xuICAgIGNvbnN0IG1hdGNoaW5nVGFncyA9IGVudHJ5LnRhZ3MuZmlsdGVyKHRhZyA9PiBcbiAgICAgIG5vcm1hbGl6ZVNlYXJjaFRlcm0odGFnKS5pbmNsdWRlcyhub3JtYWxpemVkUXVlcnkpXG4gICAgKTtcbiAgICBzY29yZSArPSBtYXRjaGluZ1RhZ3MubGVuZ3RoICogMjU7XG4gICAgXG4gICAgLy8gUGF0aCBtYXRjaCAobG93ZXIgcHJpb3JpdHkpXG4gICAgaWYgKG5vcm1hbGl6ZVNlYXJjaFRlcm0oZW50cnkucGF0aCkuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KSkge1xuICAgICAgc2NvcmUgKz0gMTA7XG4gICAgfVxuICAgIFxuICAgIC8vIEJvbnVzIGZvciByZWNlbnQgY29udGVudFxuICAgIGNvbnN0IGRheXNTaW5jZUNyZWF0ZWQgPSAoRGF0ZS5ub3coKSAtIG5ldyBEYXRlKGVudHJ5LmNyZWF0ZWQpLmdldFRpbWUoKSkgLyAoMTAwMCAqIDYwICogNjAgKiAyNCk7XG4gICAgaWYgKGRheXNTaW5jZUNyZWF0ZWQgPCAzMCkge1xuICAgICAgc2NvcmUgKz0gNTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHNjb3JlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgbGVnYWN5IHNlYXJjaCByZXN1bHRzIHRvIG5ldyBTZWFyY2hSZXN1bHRzIGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0TGVnYWN5UmVzdWx0cyhsZWdhY3lSZXN1bHRzOiBhbnlbXSwgcXVlcnk6IHN0cmluZywgb3B0aW9uczogU2VhcmNoT3B0aW9ucywgc2VhcmNoVGltZTogbnVtYmVyKTogU2VhcmNoUmVzdWx0cyB7XG4gICAgLy8gQ29udmVydCBHaXRIdWIgQVBJIGZvcm1hdCB0byBJbmRleEVudHJ5IGZvcm1hdFxuICAgIGNvbnN0IGVudHJpZXM6IEluZGV4RW50cnlbXSA9IGxlZ2FjeVJlc3VsdHMubWFwKGl0ZW0gPT4gKHtcbiAgICAgIHBhdGg6IGl0ZW0ucGF0aCxcbiAgICAgIHR5cGU6IHRoaXMuZXh0cmFjdFR5cGVGcm9tUGF0aChpdGVtLnBhdGgpLFxuICAgICAgbmFtZTogaXRlbS5uYW1lPy5yZXBsYWNlKCcubWQnLCAnJykgfHwgJ1Vua25vd24nLFxuICAgICAgZGVzY3JpcHRpb246ICdObyBkZXNjcmlwdGlvbiBhdmFpbGFibGUnLFxuICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgIGF1dGhvcjogJ1Vua25vd24nLFxuICAgICAgdGFnczogW10sXG4gICAgICBzaGE6IGl0ZW0uc2hhIHx8ICcnLFxuICAgICAgY2F0ZWdvcnk6IHRoaXMuZXh0cmFjdENhdGVnb3J5RnJvbVBhdGgoaXRlbS5wYXRoKSxcbiAgICAgIGNyZWF0ZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGxpY2Vuc2U6ICdVbmtub3duJ1xuICAgIH0pKTtcbiAgICBcbiAgICAvLyBBcHBseSBwYWdpbmF0aW9uXG4gICAgY29uc3QgcGFnZSA9IG9wdGlvbnMucGFnZSB8fCAxO1xuICAgIGNvbnN0IHBhZ2VTaXplID0gb3B0aW9ucy5wYWdlU2l6ZSB8fCAyNTtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gKHBhZ2UgLSAxKSAqIHBhZ2VTaXplO1xuICAgIGNvbnN0IGVuZEluZGV4ID0gc3RhcnRJbmRleCArIHBhZ2VTaXplO1xuICAgIGNvbnN0IHBhZ2luYXRlZEVudHJpZXMgPSBlbnRyaWVzLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgaXRlbXM6IHBhZ2luYXRlZEVudHJpZXMsXG4gICAgICB0b3RhbDogZW50cmllcy5sZW5ndGgsXG4gICAgICBwYWdlLFxuICAgICAgcGFnZVNpemUsXG4gICAgICBoYXNNb3JlOiBlbmRJbmRleCA8IGVudHJpZXMubGVuZ3RoLFxuICAgICAgcXVlcnksXG4gICAgICBzZWFyY2hUaW1lXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGVsZW1lbnQgdHlwZSBmcm9tIGZpbGUgcGF0aFxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0VHlwZUZyb21QYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcvJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+PSAyICYmIHBhcnRzWzBdID09PSAnbGlicmFyeScpIHtcbiAgICAgIHJldHVybiBwYXJ0c1sxXTtcbiAgICB9XG4gICAgcmV0dXJuICd1bmtub3duJztcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGNhdGVnb3J5IGZyb20gZmlsZSBwYXRoXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RDYXRlZ29yeUZyb21QYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcvJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+PSAzICYmIHBhcnRzWzBdID09PSAnbGlicmFyeScpIHtcbiAgICAgIHJldHVybiBwYXJ0c1syXTtcbiAgICB9XG4gICAgcmV0dXJuICd1bmNhdGVnb3JpemVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgZW1wdHkgc2VhcmNoIHJlc3VsdHMgZm9yIGVycm9yIGNhc2VzXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUVtcHR5U2VhcmNoUmVzdWx0cyhxdWVyeTogc3RyaW5nLCBvcHRpb25zOiBTZWFyY2hPcHRpb25zKTogU2VhcmNoUmVzdWx0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW1zOiBbXSxcbiAgICAgIHRvdGFsOiAwLFxuICAgICAgcGFnZTogb3B0aW9ucy5wYWdlIHx8IDEsXG4gICAgICBwYWdlU2l6ZTogb3B0aW9ucy5wYWdlU2l6ZSB8fCAyNSxcbiAgICAgIGhhc01vcmU6IGZhbHNlLFxuICAgICAgcXVlcnksXG4gICAgICBzZWFyY2hUaW1lOiAwXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmhhbmNlZCBmb3JtYXQgZm9yIHNlYXJjaCByZXN1bHRzIHdpdGggcGFnaW5hdGlvbiBpbmZvXG4gICAqL1xuICBmb3JtYXRTZWFyY2hSZXN1bHRzV2l0aFBhZ2luYXRpb24ocmVzdWx0czogU2VhcmNoUmVzdWx0cywgcGVyc29uYUluZGljYXRvcjogc3RyaW5nID0gJycpOiBzdHJpbmcge1xuICAgIGlmIChyZXN1bHRzLnRvdGFsID09PSAwKSB7XG4gICAgICByZXR1cm4gYCR7cGVyc29uYUluZGljYXRvcn3wn5SNIE5vIGNvbnRlbnQgZm91bmQgZm9yIHF1ZXJ5OiBcIiR7cmVzdWx0cy5xdWVyeX1cImA7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHN0YXJ0SXRlbSA9IChyZXN1bHRzLnBhZ2UgLSAxKSAqIHJlc3VsdHMucGFnZVNpemUgKyAxO1xuICAgIGNvbnN0IGVuZEl0ZW0gPSBNYXRoLm1pbihyZXN1bHRzLnBhZ2UgKiByZXN1bHRzLnBhZ2VTaXplLCByZXN1bHRzLnRvdGFsKTtcbiAgICBcbiAgICBjb25zdCB0ZXh0UGFydHMgPSBbXG4gICAgICBgJHtwZXJzb25hSW5kaWNhdG9yffCflI0gKipTZWFyY2ggUmVzdWx0cyBmb3IgXCIke3Jlc3VsdHMucXVlcnl9XCIqKlxcbmAsXG4gICAgICBg8J+TiiBTaG93aW5nICR7c3RhcnRJdGVtfS0ke2VuZEl0ZW19IG9mICR7cmVzdWx0cy50b3RhbH0gcmVzdWx0cyAoUGFnZSAke3Jlc3VsdHMucGFnZX0pXFxuYCxcbiAgICAgIGDimqEgU2VhcmNoIHRpbWU6ICR7cmVzdWx0cy5zZWFyY2hUaW1lfW1zXFxuXFxuYFxuICAgIF07XG4gICAgXG4gICAgcmVzdWx0cy5pdGVtcy5mb3JFYWNoKChpdGVtOiBJbmRleEVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBjb250ZW50SWNvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICdwZXJzb25hcyc6ICfwn46tJyxcbiAgICAgICAgJ3NraWxscyc6ICfwn5ug77iPJyxcbiAgICAgICAgJ2FnZW50cyc6ICfwn6SWJyxcbiAgICAgICAgJ3Byb21wdHMnOiAn8J+SrCcsXG4gICAgICAgICd0ZW1wbGF0ZXMnOiAn8J+ThCcsXG4gICAgICAgICd0b29scyc6ICfwn5SnJyxcbiAgICAgICAgJ2Vuc2VtYmxlcyc6ICfwn468JyxcbiAgICAgICAgJ21lbW9yaWVzJzogJ/Cfp6AnXG4gICAgICB9O1xuICAgICAgY29uc3QgaWNvbiA9IGNvbnRlbnRJY29uc1tpdGVtLnR5cGVdIHx8ICfwn5OEJztcbiAgICAgIFxuICAgICAgdGV4dFBhcnRzLnB1c2goXG4gICAgICAgIGAgICAke2ljb259ICoqJHtpdGVtLm5hbWV9KiogKCR7aXRlbS50eXBlfSlcXG5gLFxuICAgICAgICBgICAgICAg8J+TnSAke2l0ZW0uZGVzY3JpcHRpb259XFxuYCxcbiAgICAgICAgYCAgICAgIPCfj7fvuI8gVGFnczogJHtpdGVtLnRhZ3Muam9pbignLCAnKX1cXG5gLFxuICAgICAgICBgICAgICAg8J+TgiBQYXRoOiAke2l0ZW0ucGF0aH1cXG5gLFxuICAgICAgICBgICAgICAg8J+TpSBJbnN0YWxsOiBcXGBpbnN0YWxsX2NvbnRlbnQgXCIke2l0ZW0ucGF0aH1cIlxcYFxcbmAsXG4gICAgICAgIGAgICAgICDwn5GB77iPIERldGFpbHM6IFxcYGdldF9jb2xsZWN0aW9uX2NvbnRlbnQgXCIke2l0ZW0ucGF0aH1cIlxcYFxcblxcbmBcbiAgICAgICk7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gQWRkIHBhZ2luYXRpb24gaW5mb1xuICAgIGlmIChyZXN1bHRzLmhhc01vcmUpIHtcbiAgICAgIGNvbnN0IG5leHRQYWdlID0gcmVzdWx0cy5wYWdlICsgMTtcbiAgICAgIHRleHRQYXJ0cy5wdXNoKGDwn5OEIE1vcmUgcmVzdWx0cyBhdmFpbGFibGUuIFVzZSBwYWdlICR7bmV4dFBhZ2V9IHRvIHNlZSBuZXh0ICR7cmVzdWx0cy5wYWdlU2l6ZX0gaXRlbXMuXFxuYCk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB0ZXh0UGFydHMuam9pbignJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNhY2hlIHN0YXRpc3RpY3MgZm9yIGRlYnVnZ2luZ1xuICAgKi9cbiAgYXN5bmMgZ2V0Q2FjaGVTdGF0cygpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGluZGV4U3RhdHMgPSB0aGlzLmluZGV4Q2FjaGUuZ2V0Q2FjaGVTdGF0cygpO1xuICAgIGNvbnN0IGNhY2hlU3RhdHMgPSBhd2FpdCB0aGlzLmNvbGxlY3Rpb25DYWNoZS5nZXRDYWNoZVN0YXRzKCk7XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIGluZGV4OiBpbmRleFN0YXRzLFxuICAgICAgY29sbGVjdGlvbjogY2FjaGVTdGF0c1xuICAgIH07XG4gIH1cbn0iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionSeeder.d.ts","sourceRoot":"","sources":["../../src/collection/CollectionSeeder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D;;;GAGG;AACH,qBAAa,gBAAgB;IAE3B,OAAO,CAAC,MAAM,CAAC,cAAc,CAAiC;IAE9D;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,cAAc,EAAE;
|
|
1
|
+
{"version":3,"file":"CollectionSeeder.d.ts","sourceRoot":"","sources":["../../src/collection/CollectionSeeder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D;;;GAGG;AACH,qBAAa,gBAAgB;IAE3B,OAAO,CAAC,MAAM,CAAC,cAAc,CAAiC;IAE9D;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,cAAc,EAAE;IAoOtC;;OAEG;IACH,MAAM,CAAC,YAAY;;;;;;IAiBnB;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI9C;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;CAG7D"}
|