@dollhousemcp/mcp-server 1.5.0 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CHANGELOG.md +49 -1
  2. package/README.md +27 -16
  3. package/dist/auth/GitHubAuthManager.js +2 -2
  4. package/dist/cache/CollectionCache.d.ts +65 -0
  5. package/dist/cache/CollectionCache.d.ts.map +1 -0
  6. package/dist/cache/CollectionCache.js +162 -0
  7. package/dist/cache/index.d.ts +1 -0
  8. package/dist/cache/index.d.ts.map +1 -1
  9. package/dist/cache/index.js +2 -1
  10. package/dist/collection/CollectionBrowser.d.ts +24 -1
  11. package/dist/collection/CollectionBrowser.d.ts.map +1 -1
  12. package/dist/collection/CollectionBrowser.js +135 -23
  13. package/dist/collection/CollectionSearch.d.ts +20 -1
  14. package/dist/collection/CollectionSearch.d.ts.map +1 -1
  15. package/dist/collection/CollectionSearch.js +110 -6
  16. package/dist/collection/CollectionSeeder.d.ts +36 -0
  17. package/dist/collection/CollectionSeeder.d.ts.map +1 -0
  18. package/dist/collection/CollectionSeeder.js +230 -0
  19. package/dist/collection/GitHubClient.d.ts.map +1 -1
  20. package/dist/collection/GitHubClient.js +8 -4
  21. package/dist/collection/PersonaSubmitter.d.ts +48 -1
  22. package/dist/collection/PersonaSubmitter.d.ts.map +1 -1
  23. package/dist/collection/PersonaSubmitter.js +170 -34
  24. package/dist/collection/index.d.ts +1 -0
  25. package/dist/collection/index.d.ts.map +1 -1
  26. package/dist/collection/index.js +2 -1
  27. package/dist/generated/version.d.ts +2 -2
  28. package/dist/generated/version.js +3 -3
  29. package/dist/index.d.ts +12 -1
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +165 -54
  32. package/dist/server/tools/CollectionTools.d.ts.map +1 -1
  33. package/dist/server/tools/CollectionTools.js +12 -1
  34. package/dist/server/tools/PersonaTools.d.ts.map +1 -1
  35. package/dist/server/tools/PersonaTools.js +3 -7
  36. package/dist/server/types.d.ts +1 -0
  37. package/dist/server/types.d.ts.map +1 -1
  38. package/dist/server/types.js +1 -1
  39. package/dist/utils/searchUtils.d.ts +23 -0
  40. package/dist/utils/searchUtils.d.ts.map +1 -0
  41. package/dist/utils/searchUtils.js +57 -0
  42. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -5,11 +5,59 @@ All notable changes to DollhouseMCP will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.5.2] - 2025-08-06
9
+
10
+ ### Added
11
+ - **Anonymous Collection Access** - Browse and search collection without GitHub authentication (#476)
12
+ - Implemented `CollectionCache` for offline browsing with 24-hour TTL
13
+ - Added `CollectionSeeder` with built-in sample data fallback
14
+ - Collection tools now work without authentication using cached/seed data
15
+ - **Anonymous Submission Support** - Submit personas without GitHub authentication (#479)
16
+ - Removed email submission pathway for security (spam/injection prevention)
17
+ - Added rate limiting (5 submissions/hour with 10-second minimum delay)
18
+ - Clear user messaging about GitHub requirement for spam prevention
19
+ - **Shared Search Utilities** - Extracted common search functionality to reduce duplication
20
+ - Created `searchUtils.ts` with `normalizeSearchTerm` and `validateSearchQuery`
21
+ - Added Unicode normalization for all search inputs (security)
22
+ - **Comprehensive Documentation**
23
+ - Created `ANONYMOUS_SUBMISSION_GUIDE.md` for anonymous usage instructions
24
+ - Added `TESTING_STRATEGY_ES_MODULES.md` documenting ES module test approach
25
+ - Created `MULTI_AGENT_GITFLOW_PROCESS.md` for development workflow
26
+
27
+ ### Fixed
28
+ - **OAuth Documentation URL** - Fixed misleading developer registration link (#480)
29
+ - Changed from GitHub app creation URL to proper documentation
30
+ - Critical UX blocker that confused users during OAuth setup
31
+
32
+ ### Security
33
+ - **Removed Email Vector** - Eliminated email submission to prevent spam/injection attacks
34
+ - **Rate Limiting** - Implemented configurable rate limits for anonymous submissions
35
+ - **Unicode Normalization** - All user inputs now sanitized with `UnicodeValidator`
36
+ - **Audit Logging** - Added security event logging for cache operations and submissions
37
+ - **Path Validation** - Enhanced validation to prevent directory traversal attacks
38
+
39
+ ### Changed
40
+ - **Test Organization** - Added `CollectionCache.test.ts` to excluded tests due to ES module mocking
41
+
42
+ ## [1.5.1] - 2025-08-05
43
+
44
+ ### Fixed
45
+ - **Critical**: Fixed OAuth token retrieval for collection browsing (#471)
46
+ - `GitHubClient` now uses `getGitHubTokenAsync()` to check both environment variables and secure storage
47
+ - OAuth tokens from `setup_github_auth` are now properly used for API calls
48
+ - **Critical**: Fixed legacy category validation blocking collection browsing (#471)
49
+ - Replaced deprecated `validateCategory()` calls with proper section/type validation
50
+ - Collection browsing now accepts valid sections (library, showcase, catalog) and types (personas, skills, etc.)
51
+ - **Legacy**: Removed category validation from persona creation tools
52
+ - `create_persona` tool no longer requires or validates categories
53
+ - `edit_persona` allows editing category field for backward compatibility without validation
54
+ - Aligns with element system architecture where categories are deprecated
55
+
8
56
  ## [1.5.0] - 2025-08-05
9
57
 
10
58
  ### Added
11
59
  - **GitHub OAuth Device Flow Authentication** - Secure authentication without manual token management
12
- - New tools: `authenticate_github`, `get_auth_status`, `clear_authentication`
60
+ - New tools: `setup_github_auth`, `check_github_auth`, `clear_github_auth`
13
61
  - AES-256-GCM encrypted token storage with machine-specific keys
14
62
  - Natural language OAuth flow with user-friendly instructions
15
63
  - Built-in rate limiting and Unicode security validation
package/README.md CHANGED
@@ -23,9 +23,9 @@ A comprehensive Model Context Protocol (MCP) server that enables dynamic AI pers
23
23
  **🏪 Collection**: https://github.com/DollhouseMCP/collection
24
24
  **📦 NPM Package**: https://www.npmjs.com/package/@dollhousemcp/mcp-server
25
25
  **🌍 Website**: https://dollhousemcp.com (planned)
26
- **📦 Version**: v1.5.0
26
+ **📦 Version**: v1.5.2
27
27
 
28
- > **⚠️ Breaking Change Notice**: Tool names have changed from "marketplace" to "collection" terminology. Old names still work but are deprecated. See [Migration Guide](docs/MIGRATION_GUIDE_COLLECTION_RENAME.md) for details.
28
+ > **🎉 New in v1.5.2**: Anonymous collection browsing and submission! No GitHub authentication required for basic usage. See [Anonymous Submission Guide](docs/ANONYMOUS_SUBMISSION_GUIDE.md) for details.
29
29
 
30
30
  ## 🚀 Quick Start
31
31
 
@@ -33,8 +33,8 @@ A comprehensive Model Context Protocol (MCP) server that enables dynamic AI pers
33
33
  # Install globally
34
34
  npm install -g @dollhousemcp/mcp-server
35
35
 
36
- # ✅ v1.5.0 introduces GitHub OAuth authentication!
37
- # New secure authentication without manual token management:
36
+ # ✅ v1.5.2 enables anonymous usage - no GitHub auth required!
37
+ # Browse and submit to collection without authentication:
38
38
  # npm install -g @dollhousemcp/mcp-server@latest
39
39
 
40
40
  # Add to Claude Desktop config (see path below for your OS)
@@ -60,7 +60,7 @@ Restart Claude Desktop and you're ready to use DollhouseMCP! Try `list_personas`
60
60
 
61
61
  | Feature | Description |
62
62
  |---------|-------------|
63
- | 🎭 **43 MCP Tools** | Complete portfolio element management through chat interface |
63
+ | 🎭 **49 MCP Tools** | Complete portfolio element management through chat interface |
64
64
  | 🏪 **GitHub Collection** | Browse, search, install, and submit personas to community collection |
65
65
  | 👤 **User Identity System** | Environment-based attribution for persona creators |
66
66
  | 🆔 **Unique ID System** | Advanced ID generation: `{type}_{name}_{author}_{YYYYMMDD}-{HHMMSS}` |
@@ -324,9 +324,9 @@ Add DollhouseMCP to your Claude Desktop configuration:
324
324
  - **`get_indicator_config`** - View current indicator configuration settings
325
325
 
326
326
  ### GitHub Authentication (NEW!)
327
- - **`authenticate_github`** - Start GitHub OAuth device flow authentication
328
- - **`get_auth_status`** - Check current authentication status
329
- - **`clear_authentication`** - Remove stored authentication credentials
327
+ - **`setup_github_auth`** - Start GitHub OAuth device flow authentication
328
+ - **`check_github_auth`** - Check current authentication status
329
+ - **`clear_github_auth`** - Remove stored authentication credentials
330
330
 
331
331
  ## 📖 Usage Examples
332
332
 
@@ -407,14 +407,14 @@ export DOLLHOUSE_INDICATOR_STYLE=minimal
407
407
  export DOLLHOUSE_INDICATOR_EMOJI=🎨
408
408
  ```
409
409
 
410
- ### GitHub Authentication (NEW! v1.5.0)
410
+ ### GitHub Authentication (v1.5.0+)
411
411
 
412
- DollhouseMCP now supports GitHub OAuth device flow authentication for secure access to GitHub features without exposing tokens:
412
+ DollhouseMCP supports GitHub OAuth device flow authentication for enhanced features. **NEW in v1.5.2**: Authentication is now optional - browse and submit anonymously!
413
413
 
414
414
  ```
415
- authenticate_github # Start OAuth device flow
416
- get_auth_status # Check authentication status
417
- clear_authentication # Remove stored credentials
415
+ setup_github_auth # Start OAuth device flow
416
+ check_github_auth # Check authentication status
417
+ clear_github_auth # Remove stored credentials
418
418
  ```
419
419
 
420
420
  **Features:**
@@ -425,7 +425,7 @@ clear_authentication # Remove stored credentials
425
425
  - ✅ **Unicode Security**: Prevents homograph attacks
426
426
 
427
427
  **How It Works:**
428
- 1. Run `authenticate_github` to start the OAuth flow
428
+ 1. Run `setup_github_auth` to start the OAuth flow
429
429
  2. Visit the provided URL and enter the user code
430
430
  3. Authorize DollhouseMCP in your browser
431
431
  4. Authentication completes automatically
@@ -434,13 +434,13 @@ clear_authentication # Remove stored credentials
434
434
  **Example Usage:**
435
435
  ```
436
436
  # First-time setup
437
- authenticate_github
437
+ setup_github_auth
438
438
  # Copy the user code: XXXX-XXXX
439
439
  # Visit: https://github.com/login/device
440
440
  # Enter the code and authorize
441
441
 
442
442
  # Check status
443
- get_auth_status
443
+ check_github_auth
444
444
  # ✅ Authenticated as: your-username
445
445
 
446
446
  # Later sessions automatically use stored token
@@ -1200,7 +1200,18 @@ This project is licensed under the **AGPL-3.0** License with Platform Stability
1200
1200
 
1201
1201
  ## 🏷️ Version History
1202
1202
 
1203
+ <<<<<<< HEAD
1203
1204
  ### v1.5.0 - August 5, 2025 (Current)
1205
+ =======
1206
+ ### v1.5.1 - August 5, 2025 (Current)
1207
+ **Critical Bug Fixes**:
1208
+ - 🔧 **Fixed OAuth Token Retrieval** - `setup_github_auth` tokens now properly used for API calls
1209
+ - 🔧 **Fixed Collection Browsing** - Removed legacy category validation blocking browsing
1210
+ - 🔧 **Persona Creation Simplified** - Categories no longer required or validated
1211
+ - ✅ **Element System Alignment** - Full consistency with new architecture
1212
+
1213
+ ### v1.5.0 - August 5, 2025
1214
+ >>>>>>> origin/main
1204
1215
  **GitHub OAuth Authentication**:
1205
1216
  - 🔐 **OAuth Device Flow** - Secure authentication without manual token management
1206
1217
  - 🔒 **AES-256-GCM Encryption** - Tokens encrypted at rest with machine-specific keys
@@ -96,7 +96,7 @@ export class GitHubAuthManager {
96
96
  async initiateDeviceFlow() {
97
97
  if (!GitHubAuthManager.CLIENT_ID) {
98
98
  throw new Error('GitHub OAuth is not configured. Please set DOLLHOUSE_GITHUB_CLIENT_ID environment variable. ' +
99
- 'Register an OAuth app at https://github.com/settings/applications/new');
99
+ 'For setup instructions, visit: https://github.com/DollhouseMCP/mcp-server#github-authentication');
100
100
  }
101
101
  try {
102
102
  const response = await this.fetchWithRetry(GitHubAuthManager.DEVICE_CODE_URL, {
@@ -462,4 +462,4 @@ Don't have a GitHub account? You'll be prompted to create one (it's free!)
462
462
  }
463
463
  }
464
464
  }
465
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2l0SHViQXV0aE1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXV0aC9HaXRIdWJBdXRoTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQXdCakU7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUM1Qiw4Q0FBOEM7SUFDOUMsOENBQThDO0lBQ3RDLE1BQU0sQ0FBVSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQztJQUUzRSx5QkFBeUI7SUFDakIsTUFBTSxDQUFVLGVBQWUsR0FBRyxzQ0FBc0MsQ0FBQztJQUN6RSxNQUFNLENBQVUsU0FBUyxHQUFHLDZDQUE2QyxDQUFDO0lBQzFFLE1BQU0sQ0FBVSxRQUFRLEdBQUcsNkJBQTZCLENBQUM7SUFFakUsd0JBQXdCO0lBQ2hCLE1BQU0sQ0FBVSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsQ0FBQyxZQUFZO0lBQzFELE1BQU0sQ0FBVSxpQkFBaUIsR0FBRyxHQUFHLENBQUMsQ0FBQyxtQkFBbUI7SUFFNUQsUUFBUSxDQUFXO0lBQ25CLGFBQWEsR0FBMkIsSUFBSSxDQUFDO0lBRXJELFlBQVksUUFBa0I7UUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLGNBQWMsQ0FDMUIsR0FBVyxFQUNYLE9BQW9CLEVBQ3BCLGFBQXFCLENBQUMsRUFDdEIsYUFBcUIsSUFBSTtRQUV6QixJQUFJLFNBQVMsR0FBaUIsSUFBSSxDQUFD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QUFPLEVBQUUsNENBQTRDO2dCQUNyRCxRQUFRLEVBQUU7b0JBQ1IsZ0JBQWdCLEVBQUUsSUFBSTtpQkFDdkI7YUFDRixDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsSUFBSSxDQUFDLHlEQUF5RCxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUVELGtCQUFrQjtRQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7O09BR0c7SUFDSyx3QkFBd0IsQ0FBQyxNQUFjLEVBQUUsU0FBaUI7UUFDaEUsUUFBUSxNQUFNLEVBQUUsQ0FBQztZQUNmLEtBQUssR0FBRztnQkFDTixPQUFPLGdGQUFnRixDQUFDO1lBQzFGLEtBQUssR0FBRztnQkFDTixPQUFPLGtFQUFrRSxDQUFDO1lBQzVFLEtBQUssR0FBRztnQkFDTixPQUFPLHVFQUF1RSxDQUFDO1lBQ2pGLEtBQUssR0FBRztnQkFDTixPQUFPLDREQUE0RCxDQUFDO1lBQ3RFLEtBQUssR0FBRztnQkFDTixPQUFPLHFFQUFxRSxDQUFDO1lBQy9FLEtBQUssR0FBRztnQkFDTixPQUFPLGtFQUFrRSxDQUFDO1lBQzVFLEtBQUssR0FBRyxDQUFDO1lBQ1QsS0FBSyxHQUFHLENBQUM7WUFDVCxLQUFLLEdBQUcsQ0FBQztZQUNULEtBQUssR0FBRztnQkFDTixPQUFPLDRFQUE0RSxDQUFDO1lBQ3RGO2dCQUNFLG9FQUFvRTtnQkFDcEUsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RSxPQUFPLHNCQUFzQixTQUFTLHdEQUF3RCxDQUFDO1FBQ25HLENBQUM7SUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHaXRIdWIgYXV0aGVudGljYXRpb24gbWFuYWdlciB1c2luZyBPQXV0aCBkZXZpY2UgZmxvd1xuICogSGFuZGxlcyBhdXRoZW50aWNhdGlvbiBmb3IgTUNQIHNlcnZlcnMgd2l0aG91dCByZXF1aXJpbmcgY2xpZW50IHNlY3JldHNcbiAqL1xuXG5pbXBvcnQgeyBUb2tlbk1hbmFnZXIgfSBmcm9tICcuLi9zZWN1cml0eS90b2tlbk1hbmFnZXIuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IEFQSUNhY2hlIH0gZnJvbSAnLi4vY2FjaGUvQVBJQ2FjaGUuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERldmljZUNvZGVSZXNwb25zZSB7XG4gIGRldmljZV9jb2RlOiBzdHJpbmc7XG4gIHVzZXJfY29kZTogc3RyaW5nO1xuICB2ZXJpZmljYXRpb25fdXJpOiBzdHJpbmc7XG4gIGV4cGlyZXNfaW46IG51bWJlcjtcbiAgaW50ZXJ2YWw6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb2tlblJlc3BvbnNlIHtcbiAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gIHRva2VuX3R5cGU6IHN0cmluZztcbiAgc2NvcGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXRoU3RhdHVzIHtcbiAgaXNBdXRoZW50aWNhdGVkOiBib29sZWFuO1xuICBoYXNUb2tlbjogYm9vbGVhbjtcbiAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gIHNjb3Blcz86IHN0cmluZ1tdO1xuICBleHBpcmVzQXQ/OiBEYXRlO1xufVxuXG4vKipcbiAqIE1hbmFnZXMgR2l0SHViIGF1dGhlbnRpY2F0aW9uIHVzaW5nIHRoZSBPQXV0aCBkZXZpY2UgZmxvd1xuICogVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgYXBwcm9hY2ggZm9yIENMSS9kZXNrdG9wIGFwcGxpY2F0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgR2l0SHViQXV0aE1hbmFnZXIge1xuICAvLyBHaXRIdWIgT0F1dGggQXBwIENsaWVudCBJRCBmb3IgRG9sbGhvdXNlTUNQXG4gIC8vIE11c3QgYmUgY29uZmlndXJlZCB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ0xJRU5UX0lEID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0dJVEhVQl9DTElFTlRfSUQ7XG4gIFxuICAvLyBHaXRIdWIgT0F1dGggZW5kcG9pbnRzXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFVklDRV9DT0RFX1VSTCA9ICdodHRwczovL2dpdGh1Yi5jb20vbG9naW4vZGV2aWNlL2NvZGUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUT0tFTl9VUkwgPSAnaHR0cHM6Ly9naXRodWIuY29tL2xvZ2luL29hdXRoL2FjY2Vzc190b2tlbic7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFVTRVJfVVJMID0gJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcic7XG4gIFxuICAvLyBQb2xsaW5nIGNvbmZpZ3VyYXRpb25cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9QT0xMX0lOVEVSVkFMID0gNTAwMDsgLy8gNSBzZWNvbmRzXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9QT0xMX0FUVEVNUFRTID0gMTgwOyAvLyAxNSBtaW51dGVzIHRvdGFsXG4gIFxuICBwcml2YXRlIGFwaUNhY2hlOiBBUElDYWNoZTtcbiAgcHJpdmF0ZSBhY3RpdmVQb2xsaW5nOiBBYm9ydENvbnRyb2xsZXIgfCBudWxsID0gbnVsbDtcbiAgXG4gIGNvbnN0cnVjdG9yKGFwaUNhY2hlOiBBUElDYWNoZSkge1xuICAgIHRoaXMuYXBpQ2FjaGUgPSBhcGlDYWNoZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBuZXR3b3JrIHJlcXVlc3Qgd2l0aCByZXRyeSBsb2dpY1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFdpdGhSZXRyeShcbiAgICB1cmw6IHN0cmluZywgXG4gICAgb3B0aW9uczogUmVxdWVzdEluaXQsIFxuICAgIG1heFJldHJpZXM6IG51bWJlciA9IDMsXG4gICAgcmV0cnlEZWxheTogbnVtYmVyID0gMTAwMFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCBudWxsID0gbnVsbDtcbiAgICBcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBtYXhSZXRyaWVzOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3IgYXMgRXJyb3I7XG4gICAgICAgIFxuICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGEgbmV0d29yayBlcnJvciB0aGF0IHNob3VsZCBiZSByZXRyaWVkXG4gICAgICAgIGNvbnN0IGlzTmV0d29ya0Vycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAoXG4gICAgICAgICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnRUNPTk5SRUZVU0VEJykgfHxcbiAgICAgICAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdFVElNRURPVVQnKSB8fFxuICAgICAgICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0VOT1RGT1VORCcpIHx8XG4gICAgICAgICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbmV0d29yaycpXG4gICAgICAgICk7XG4gICAgICAgIFxuICAgICAgICBpZiAoaXNOZXR3b3JrRXJyb3IgJiYgYXR0ZW1wdCA8IG1heFJldHJpZXMpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYE5ldHdvcmsgcmVxdWVzdCBmYWlsZWQsIHJldHJ5aW5nICgke2F0dGVtcHR9LyR7bWF4UmV0cmllc30pYCwge1xuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICBuZXh0UmV0cnlJbjogcmV0cnlEZWxheSAqIGF0dGVtcHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBFeHBvbmVudGlhbCBiYWNrb2ZmXG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHJldHJ5RGVsYXkgKiBhdHRlbXB0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm90IGEgbmV0d29yayBlcnJvciBvciBsYXN0IGF0dGVtcHQsIHRocm93IGltbWVkaWF0ZWx5XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhyb3cgbGFzdEVycm9yIHx8IG5ldyBFcnJvcignTmV0d29yayByZXF1ZXN0IGZhaWxlZCBhZnRlciBhbGwgcmV0cmllcycpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgY3VycmVudCBhdXRoZW50aWNhdGlvbiBzdGF0dXNcbiAgICovXG4gIGFzeW5jIGdldEF1dGhTdGF0dXMoKTogUHJvbWlzZTxBdXRoU3RhdHVzPiB7XG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCBUb2tlbk1hbmFnZXIuZ2V0R2l0SHViVG9rZW5Bc3luYygpO1xuICAgIFxuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzQXV0aGVudGljYXRlZDogZmFsc2UsXG4gICAgICAgIGhhc1Rva2VuOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyeSB0byBnZXQgdXNlciBpbmZvIHRvIHZhbGlkYXRlIHRva2VuXG4gICAgICBjb25zdCB1c2VySW5mbyA9IGF3YWl0IHRoaXMuZmV0Y2hVc2VySW5mbyh0b2tlbik7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzQXV0aGVudGljYXRlZDogdHJ1ZSxcbiAgICAgICAgaGFzVG9rZW46IHRydWUsXG4gICAgICAgIHVzZXJuYW1lOiB1c2VySW5mby5sb2dpbixcbiAgICAgICAgc2NvcGVzOiB1c2VySW5mby5zY29wZXNcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFRva2VuIG1pZ2h0IGJlIGludmFsaWQgb3IgZXhwaXJlZFxuICAgICAgbG9nZ2VyLmRlYnVnKCdUb2tlbiB2YWxpZGF0aW9uIGZhaWxlZCcsIHsgZXJyb3IgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlLFxuICAgICAgICBoYXNUb2tlbjogdHJ1ZSAvLyBIYXMgdG9rZW4gYnV0IGl0J3MgaW52YWxpZFxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBJbml0aWF0ZSB0aGUgZGV2aWNlIGZsb3cgYXV0aGVudGljYXRpb24gcHJvY2Vzc1xuICAgKi9cbiAgYXN5bmMgaW5pdGlhdGVEZXZpY2VGbG93KCk6IFByb21pc2U8RGV2aWNlQ29kZVJlc3BvbnNlPiB7XG4gICAgaWYgKCFHaXRIdWJBdXRoTWFuYWdlci5DTElFTlRfSUQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0dpdEh1YiBPQXV0aCBpcyBub3QgY29uZmlndXJlZC4gUGxlYXNlIHNldCBET0xMSE9VU0VfR0lUSFVCX0NMSUVOVF9JRCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gJyArXG4gICAgICAgICdSZWdpc3RlciBhbiBPQXV0aCBhcHAgYXQgaHR0cHM6Ly9naXRodWIuY29tL3NldHRpbmdzL2FwcGxpY2F0aW9ucy9uZXcnXG4gICAgICApO1xuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoV2l0aFJldHJ5KEdpdEh1YkF1dGhNYW5hZ2VyLkRFVklDRV9DT0RFX1VSTCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgY2xpZW50X2lkOiBHaXRIdWJBdXRoTWFuYWdlci5DTElFTlRfSUQsXG4gICAgICAgICAgc2NvcGU6ICdwdWJsaWNfcmVwbyByZWFkOnVzZXInXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAvLyBQcm92aWRlIHVzZXItZnJpZW5kbHkgZXJyb3IgbWVzc2FnZXMgYmFzZWQgb24gc3RhdHVzIGNvZGVzXG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IHRoaXMuZ2V0RXJyb3JNZXNzYWdlRm9yU3RhdHVzKHJlc3BvbnNlLnN0YXR1cywgJ2RldmljZSBmbG93IGluaXRpYWxpemF0aW9uJyk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnRGV2aWNlIGZsb3cgaW5pdGlhdGlvbiBmYWlsZWQnLCB7IFxuICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBcbiAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0IFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIHJlc3BvbnNlXG4gICAgICBpZiAoIWRhdGEuZGV2aWNlX2NvZGUgfHwgIWRhdGEudXNlcl9jb2RlIHx8ICFkYXRhLnZlcmlmaWNhdGlvbl91cmkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRldmljZSBmbG93IHJlc3BvbnNlIGZyb20gR2l0SHViJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3IgYXVkaXQgdHJhaWxcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fU1VDQ0VTUycsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnR2l0SHViQXV0aE1hbmFnZXIuaW5pdGlhdGVEZXZpY2VGbG93JyxcbiAgICAgICAgZGV0YWlsczogJ0dpdEh1YiBPQXV0aCBkZXZpY2UgZmxvdyBpbml0aWF0ZWQnLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIHVzZXJDb2RlOiBkYXRhLnVzZXJfY29kZSxcbiAgICAgICAgICBleHBpcmVzSW46IGRhdGEuZXhwaXJlc19pbixcbiAgICAgICAgICBpbnRlcnZhbDogZGF0YS5pbnRlcnZhbFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIGRhdGEgYXMgRGV2aWNlQ29kZVJlc3BvbnNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWF0ZSBkZXZpY2UgZmxvdycsIHsgZXJyb3IgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBHaXRIdWIgYXV0aGVudGljYXRpb24uIFBsZWFzZSBjaGVjayB5b3VyIGludGVybmV0IGNvbm5lY3Rpb24uJyk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogUG9sbCBmb3IgdG9rZW4gYWZ0ZXIgdXNlciBoYXMgYXV0aG9yaXplZCB0aGUgZGV2aWNlXG4gICAqL1xuICBhc3luYyBwb2xsRm9yVG9rZW4oZGV2aWNlQ29kZTogc3RyaW5nLCBpbnRlcnZhbDogbnVtYmVyID0gR2l0SHViQXV0aE1hbmFnZXIuREVGQVVMVF9QT0xMX0lOVEVSVkFMKTogUHJvbWlzZTxUb2tlblJlc3BvbnNlPiB7XG4gICAgLy8gQ3JlYXRlIG5ldyBhYm9ydCBjb250cm9sbGVyIGZvciB0aGlzIHBvbGxpbmcgc2Vzc2lvblxuICAgIHRoaXMuYWN0aXZlUG9sbGluZyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLmFjdGl2ZVBvbGxpbmcuc2lnbmFsO1xuICAgIFxuICAgIGxldCBhdHRlbXB0cyA9IDA7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIHdoaWxlIChhdHRlbXB0cyA8IEdpdEh1YkF1dGhNYW5hZ2VyLk1BWF9QT0xMX0FUVEVNUFRTKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHBvbGxpbmcgd2FzIGFib3J0ZWRcbiAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoZW50aWNhdGlvbiBwb2xsaW5nIHdhcyBjYW5jZWxsZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgYXR0ZW1wdHMrKztcbiAgICAgICAgXG4gICAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goR2l0SHViQXV0aE1hbmFnZXIuVE9LRU5fVVJMLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGNsaWVudF9pZDogR2l0SHViQXV0aE1hbmFnZXIuQ0xJRU5UX0lELFxuICAgICAgICAgICAgZGV2aWNlX2NvZGU6IGRldmljZUNvZGUsXG4gICAgICAgICAgICBncmFudF90eXBlOiAndXJuOmlldGY6cGFyYW1zOm9hdXRoOmdyYW50LXR5cGU6ZGV2aWNlX2NvZGUnXG4gICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgZm9yIHZhcmlvdXMgcmVzcG9uc2Ugc3RhdGVzXG4gICAgICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgc3dpdGNoIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgICBjYXNlICdhdXRob3JpemF0aW9uX3BlbmRpbmcnOlxuICAgICAgICAgICAgICAvLyBVc2VyIGhhc24ndCBhdXRob3JpemVkIHlldCwga2VlcCBwb2xsaW5nXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGNhc2UgJ3Nsb3dfZG93bic6XG4gICAgICAgICAgICAgIC8vIEluY3JlYXNlIHBvbGxpbmcgaW50ZXJ2YWxcbiAgICAgICAgICAgICAgaW50ZXJ2YWwgPSBNYXRoLm1pbihpbnRlcnZhbCAqIDEuNSwgMzAwMDApOyAvLyBNYXggMzAgc2Vjb25kc1xuICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1Nsb3dpbmcgZG93biBwb2xsaW5nIGludGVydmFsJywgeyBuZXdJbnRlcnZhbDogaW50ZXJ2YWwgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGNhc2UgJ2V4cGlyZWRfdG9rZW4nOlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBhdXRob3JpemF0aW9uIGNvZGUgaGFzIGV4cGlyZWQuIFBsZWFzZSBzdGFydCBvdmVyLicpO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGNhc2UgJ2FjY2Vzc19kZW5pZWQnOlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGhvcml6YXRpb24gd2FzIGRlbmllZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAvLyBMb2cgdGhlIGFjdHVhbCBlcnJvciBmb3IgZGVidWdnaW5nXG4gICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnT0F1dGggZGV2aWNlIGZsb3cgZXJyb3InLCB7IFxuICAgICAgICAgICAgICAgIGVycm9yOiBkYXRhLmVycm9yLCBcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZGF0YS5lcnJvcl9kZXNjcmlwdGlvbiBcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkLiBQbGVhc2UgdHJ5IHN0YXJ0aW5nIHRoZSBwcm9jZXNzIGFnYWluLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmFjY2Vzc190b2tlbikge1xuICAgICAgICAgIC8vIFN1Y2Nlc3MhXG4gICAgICAgICAgcmV0dXJuIGRhdGEgYXMgVG9rZW5SZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gV2FpdCBiZWZvcmUgbmV4dCBwb2xsXG4gICAgICAgIC8vIFdhaXQgZm9yIGludGVydmFsIHdpdGggYWJvcnQgc3VwcG9ydFxuICAgICAgICBhd2FpdCB0aGlzLndhaXRXaXRoQWJvcnQoaW50ZXJ2YWwsIHNpZ25hbCk7XG4gICAgICAgIFxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gTmV0d29yayBlcnJvcnMgc2hvdWxkbid0IHN0b3AgcG9sbGluZ1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1BvbGwgYXR0ZW1wdCBmYWlsZWQnLCB7IGF0dGVtcHQ6IGF0dGVtcHRzLCBlcnJvciB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0V2l0aEFib3J0KGludGVydmFsLCBzaWduYWwpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGhlbnRpY2F0aW9uIHRpbWVkIG91dC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gQ2xlYXIgYWN0aXZlIHBvbGxpbmcgcmVmZXJlbmNlXG4gICAgICB0aGlzLmFjdGl2ZVBvbGxpbmcgPSBudWxsO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIENvbXBsZXRlIHRoZSBhdXRoZW50aWNhdGlvbiBmbG93IGFuZCBzdG9yZSB0aGUgdG9rZW5cbiAgICovXG4gIGFzeW5jIGNvbXBsZXRlQXV0aGVudGljYXRpb24odG9rZW5SZXNwb25zZTogVG9rZW5SZXNwb25zZSk6IFByb21pc2U8QXV0aFN0YXR1cz4ge1xuICAgIC8vIFN0b3JlIHRva2VuIHNlY3VyZWx5XG4gICAgYXdhaXQgdGhpcy5zdG9yZVRva2VuKHRva2VuUmVzcG9uc2UuYWNjZXNzX3Rva2VuKTtcbiAgICBcbiAgICAvLyBHZXQgdXNlciBpbmZvXG4gICAgY29uc3QgdXNlckluZm8gPSBhd2FpdCB0aGlzLmZldGNoVXNlckluZm8odG9rZW5SZXNwb25zZS5hY2Nlc3NfdG9rZW4pO1xuICAgIFxuICAgIC8vIExvZyBzdWNjZXNzZnVsIGF1dGhlbnRpY2F0aW9uIGNvbXBsZXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0dpdEh1YkF1dGhNYW5hZ2VyLmNvbXBsZXRlQXV0aGVudGljYXRpb24nLFxuICAgICAgZGV0YWlsczogJ0dpdEh1YiBPQXV0aCBkZXZpY2UgZmxvdyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5JyxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHVzZXJuYW1lOiB1c2VySW5mby5sb2dpbixcbiAgICAgICAgc2NvcGVzOiB0b2tlblJlc3BvbnNlLnNjb3BlLnNwbGl0KCcgJyksXG4gICAgICAgIHRva2VuVHlwZTogVG9rZW5NYW5hZ2VyLmdldFRva2VuVHlwZSh0b2tlblJlc3BvbnNlLmFjY2Vzc190b2tlbilcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgaXNBdXRoZW50aWNhdGVkOiB0cnVlLFxuICAgICAgaGFzVG9rZW46IHRydWUsXG4gICAgICB1c2VybmFtZTogdXNlckluZm8ubG9naW4sXG4gICAgICBzY29wZXM6IHRva2VuUmVzcG9uc2Uuc2NvcGUuc3BsaXQoJyAnKVxuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDbGVhciBzdG9yZWQgYXV0aGVudGljYXRpb24gYW5kIHJldm9rZSB0b2tlblxuICAgKi9cbiAgYXN5bmMgY2xlYXJBdXRoZW50aWNhdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gR2V0IHRoZSB0b2tlbiBiZWZvcmUgY2xlYXJpbmcgaXRcbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgVG9rZW5NYW5hZ2VyLmdldEdpdEh1YlRva2VuQXN5bmMoKTtcbiAgICAgIFxuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIC8vIEF0dGVtcHQgdG8gcmV2b2tlIHRoZSB0b2tlbiBvbiBHaXRIdWJcbiAgICAgICAgLy8gTm90ZTogR2l0SHViIE9BdXRoIHRva2VucyBkb24ndCBoYXZlIGEgcmV2b2NhdGlvbiBlbmRwb2ludCBmb3IgZGV2aWNlIGZsb3cgdG9rZW5zXG4gICAgICAgIC8vIEJ1dCB3ZSdsbCBjbGVhciB0aGUgY2FjaGUgYW5kIHJlbW92ZSBmcm9tIHN0b3JhZ2VcbiAgICAgICAgXG4gICAgICAgIC8vIENsZWFyIGNhY2hlZCB1c2VyIGluZm9cbiAgICAgICAgdGhpcy5hcGlDYWNoZS5jbGVhcigpO1xuICAgICAgICBcbiAgICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBhdWRpdCB0cmFpbFxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1RPS0VOX0NBQ0hFX0NMRUFSRUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdHaXRIdWJBdXRoTWFuYWdlci5jbGVhckF1dGhlbnRpY2F0aW9uJyxcbiAgICAgICAgICBkZXRhaWxzOiAnR2l0SHViIGF1dGhlbnRpY2F0aW9uIGNsZWFyZWQgYnkgdXNlciByZXF1ZXN0JyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgaGFkVG9rZW46IHRydWUsXG4gICAgICAgICAgICB0b2tlblByZWZpeDogVG9rZW5NYW5hZ2VyLmdldFRva2VuUHJlZml4KHRva2VuKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFJlbW92ZSBmcm9tIHNlY3VyZSBzdG9yYWdlXG4gICAgICBhd2FpdCBUb2tlbk1hbmFnZXIucmVtb3ZlU3RvcmVkVG9rZW4oKTtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmluZm8oJ0dpdEh1YiBhdXRoZW50aWNhdGlvbiBjbGVhcmVkIHN1Y2Nlc3NmdWxseScpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGNsZWFyaW5nIGF1dGhlbnRpY2F0aW9uJywgeyBlcnJvciB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNsZWFyIGF1dGhlbnRpY2F0aW9uJyk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogU3RvcmUgdG9rZW4gc2VjdXJlbHkgdXNpbmcgZW5jcnlwdGVkIGZpbGUgc3RvcmFnZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzdG9yZVRva2VuKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgVG9rZW5NYW5hZ2VyLnN0b3JlR2l0SHViVG9rZW4odG9rZW4pO1xuICAgICAgbG9nZ2VyLmluZm8oJ0dpdEh1YiB0b2tlbiBzdG9yZWQgc2VjdXJlbHkuIFlvdSBhcmUgbm93IGF1dGhlbnRpY2F0ZWQhJyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIHN0b3JlIHRva2VuIHNlY3VyZWx5JywgeyBlcnJvciB9KTtcbiAgICAgIC8vIEZhbGxiYWNrIHRvIGVudmlyb25tZW50IHZhcmlhYmxlIGluc3RydWN0aW9uc1xuICAgICAgbG9nZ2VyLmluZm8oJ0ZvciBtYW51YWwgc2V0dXAsIHlvdSBjYW4gc2V0IEdJVEhVQl9UT0tFTiBlbnZpcm9ubWVudCB2YXJpYWJsZS4nKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEZldGNoIHVzZXIgaW5mb3JtYXRpb24gZnJvbSBHaXRIdWJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hVc2VySW5mbyh0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBDaGVjayBjYWNoZSBmaXJzdFxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuYXBpQ2FjaGUuZ2V0KEdpdEh1YkF1dGhNYW5hZ2VyLlVTRVJfVVJMKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2hXaXRoUmV0cnkoR2l0SHViQXV0aE1hbmFnZXIuVVNFUl9VUkwsIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb24nXG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gdGhpcy5nZXRFcnJvck1lc3NhZ2VGb3JTdGF0dXMocmVzcG9uc2Uuc3RhdHVzLCAndXNlciBpbmZvcm1hdGlvbiBmZXRjaCcpO1xuICAgICAgbG9nZ2VyLmRlYnVnKCdGYWlsZWQgdG8gZmV0Y2ggdXNlciBpbmZvJywgeyBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIFxuICAgIC8vIE5vcm1hbGl6ZSB1c2VybmFtZSBhbmQgb3RoZXIgdGV4dCBmaWVsZHMgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3NcbiAgICBpZiAoZGF0YS5sb2dpbikge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGRhdGEubG9naW4pO1xuICAgICAgaWYgKCF2YWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdVTklDT0RFX1ZBTElEQVRJT05fRVJST1InLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdHaXRIdWJBdXRoTWFuYWdlci5mZXRjaFVzZXJJbmZvJyxcbiAgICAgICAgICBkZXRhaWxzOiAnR2l0SHViIHVzZXJuYW1lIGNvbnRhaW5zIGludmFsaWQgVW5pY29kZScsXG4gICAgICAgICAgbWV0YWRhdGE6IHsgXG4gICAgICAgICAgICBvcmlnaW5hbExlbmd0aDogZGF0YS5sb2dpbi5sZW5ndGgsXG4gICAgICAgICAgICBkZXRlY3RlZElzc3VlczogdmFsaWRhdGlvbi5kZXRlY3RlZElzc3VlcyBcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdXNlcm5hbWUgZm9ybWF0IGZyb20gR2l0SHViJyk7XG4gICAgICB9XG4gICAgICBkYXRhLmxvZ2luID0gdmFsaWRhdGlvbi5ub3JtYWxpemVkQ29udGVudDtcbiAgICB9XG4gICAgXG4gICAgLy8gTm9ybWFsaXplIGRpc3BsYXkgbmFtZSBpZiBwcmVzZW50XG4gICAgaWYgKGRhdGEubmFtZSkge1xuICAgICAgY29uc3QgbmFtZVZhbGlkYXRpb24gPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShkYXRhLm5hbWUpO1xuICAgICAgaWYgKG5hbWVWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgZGF0YS5uYW1lID0gbmFtZVZhbGlkYXRpb24ubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCBmYWlsIG9uIGRpc3BsYXkgbmFtZSwganVzdCByZW1vdmUgaXRcbiAgICAgICAgZGVsZXRlIGRhdGEubmFtZTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQWRkIHNjb3BlcyBmcm9tIHJlc3BvbnNlIGhlYWRlcnNcbiAgICBjb25zdCBzY29wZUhlYWRlciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LW9hdXRoLXNjb3BlcycpO1xuICAgIGlmIChzY29wZUhlYWRlcikge1xuICAgICAgZGF0YS5zY29wZXMgPSBzY29wZUhlYWRlci5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKTtcbiAgICB9XG4gICAgXG4gICAgLy8gTG9nIHN1Y2Nlc3NmdWwgYXV0aGVudGljYXRpb24gZm9yIGF1ZGl0IHRyYWlsXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fU1VDQ0VTUycsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdHaXRIdWJBdXRoTWFuYWdlci5mZXRjaFVzZXJJbmZvJyxcbiAgICAgIGRldGFpbHM6ICdHaXRIdWIgdXNlciBhdXRoZW50aWNhdGVkIHN1Y2Nlc3NmdWxseScsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICB1c2VybmFtZTogZGF0YS5sb2dpbixcbiAgICAgICAgaGFzRW1haWw6ICEhZGF0YS5lbWFpbCxcbiAgICAgICAgc2NvcGVzOiBkYXRhLnNjb3BlcyB8fCBbXVxuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8vIENhY2hlIHRoZSByZXN1bHRcbiAgICB0aGlzLmFwaUNhY2hlLnNldChHaXRIdWJBdXRoTWFuYWdlci5VU0VSX1VSTCwgZGF0YSk7XG4gICAgXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGb3JtYXQgYXV0aGVudGljYXRpb24gaW5zdHJ1Y3Rpb25zIGZvciB1c2Vyc1xuICAgKi9cbiAgZm9ybWF0QXV0aEluc3RydWN0aW9ucyhkZXZpY2VSZXNwb25zZTogRGV2aWNlQ29kZVJlc3BvbnNlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYPCflJAgKipHaXRIdWIgQXV0aGVudGljYXRpb24gUmVxdWlyZWQqKlxuXG5UbyBhY2Nlc3MgYWxsIERvbGxob3VzZU1DUCBmZWF0dXJlcywgcGxlYXNlIGF1dGhlbnRpY2F0ZSB3aXRoIEdpdEh1YjpcblxuMS4gVmlzaXQ6ICoqJHtkZXZpY2VSZXNwb25zZS52ZXJpZmljYXRpb25fdXJpfSoqXG4yLiBFbnRlciBjb2RlOiAqKiR7ZGV2aWNlUmVzcG9uc2UudXNlcl9jb2RlfSoqXG4zLiBBdXRob3JpemUgJ0RvbGxob3VzZU1DUCBDb2xsZWN0aW9uJ1xuXG5UaGlzIHdpbGwgZ3JhbnQgYWNjZXNzIHRvOlxu4pyFIEJyb3dzZSB0aGUgcHVibGljIGNvbGxlY3Rpb25cbuKchSBJbnN0YWxsIGNvbW11bml0eSBjb250ZW50ICBcbuKchSBTdWJtaXQgeW91ciBvd24gY3JlYXRpb25zXG5cbkRvbid0IGhhdmUgYSBHaXRIdWIgYWNjb3VudD8gWW91J2xsIGJlIHByb21wdGVkIHRvIGNyZWF0ZSBvbmUgKGl0J3MgZnJlZSEpXG5cbuKPse+4jyBUaGlzIGNvZGUgZXhwaXJlcyBpbiAke01hdGguZmxvb3IoZGV2aWNlUmVzcG9uc2UuZXhwaXJlc19pbiAvIDYwKX0gbWludXRlcy5gO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgdXNlciBuZWVkcyB0byBhdXRoZW50aWNhdGUgZm9yIGEgc3BlY2lmaWMgYWN0aW9uXG4gICAqL1xuICBuZWVkc0F1dGhGb3JBY3Rpb24oYWN0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBhdXRoUmVxdWlyZWRBY3Rpb25zID0gWydzdWJtaXQnLCAnY3JlYXRlX3ByJywgJ21hbmFnZV9jb250ZW50J107XG4gICAgcmV0dXJuIGF1dGhSZXF1aXJlZEFjdGlvbnMuaW5jbHVkZXMoYWN0aW9uLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIFxuICAvKipcbiAgICogV2FpdCB3aXRoIGFib3J0IHNpZ25hbCBzdXBwb3J0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRXaXRoQWJvcnQobXM6IG51bWJlciwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dChyZXNvbHZlLCBtcyk7XG4gICAgICBcbiAgICAgIC8vIExpc3RlbiBmb3IgYWJvcnQgc2lnbmFsXG4gICAgICBjb25zdCBhYm9ydEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignV2FpdCBhYm9ydGVkJykpO1xuICAgICAgfTtcbiAgICAgIFxuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRIYW5kbGVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICBcbiAgICAgIC8vIENsZWFuIHVwIGFmdGVyIHRpbWVvdXRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydEhhbmRsZXIpO1xuICAgICAgfSwgbXMpO1xuICAgIH0pO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2xlYW4gdXAgYW55IGFjdGl2ZSBvcGVyYXRpb25zIChjYWxsZWQgb24gc2VydmVyIHNodXRkb3duKVxuICAgKi9cbiAgYXN5bmMgY2xlYW51cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBBYm9ydCBhbnkgYWN0aXZlIHBvbGxpbmdcbiAgICBpZiAodGhpcy5hY3RpdmVQb2xsaW5nKSB7XG4gICAgICB0aGlzLmFjdGl2ZVBvbGxpbmcuYWJvcnQoKTtcbiAgICAgIHRoaXMuYWN0aXZlUG9sbGluZyA9IG51bGw7XG4gICAgICBcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RPS0VOX0NBQ0hFX0NMRUFSRUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0dpdEh1YkF1dGhNYW5hZ2VyLmNsZWFudXAnLFxuICAgICAgICBkZXRhaWxzOiAnR2l0SHViIGF1dGggbWFuYWdlciBjbGVhbmVkIHVwIG9uIHNodXRkb3duJyxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBoYWRBY3RpdmVQb2xsaW5nOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBsb2dnZXIuaW5mbygnR2l0SHViIGF1dGhlbnRpY2F0aW9uIHBvbGxpbmcgY2FuY2VsbGVkIGR1ZSB0byBzaHV0ZG93bicpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDbGVhciBBUEkgY2FjaGVcbiAgICB0aGlzLmFwaUNhY2hlLmNsZWFyKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgdXNlci1mcmllbmRseSBlcnJvciBtZXNzYWdlIGJhc2VkIG9uIEhUVFAgc3RhdHVzIGNvZGVcbiAgICogQXZvaWRzIGV4cG9zaW5nIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiB3aGlsZSBwcm92aWRpbmcgaGVscGZ1bCBndWlkYW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFcnJvck1lc3NhZ2VGb3JTdGF0dXMoc3RhdHVzOiBudW1iZXIsIG9wZXJhdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgY2FzZSA0MDA6XG4gICAgICAgIHJldHVybiBgSW52YWxpZCByZXF1ZXN0IHRvIEdpdEh1Yi4gUGxlYXNlIGVuc3VyZSB0aGUgT0F1dGggYXBwIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQuYDtcbiAgICAgIGNhc2UgNDAxOlxuICAgICAgICByZXR1cm4gYEF1dGhlbnRpY2F0aW9uIGZhaWxlZC4gVGhlIE9BdXRoIGFwcCBjcmVkZW50aWFscyBtYXkgYmUgaW52YWxpZC5gO1xuICAgICAgY2FzZSA0MDM6XG4gICAgICAgIHJldHVybiBgQWNjZXNzIGRlbmllZCBieSBHaXRIdWIuIFRoZSBPQXV0aCBhcHAgbWF5IGxhY2sgcmVxdWlyZWQgcGVybWlzc2lvbnMuYDtcbiAgICAgIGNhc2UgNDA0OlxuICAgICAgICByZXR1cm4gYEdpdEh1YiBzZXJ2aWNlIG5vdCBmb3VuZC4gVGhpcyBtYXkgaW5kaWNhdGUgYW4gQVBJIGNoYW5nZS5gO1xuICAgICAgY2FzZSA0MjI6XG4gICAgICAgIHJldHVybiBgSW52YWxpZCBwYXJhbWV0ZXJzIHNlbnQgdG8gR2l0SHViLiBQbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uLmA7XG4gICAgICBjYXNlIDQyOTpcbiAgICAgICAgcmV0dXJuIGBUb28gbWFueSByZXF1ZXN0cyB0byBHaXRIdWIuIFBsZWFzZSB3YWl0IGEgbW9tZW50IGFuZCB0cnkgYWdhaW4uYDtcbiAgICAgIGNhc2UgNTAwOlxuICAgICAgY2FzZSA1MDI6XG4gICAgICBjYXNlIDUwMzpcbiAgICAgIGNhc2UgNTA0OlxuICAgICAgICByZXR1cm4gYEdpdEh1YiBzZXJ2aWNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlLiBQbGVhc2UgdHJ5IGFnYWluIGluIGEgZmV3IG1vbWVudHMuYDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIExvZyB0aGUgYWN0dWFsIHN0YXR1cyBmb3IgZGVidWdnaW5nLCBidXQgZG9uJ3QgZXhwb3NlIGl0IHRvIHVzZXJzXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgVW5leHBlY3RlZCBzdGF0dXMgY29kZSBkdXJpbmcgJHtvcGVyYXRpb259YCwgeyBzdGF0dXMgfSk7XG4gICAgICAgIHJldHVybiBgRmFpbGVkIHRvIGNvbXBsZXRlICR7b3BlcmF0aW9ufS4gUGxlYXNlIGNoZWNrIHlvdXIgaW50ZXJuZXQgY29ubmVjdGlvbiBhbmQgdHJ5IGFnYWluLmA7XG4gICAgfVxuICB9XG59Il19
465
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2l0SHViQXV0aE1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXV0aC9HaXRIdWJBdXRoTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQXdCakU7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUM1Qiw4Q0FBOEM7SUFDOUMsOENBQThDO0lBQ3RDLE1BQU0sQ0FBVSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQztJQUUzRSx5QkFBeUI7SUFDakIsTUFBTSxDQUFVLGVBQWUsR0FBRyxzQ0FBc0MsQ0FBQztJQUN6RSxNQUFNLENBQVUsU0FBUyxHQUFHLDZDQUE2QyxDQUFDO0lBQzFFLE1BQU0sQ0FBVSxRQUFRLEdBQUcsNkJBQTZCLENBQUM7SUFFakUsd0JBQXdCO0lBQ2hCLE1BQU0sQ0FBVSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsQ0FBQyxZQUFZO0lBQzFELE1BQU0sQ0FBVSxpQkFBaUIsR0FBRyxHQUFHLENBQUMsQ0FBQyxtQkFBbUI7SUFFNUQsUUFBUSxDQUFXO0lBQ25CLGFBQWEsR0FBMkIsSUFBSSxDQUFDO0lBRXJELFlBQVksUUFBa0I7UUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLGNBQWMsQ0FDMUIsR0FBVyxFQUNYLE9BQW9CLEVBQ3BCLGFBQXFCLENBQUMsRUFDdEIsYUFBcUIsSUFBSTtRQUV6QixJQUFJLFNBQVMsR0FBaUIsSUFBSSxDQUFD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QUFPLEVBQUUsNENBQTRDO2dCQUNyRCxRQUFRLEVBQUU7b0JBQ1IsZ0JBQWdCLEVBQUUsSUFBSTtpQkFDdkI7YUFDRixDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsSUFBSSxDQUFDLHlEQUF5RCxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUVELGtCQUFrQjtRQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7O09BR0c7SUFDSyx3QkFBd0IsQ0FBQyxNQUFjLEVBQUUsU0FBaUI7UUFDaEUsUUFBUSxNQUFNLEVBQUUsQ0FBQztZQUNmLEtBQUssR0FBRztnQkFDTixPQUFPLGdGQUFnRixDQUFDO1lBQzFGLEtBQUssR0FBRztnQkFDTixPQUFPLGtFQUFrRSxDQUFDO1lBQzVFLEtBQUssR0FBRztnQkFDTixPQUFPLHVFQUF1RSxDQUFDO1lBQ2pGLEtBQUssR0FBRztnQkFDTixPQUFPLDREQUE0RCxDQUFDO1lBQ3RFLEtBQUssR0FBRztnQkFDTixPQUFPLHFFQUFxRSxDQUFDO1lBQy9FLEtBQUssR0FBRztnQkFDTixPQUFPLGtFQUFrRSxDQUFDO1lBQzVFLEtBQUssR0FBRyxDQUFDO1lBQ1QsS0FBSyxHQUFHLENBQUM7WUFDVCxLQUFLLEdBQUcsQ0FBQztZQUNULEtBQUssR0FBRztnQkFDTixPQUFPLDRFQUE0RSxDQUFDO1lBQ3RGO2dCQUNFLG9FQUFvRTtnQkFDcEUsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RSxPQUFPLHNCQUFzQixTQUFTLHdEQUF3RCxDQUFDO1FBQ25HLENBQUM7SUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHaXRIdWIgYXV0aGVudGljYXRpb24gbWFuYWdlciB1c2luZyBPQXV0aCBkZXZpY2UgZmxvd1xuICogSGFuZGxlcyBhdXRoZW50aWNhdGlvbiBmb3IgTUNQIHNlcnZlcnMgd2l0aG91dCByZXF1aXJpbmcgY2xpZW50IHNlY3JldHNcbiAqL1xuXG5pbXBvcnQgeyBUb2tlbk1hbmFnZXIgfSBmcm9tICcuLi9zZWN1cml0eS90b2tlbk1hbmFnZXIuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IEFQSUNhY2hlIH0gZnJvbSAnLi4vY2FjaGUvQVBJQ2FjaGUuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERldmljZUNvZGVSZXNwb25zZSB7XG4gIGRldmljZV9jb2RlOiBzdHJpbmc7XG4gIHVzZXJfY29kZTogc3RyaW5nO1xuICB2ZXJpZmljYXRpb25fdXJpOiBzdHJpbmc7XG4gIGV4cGlyZXNfaW46IG51bWJlcjtcbiAgaW50ZXJ2YWw6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb2tlblJlc3BvbnNlIHtcbiAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gIHRva2VuX3R5cGU6IHN0cmluZztcbiAgc2NvcGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXRoU3RhdHVzIHtcbiAgaXNBdXRoZW50aWNhdGVkOiBib29sZWFuO1xuICBoYXNUb2tlbjogYm9vbGVhbjtcbiAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gIHNjb3Blcz86IHN0cmluZ1tdO1xuICBleHBpcmVzQXQ/OiBEYXRlO1xufVxuXG4vKipcbiAqIE1hbmFnZXMgR2l0SHViIGF1dGhlbnRpY2F0aW9uIHVzaW5nIHRoZSBPQXV0aCBkZXZpY2UgZmxvd1xuICogVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgYXBwcm9hY2ggZm9yIENMSS9kZXNrdG9wIGFwcGxpY2F0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgR2l0SHViQXV0aE1hbmFnZXIge1xuICAvLyBHaXRIdWIgT0F1dGggQXBwIENsaWVudCBJRCBmb3IgRG9sbGhvdXNlTUNQXG4gIC8vIE11c3QgYmUgY29uZmlndXJlZCB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ0xJRU5UX0lEID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0dJVEhVQl9DTElFTlRfSUQ7XG4gIFxuICAvLyBHaXRIdWIgT0F1dGggZW5kcG9pbnRzXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFVklDRV9DT0RFX1VSTCA9ICdodHRwczovL2dpdGh1Yi5jb20vbG9naW4vZGV2aWNlL2NvZGUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUT0tFTl9VUkwgPSAnaHR0cHM6Ly9naXRodWIuY29tL2xvZ2luL29hdXRoL2FjY2Vzc190b2tlbic7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFVTRVJfVVJMID0gJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcic7XG4gIFxuICAvLyBQb2xsaW5nIGNvbmZpZ3VyYXRpb25cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9QT0xMX0lOVEVSVkFMID0gNTAwMDsgLy8gNSBzZWNvbmRzXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9QT0xMX0FUVEVNUFRTID0gMTgwOyAvLyAxNSBtaW51dGVzIHRvdGFsXG4gIFxuICBwcml2YXRlIGFwaUNhY2hlOiBBUElDYWNoZTtcbiAgcHJpdmF0ZSBhY3RpdmVQb2xsaW5nOiBBYm9ydENvbnRyb2xsZXIgfCBudWxsID0gbnVsbDtcbiAgXG4gIGNvbnN0cnVjdG9yKGFwaUNhY2hlOiBBUElDYWNoZSkge1xuICAgIHRoaXMuYXBpQ2FjaGUgPSBhcGlDYWNoZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBuZXR3b3JrIHJlcXVlc3Qgd2l0aCByZXRyeSBsb2dpY1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFdpdGhSZXRyeShcbiAgICB1cmw6IHN0cmluZywgXG4gICAgb3B0aW9uczogUmVxdWVzdEluaXQsIFxuICAgIG1heFJldHJpZXM6IG51bWJlciA9IDMsXG4gICAgcmV0cnlEZWxheTogbnVtYmVyID0gMTAwMFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCBudWxsID0gbnVsbDtcbiAgICBcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBtYXhSZXRyaWVzOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3IgYXMgRXJyb3I7XG4gICAgICAgIFxuICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGEgbmV0d29yayBlcnJvciB0aGF0IHNob3VsZCBiZSByZXRyaWVkXG4gICAgICAgIGNvbnN0IGlzTmV0d29ya0Vycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAoXG4gICAgICAgICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnRUNPTk5SRUZVU0VEJykgfHxcbiAgICAgICAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdFVElNRURPVVQnKSB8fFxuICAgICAgICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0VOT1RGT1VORCcpIHx8XG4gICAgICAgICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbmV0d29yaycpXG4gICAgICAgICk7XG4gICAgICAgIFxuICAgICAgICBpZiAoaXNOZXR3b3JrRXJyb3IgJiYgYXR0ZW1wdCA8IG1heFJldHJpZXMpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYE5ldHdvcmsgcmVxdWVzdCBmYWlsZWQsIHJldHJ5aW5nICgke2F0dGVtcHR9LyR7bWF4UmV0cmllc30pYCwge1xuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICBuZXh0UmV0cnlJbjogcmV0cnlEZWxheSAqIGF0dGVtcHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBFeHBvbmVudGlhbCBiYWNrb2ZmXG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHJldHJ5RGVsYXkgKiBhdHRlbXB0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm90IGEgbmV0d29yayBlcnJvciBvciBsYXN0IGF0dGVtcHQsIHRocm93IGltbWVkaWF0ZWx5XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhyb3cgbGFzdEVycm9yIHx8IG5ldyBFcnJvcignTmV0d29yayByZXF1ZXN0IGZhaWxlZCBhZnRlciBhbGwgcmV0cmllcycpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgY3VycmVudCBhdXRoZW50aWNhdGlvbiBzdGF0dXNcbiAgICovXG4gIGFzeW5jIGdldEF1dGhTdGF0dXMoKTogUHJvbWlzZTxBdXRoU3RhdHVzPiB7XG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCBUb2tlbk1hbmFnZXIuZ2V0R2l0SHViVG9rZW5Bc3luYygpO1xuICAgIFxuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzQXV0aGVudGljYXRlZDogZmFsc2UsXG4gICAgICAgIGhhc1Rva2VuOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyeSB0byBnZXQgdXNlciBpbmZvIHRvIHZhbGlkYXRlIHRva2VuXG4gICAgICBjb25zdCB1c2VySW5mbyA9IGF3YWl0IHRoaXMuZmV0Y2hVc2VySW5mbyh0b2tlbik7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzQXV0aGVudGljYXRlZDogdHJ1ZSxcbiAgICAgICAgaGFzVG9rZW46IHRydWUsXG4gICAgICAgIHVzZXJuYW1lOiB1c2VySW5mby5sb2dpbixcbiAgICAgICAgc2NvcGVzOiB1c2VySW5mby5zY29wZXNcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFRva2VuIG1pZ2h0IGJlIGludmFsaWQgb3IgZXhwaXJlZFxuICAgICAgbG9nZ2VyLmRlYnVnKCdUb2tlbiB2YWxpZGF0aW9uIGZhaWxlZCcsIHsgZXJyb3IgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlLFxuICAgICAgICBoYXNUb2tlbjogdHJ1ZSAvLyBIYXMgdG9rZW4gYnV0IGl0J3MgaW52YWxpZFxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBJbml0aWF0ZSB0aGUgZGV2aWNlIGZsb3cgYXV0aGVudGljYXRpb24gcHJvY2Vzc1xuICAgKi9cbiAgYXN5bmMgaW5pdGlhdGVEZXZpY2VGbG93KCk6IFByb21pc2U8RGV2aWNlQ29kZVJlc3BvbnNlPiB7XG4gICAgaWYgKCFHaXRIdWJBdXRoTWFuYWdlci5DTElFTlRfSUQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0dpdEh1YiBPQXV0aCBpcyBub3QgY29uZmlndXJlZC4gUGxlYXNlIHNldCBET0xMSE9VU0VfR0lUSFVCX0NMSUVOVF9JRCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gJyArXG4gICAgICAgICdGb3Igc2V0dXAgaW5zdHJ1Y3Rpb25zLCB2aXNpdDogaHR0cHM6Ly9naXRodWIuY29tL0RvbGxob3VzZU1DUC9tY3Atc2VydmVyI2dpdGh1Yi1hdXRoZW50aWNhdGlvbidcbiAgICAgICk7XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2hXaXRoUmV0cnkoR2l0SHViQXV0aE1hbmFnZXIuREVWSUNFX0NPREVfVVJMLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBjbGllbnRfaWQ6IEdpdEh1YkF1dGhNYW5hZ2VyLkNMSUVOVF9JRCxcbiAgICAgICAgICBzY29wZTogJ3B1YmxpY19yZXBvIHJlYWQ6dXNlcidcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIC8vIFByb3ZpZGUgdXNlci1mcmllbmRseSBlcnJvciBtZXNzYWdlcyBiYXNlZCBvbiBzdGF0dXMgY29kZXNcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gdGhpcy5nZXRFcnJvck1lc3NhZ2VGb3JTdGF0dXMocmVzcG9uc2Uuc3RhdHVzLCAnZGV2aWNlIGZsb3cgaW5pdGlhbGl6YXRpb24nKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdEZXZpY2UgZmxvdyBpbml0aWF0aW9uIGZhaWxlZCcsIHsgXG4gICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIFxuICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQgXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgcmVzcG9uc2VcbiAgICAgIGlmICghZGF0YS5kZXZpY2VfY29kZSB8fCAhZGF0YS51c2VyX2NvZGUgfHwgIWRhdGEudmVyaWZpY2F0aW9uX3VyaSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGV2aWNlIGZsb3cgcmVzcG9uc2UgZnJvbSBHaXRIdWInKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBhdWRpdCB0cmFpbFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdHaXRIdWJBdXRoTWFuYWdlci5pbml0aWF0ZURldmljZUZsb3cnLFxuICAgICAgICBkZXRhaWxzOiAnR2l0SHViIE9BdXRoIGRldmljZSBmbG93IGluaXRpYXRlZCcsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgdXNlckNvZGU6IGRhdGEudXNlcl9jb2RlLFxuICAgICAgICAgIGV4cGlyZXNJbjogZGF0YS5leHBpcmVzX2luLFxuICAgICAgICAgIGludGVydmFsOiBkYXRhLmludGVydmFsXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4gZGF0YSBhcyBEZXZpY2VDb2RlUmVzcG9uc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGluaXRpYXRlIGRldmljZSBmbG93JywgeyBlcnJvciB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHN0YXJ0IEdpdEh1YiBhdXRoZW50aWNhdGlvbi4gUGxlYXNlIGNoZWNrIHlvdXIgaW50ZXJuZXQgY29ubmVjdGlvbi4nKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQb2xsIGZvciB0b2tlbiBhZnRlciB1c2VyIGhhcyBhdXRob3JpemVkIHRoZSBkZXZpY2VcbiAgICovXG4gIGFzeW5jIHBvbGxGb3JUb2tlbihkZXZpY2VDb2RlOiBzdHJpbmcsIGludGVydmFsOiBudW1iZXIgPSBHaXRIdWJBdXRoTWFuYWdlci5ERUZBVUxUX1BPTExfSU5URVJWQUwpOiBQcm9taXNlPFRva2VuUmVzcG9uc2U+IHtcbiAgICAvLyBDcmVhdGUgbmV3IGFib3J0IGNvbnRyb2xsZXIgZm9yIHRoaXMgcG9sbGluZyBzZXNzaW9uXG4gICAgdGhpcy5hY3RpdmVQb2xsaW5nID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuYWN0aXZlUG9sbGluZy5zaWduYWw7XG4gICAgXG4gICAgbGV0IGF0dGVtcHRzID0gMDtcbiAgICBcbiAgICB0cnkge1xuICAgICAgd2hpbGUgKGF0dGVtcHRzIDwgR2l0SHViQXV0aE1hbmFnZXIuTUFYX1BPTExfQVRURU1QVFMpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgcG9sbGluZyB3YXMgYWJvcnRlZFxuICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGhlbnRpY2F0aW9uIHBvbGxpbmcgd2FzIGNhbmNlbGxlZCcpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBhdHRlbXB0cysrO1xuICAgICAgICBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChHaXRIdWJBdXRoTWFuYWdlci5UT0tFTl9VUkwsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgY2xpZW50X2lkOiBHaXRIdWJBdXRoTWFuYWdlci5DTElFTlRfSUQsXG4gICAgICAgICAgICBkZXZpY2VfY29kZTogZGV2aWNlQ29kZSxcbiAgICAgICAgICAgIGdyYW50X3R5cGU6ICd1cm46aWV0ZjpwYXJhbXM6b2F1dGg6Z3JhbnQtdHlwZTpkZXZpY2VfY29kZSdcbiAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBDaGVjayBmb3IgdmFyaW91cyByZXNwb25zZSBzdGF0ZXNcbiAgICAgICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgICAgICBzd2l0Y2ggKGRhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgIGNhc2UgJ2F1dGhvcml6YXRpb25fcGVuZGluZyc6XG4gICAgICAgICAgICAgIC8vIFVzZXIgaGFzbid0IGF1dGhvcml6ZWQgeWV0LCBrZWVwIHBvbGxpbmdcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FzZSAnc2xvd19kb3duJzpcbiAgICAgICAgICAgICAgLy8gSW5jcmVhc2UgcG9sbGluZyBpbnRlcnZhbFxuICAgICAgICAgICAgICBpbnRlcnZhbCA9IE1hdGgubWluKGludGVydmFsICogMS41LCAzMDAwMCk7IC8vIE1heCAzMCBzZWNvbmRzXG4gICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU2xvd2luZyBkb3duIHBvbGxpbmcgaW50ZXJ2YWwnLCB7IG5ld0ludGVydmFsOiBpbnRlcnZhbCB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FzZSAnZXhwaXJlZF90b2tlbic6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGF1dGhvcml6YXRpb24gY29kZSBoYXMgZXhwaXJlZC4gUGxlYXNlIHN0YXJ0IG92ZXIuJyk7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FzZSAnYWNjZXNzX2RlbmllZCc6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXV0aG9yaXphdGlvbiB3YXMgZGVuaWVkLiBQbGVhc2UgdHJ5IGFnYWluLicpO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIC8vIExvZyB0aGUgYWN0dWFsIGVycm9yIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdPQXV0aCBkZXZpY2UgZmxvdyBlcnJvcicsIHsgXG4gICAgICAgICAgICAgICAgZXJyb3I6IGRhdGEuZXJyb3IsIFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkYXRhLmVycm9yX2Rlc2NyaXB0aW9uIFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoZW50aWNhdGlvbiBmYWlsZWQuIFBsZWFzZSB0cnkgc3RhcnRpbmcgdGhlIHByb2Nlc3MgYWdhaW4uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuYWNjZXNzX3Rva2VuKSB7XG4gICAgICAgICAgLy8gU3VjY2VzcyFcbiAgICAgICAgICByZXR1cm4gZGF0YSBhcyBUb2tlblJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBXYWl0IGJlZm9yZSBuZXh0IHBvbGxcbiAgICAgICAgLy8gV2FpdCBmb3IgaW50ZXJ2YWwgd2l0aCBhYm9ydCBzdXBwb3J0XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdFdpdGhBYm9ydChpbnRlcnZhbCwgc2lnbmFsKTtcbiAgICAgICAgXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBOZXR3b3JrIGVycm9ycyBzaG91bGRuJ3Qgc3RvcCBwb2xsaW5nXG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnUG9sbCBhdHRlbXB0IGZhaWxlZCcsIHsgYXR0ZW1wdDogYXR0ZW1wdHMsIGVycm9yIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRXaXRoQWJvcnQoaW50ZXJ2YWwsIHNpZ25hbCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHRocm93IG5ldyBFcnJvcignQXV0aGVudGljYXRpb24gdGltZWQgb3V0LiBQbGVhc2UgdHJ5IGFnYWluLicpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBDbGVhciBhY3RpdmUgcG9sbGluZyByZWZlcmVuY2VcbiAgICAgIHRoaXMuYWN0aXZlUG9sbGluZyA9IG51bGw7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ29tcGxldGUgdGhlIGF1dGhlbnRpY2F0aW9uIGZsb3cgYW5kIHN0b3JlIHRoZSB0b2tlblxuICAgKi9cbiAgYXN5bmMgY29tcGxldGVBdXRoZW50aWNhdGlvbih0b2tlblJlc3BvbnNlOiBUb2tlblJlc3BvbnNlKTogUHJvbWlzZTxBdXRoU3RhdHVzPiB7XG4gICAgLy8gU3RvcmUgdG9rZW4gc2VjdXJlbHlcbiAgICBhd2FpdCB0aGlzLnN0b3JlVG9rZW4odG9rZW5SZXNwb25zZS5hY2Nlc3NfdG9rZW4pO1xuICAgIFxuICAgIC8vIEdldCB1c2VyIGluZm9cbiAgICBjb25zdCB1c2VySW5mbyA9IGF3YWl0IHRoaXMuZmV0Y2hVc2VySW5mbyh0b2tlblJlc3BvbnNlLmFjY2Vzc190b2tlbik7XG4gICAgXG4gICAgLy8gTG9nIHN1Y2Nlc3NmdWwgYXV0aGVudGljYXRpb24gY29tcGxldGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnR2l0SHViQXV0aE1hbmFnZXIuY29tcGxldGVBdXRoZW50aWNhdGlvbicsXG4gICAgICBkZXRhaWxzOiAnR2l0SHViIE9BdXRoIGRldmljZSBmbG93IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgdXNlcm5hbWU6IHVzZXJJbmZvLmxvZ2luLFxuICAgICAgICBzY29wZXM6IHRva2VuUmVzcG9uc2Uuc2NvcGUuc3BsaXQoJyAnKSxcbiAgICAgICAgdG9rZW5UeXBlOiBUb2tlbk1hbmFnZXIuZ2V0VG9rZW5UeXBlKHRva2VuUmVzcG9uc2UuYWNjZXNzX3Rva2VuKVxuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBpc0F1dGhlbnRpY2F0ZWQ6IHRydWUsXG4gICAgICBoYXNUb2tlbjogdHJ1ZSxcbiAgICAgIHVzZXJuYW1lOiB1c2VySW5mby5sb2dpbixcbiAgICAgIHNjb3BlczogdG9rZW5SZXNwb25zZS5zY29wZS5zcGxpdCgnICcpXG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENsZWFyIHN0b3JlZCBhdXRoZW50aWNhdGlvbiBhbmQgcmV2b2tlIHRva2VuXG4gICAqL1xuICBhc3luYyBjbGVhckF1dGhlbnRpY2F0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgdGhlIHRva2VuIGJlZm9yZSBjbGVhcmluZyBpdFxuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBUb2tlbk1hbmFnZXIuZ2V0R2l0SHViVG9rZW5Bc3luYygpO1xuICAgICAgXG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgLy8gQXR0ZW1wdCB0byByZXZva2UgdGhlIHRva2VuIG9uIEdpdEh1YlxuICAgICAgICAvLyBOb3RlOiBHaXRIdWIgT0F1dGggdG9rZW5zIGRvbid0IGhhdmUgYSByZXZvY2F0aW9uIGVuZHBvaW50IGZvciBkZXZpY2UgZmxvdyB0b2tlbnNcbiAgICAgICAgLy8gQnV0IHdlJ2xsIGNsZWFyIHRoZSBjYWNoZSBhbmQgcmVtb3ZlIGZyb20gc3RvcmFnZVxuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgY2FjaGVkIHVzZXIgaW5mb1xuICAgICAgICB0aGlzLmFwaUNhY2hlLmNsZWFyKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIGF1ZGl0IHRyYWlsXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fQ0FDSEVfQ0xFQVJFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ0dpdEh1YkF1dGhNYW5hZ2VyLmNsZWFyQXV0aGVudGljYXRpb24nLFxuICAgICAgICAgIGRldGFpbHM6ICdHaXRIdWIgYXV0aGVudGljYXRpb24gY2xlYXJlZCBieSB1c2VyIHJlcXVlc3QnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBoYWRUb2tlbjogdHJ1ZSxcbiAgICAgICAgICAgIHRva2VuUHJlZml4OiBUb2tlbk1hbmFnZXIuZ2V0VG9rZW5QcmVmaXgodG9rZW4pXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUmVtb3ZlIGZyb20gc2VjdXJlIHN0b3JhZ2VcbiAgICAgIGF3YWl0IFRva2VuTWFuYWdlci5yZW1vdmVTdG9yZWRUb2tlbigpO1xuICAgICAgXG4gICAgICBsb2dnZXIuaW5mbygnR2l0SHViIGF1dGhlbnRpY2F0aW9uIGNsZWFyZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgY2xlYXJpbmcgYXV0aGVudGljYXRpb24nLCB7IGVycm9yIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY2xlYXIgYXV0aGVudGljYXRpb24nKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTdG9yZSB0b2tlbiBzZWN1cmVseSB1c2luZyBlbmNyeXB0ZWQgZmlsZSBzdG9yYWdlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHN0b3JlVG9rZW4odG9rZW46IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBUb2tlbk1hbmFnZXIuc3RvcmVHaXRIdWJUb2tlbih0b2tlbik7XG4gICAgICBsb2dnZXIuaW5mbygnR2l0SHViIHRva2VuIHN0b3JlZCBzZWN1cmVseS4gWW91IGFyZSBub3cgYXV0aGVudGljYXRlZCEnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gc3RvcmUgdG9rZW4gc2VjdXJlbHknLCB7IGVycm9yIH0pO1xuICAgICAgLy8gRmFsbGJhY2sgdG8gZW52aXJvbm1lbnQgdmFyaWFibGUgaW5zdHJ1Y3Rpb25zXG4gICAgICBsb2dnZXIuaW5mbygnRm9yIG1hbnVhbCBzZXR1cCwgeW91IGNhbiBzZXQgR0lUSFVCX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlLicpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogRmV0Y2ggdXNlciBpbmZvcm1hdGlvbiBmcm9tIEdpdEh1YlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFVzZXJJbmZvKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIENoZWNrIGNhY2hlIGZpcnN0XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5hcGlDYWNoZS5nZXQoR2l0SHViQXV0aE1hbmFnZXIuVVNFUl9VUkwpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaFdpdGhSZXRyeShHaXRIdWJBdXRoTWFuYWdlci5VU0VSX1VSTCwge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvbidcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSB0aGlzLmdldEVycm9yTWVzc2FnZUZvclN0YXR1cyhyZXNwb25zZS5zdGF0dXMsICd1c2VyIGluZm9ybWF0aW9uIGZldGNoJyk7XG4gICAgICBsb2dnZXIuZGVidWcoJ0ZhaWxlZCB0byBmZXRjaCB1c2VyIGluZm8nLCB7IHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgXG4gICAgLy8gTm9ybWFsaXplIHVzZXJuYW1lIGFuZCBvdGhlciB0ZXh0IGZpZWxkcyB0byBwcmV2ZW50IFVuaWNvZGUgYXR0YWNrc1xuICAgIGlmIChkYXRhLmxvZ2luKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoZGF0YS5sb2dpbik7XG4gICAgICBpZiAoIXZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1VOSUNPREVfVkFMSURBVElPTl9FUlJPUicsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ0dpdEh1YkF1dGhNYW5hZ2VyLmZldGNoVXNlckluZm8nLFxuICAgICAgICAgIGRldGFpbHM6ICdHaXRIdWIgdXNlcm5hbWUgY29udGFpbnMgaW52YWxpZCBVbmljb2RlJyxcbiAgICAgICAgICBtZXRhZGF0YTogeyBcbiAgICAgICAgICAgIG9yaWdpbmFsTGVuZ3RoOiBkYXRhLmxvZ2luLmxlbmd0aCxcbiAgICAgICAgICAgIGRldGVjdGVkSXNzdWVzOiB2YWxpZGF0aW9uLmRldGVjdGVkSXNzdWVzIFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VybmFtZSBmb3JtYXQgZnJvbSBHaXRIdWInKTtcbiAgICAgIH1cbiAgICAgIGRhdGEubG9naW4gPSB2YWxpZGF0aW9uLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIH1cbiAgICBcbiAgICAvLyBOb3JtYWxpemUgZGlzcGxheSBuYW1lIGlmIHByZXNlbnRcbiAgICBpZiAoZGF0YS5uYW1lKSB7XG4gICAgICBjb25zdCBuYW1lVmFsaWRhdGlvbiA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGRhdGEubmFtZSk7XG4gICAgICBpZiAobmFtZVZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgICBkYXRhLm5hbWUgPSBuYW1lVmFsaWRhdGlvbi5ub3JtYWxpemVkQ29udGVudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERvbid0IGZhaWwgb24gZGlzcGxheSBuYW1lLCBqdXN0IHJlbW92ZSBpdFxuICAgICAgICBkZWxldGUgZGF0YS5uYW1lO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgc2NvcGVzIGZyb20gcmVzcG9uc2UgaGVhZGVyc1xuICAgIGNvbnN0IHNjb3BlSGVhZGVyID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ3gtb2F1dGgtc2NvcGVzJyk7XG4gICAgaWYgKHNjb3BlSGVhZGVyKSB7XG4gICAgICBkYXRhLnNjb3BlcyA9IHNjb3BlSGVhZGVyLnNwbGl0KCcsJykubWFwKHMgPT4gcy50cmltKCkpO1xuICAgIH1cbiAgICBcbiAgICAvLyBMb2cgc3VjY2Vzc2Z1bCBhdXRoZW50aWNhdGlvbiBmb3IgYXVkaXQgdHJhaWxcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0dpdEh1YkF1dGhNYW5hZ2VyLmZldGNoVXNlckluZm8nLFxuICAgICAgZGV0YWlsczogJ0dpdEh1YiB1c2VyIGF1dGhlbnRpY2F0ZWQgc3VjY2Vzc2Z1bGx5JyxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHVzZXJuYW1lOiBkYXRhLmxvZ2luLFxuICAgICAgICBoYXNFbWFpbDogISFkYXRhLmVtYWlsLFxuICAgICAgICBzY29wZXM6IGRhdGEuc2NvcGVzIHx8IFtdXG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgIHRoaXMuYXBpQ2FjaGUuc2V0KEdpdEh1YkF1dGhNYW5hZ2VyLlVTRVJfVVJMLCBkYXRhKTtcbiAgICBcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEZvcm1hdCBhdXRoZW50aWNhdGlvbiBpbnN0cnVjdGlvbnMgZm9yIHVzZXJzXG4gICAqL1xuICBmb3JtYXRBdXRoSW5zdHJ1Y3Rpb25zKGRldmljZVJlc3BvbnNlOiBEZXZpY2VDb2RlUmVzcG9uc2UpOiBzdHJpbmcge1xuICAgIHJldHVybiBg8J+UkCAqKkdpdEh1YiBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCoqXG5cblRvIGFjY2VzcyBhbGwgRG9sbGhvdXNlTUNQIGZlYXR1cmVzLCBwbGVhc2UgYXV0aGVudGljYXRlIHdpdGggR2l0SHViOlxuXG4xLiBWaXNpdDogKioke2RldmljZVJlc3BvbnNlLnZlcmlmaWNhdGlvbl91cml9KipcbjIuIEVudGVyIGNvZGU6ICoqJHtkZXZpY2VSZXNwb25zZS51c2VyX2NvZGV9KipcbjMuIEF1dGhvcml6ZSAnRG9sbGhvdXNlTUNQIENvbGxlY3Rpb24nXG5cblRoaXMgd2lsbCBncmFudCBhY2Nlc3MgdG86XG7inIUgQnJvd3NlIHRoZSBwdWJsaWMgY29sbGVjdGlvblxu4pyFIEluc3RhbGwgY29tbXVuaXR5IGNvbnRlbnQgIFxu4pyFIFN1Ym1pdCB5b3VyIG93biBjcmVhdGlvbnNcblxuRG9uJ3QgaGF2ZSBhIEdpdEh1YiBhY2NvdW50PyBZb3UnbGwgYmUgcHJvbXB0ZWQgdG8gY3JlYXRlIG9uZSAoaXQncyBmcmVlISlcblxu4o+x77iPIFRoaXMgY29kZSBleHBpcmVzIGluICR7TWF0aC5mbG9vcihkZXZpY2VSZXNwb25zZS5leHBpcmVzX2luIC8gNjApfSBtaW51dGVzLmA7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiB1c2VyIG5lZWRzIHRvIGF1dGhlbnRpY2F0ZSBmb3IgYSBzcGVjaWZpYyBhY3Rpb25cbiAgICovXG4gIG5lZWRzQXV0aEZvckFjdGlvbihhY3Rpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGF1dGhSZXF1aXJlZEFjdGlvbnMgPSBbJ3N1Ym1pdCcsICdjcmVhdGVfcHInLCAnbWFuYWdlX2NvbnRlbnQnXTtcbiAgICByZXR1cm4gYXV0aFJlcXVpcmVkQWN0aW9ucy5pbmNsdWRlcyhhY3Rpb24udG9Mb3dlckNhc2UoKSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBXYWl0IHdpdGggYWJvcnQgc2lnbmFsIHN1cHBvcnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdFdpdGhBYm9ydChtczogbnVtYmVyLCBzaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTtcbiAgICAgIFxuICAgICAgLy8gTGlzdGVuIGZvciBhYm9ydCBzaWduYWxcbiAgICAgIGNvbnN0IGFib3J0SGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdXYWl0IGFib3J0ZWQnKSk7XG4gICAgICB9O1xuICAgICAgXG4gICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydEhhbmRsZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgIFxuICAgICAgLy8gQ2xlYW4gdXAgYWZ0ZXIgdGltZW91dFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0SGFuZGxlcik7XG4gICAgICB9LCBtcyk7XG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDbGVhbiB1cCBhbnkgYWN0aXZlIG9wZXJhdGlvbnMgKGNhbGxlZCBvbiBzZXJ2ZXIgc2h1dGRvd24pXG4gICAqL1xuICBhc3luYyBjbGVhbnVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEFib3J0IGFueSBhY3RpdmUgcG9sbGluZ1xuICAgIGlmICh0aGlzLmFjdGl2ZVBvbGxpbmcpIHtcbiAgICAgIHRoaXMuYWN0aXZlUG9sbGluZy5hYm9ydCgpO1xuICAgICAgdGhpcy5hY3RpdmVQb2xsaW5nID0gbnVsbDtcbiAgICAgIFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fQ0FDSEVfQ0xFQVJFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnR2l0SHViQXV0aE1hbmFnZXIuY2xlYW51cCcsXG4gICAgICAgIGRldGFpbHM6ICdHaXRIdWIgYXV0aCBtYW5hZ2VyIGNsZWFuZWQgdXAgb24gc2h1dGRvd24nLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIGhhZEFjdGl2ZVBvbGxpbmc6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGxvZ2dlci5pbmZvKCdHaXRIdWIgYXV0aGVudGljYXRpb24gcG9sbGluZyBjYW5jZWxsZWQgZHVlIHRvIHNodXRkb3duJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIENsZWFyIEFQSSBjYWNoZVxuICAgIHRoaXMuYXBpQ2FjaGUuY2xlYXIoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB1c2VyLWZyaWVuZGx5IGVycm9yIG1lc3NhZ2UgYmFzZWQgb24gSFRUUCBzdGF0dXMgY29kZVxuICAgKiBBdm9pZHMgZXhwb3Npbmcgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIHdoaWxlIHByb3ZpZGluZyBoZWxwZnVsIGd1aWRhbmNlXG4gICAqL1xuICBwcml2YXRlIGdldEVycm9yTWVzc2FnZUZvclN0YXR1cyhzdGF0dXM6IG51bWJlciwgb3BlcmF0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICBjYXNlIDQwMDpcbiAgICAgICAgcmV0dXJuIGBJbnZhbGlkIHJlcXVlc3QgdG8gR2l0SHViLiBQbGVhc2UgZW5zdXJlIHRoZSBPQXV0aCBhcHAgaXMgcHJvcGVybHkgY29uZmlndXJlZC5gO1xuICAgICAgY2FzZSA0MDE6XG4gICAgICAgIHJldHVybiBgQXV0aGVudGljYXRpb24gZmFpbGVkLiBUaGUgT0F1dGggYXBwIGNyZWRlbnRpYWxzIG1heSBiZSBpbnZhbGlkLmA7XG4gICAgICBjYXNlIDQwMzpcbiAgICAgICAgcmV0dXJuIGBBY2Nlc3MgZGVuaWVkIGJ5IEdpdEh1Yi4gVGhlIE9BdXRoIGFwcCBtYXkgbGFjayByZXF1aXJlZCBwZXJtaXNzaW9ucy5gO1xuICAgICAgY2FzZSA0MDQ6XG4gICAgICAgIHJldHVybiBgR2l0SHViIHNlcnZpY2Ugbm90IGZvdW5kLiBUaGlzIG1heSBpbmRpY2F0ZSBhbiBBUEkgY2hhbmdlLmA7XG4gICAgICBjYXNlIDQyMjpcbiAgICAgICAgcmV0dXJuIGBJbnZhbGlkIHBhcmFtZXRlcnMgc2VudCB0byBHaXRIdWIuIFBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24uYDtcbiAgICAgIGNhc2UgNDI5OlxuICAgICAgICByZXR1cm4gYFRvbyBtYW55IHJlcXVlc3RzIHRvIEdpdEh1Yi4gUGxlYXNlIHdhaXQgYSBtb21lbnQgYW5kIHRyeSBhZ2Fpbi5gO1xuICAgICAgY2FzZSA1MDA6XG4gICAgICBjYXNlIDUwMjpcbiAgICAgIGNhc2UgNTAzOlxuICAgICAgY2FzZSA1MDQ6XG4gICAgICAgIHJldHVybiBgR2l0SHViIHNlcnZpY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUuIFBsZWFzZSB0cnkgYWdhaW4gaW4gYSBmZXcgbW9tZW50cy5gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gTG9nIHRoZSBhY3R1YWwgc3RhdHVzIGZvciBkZWJ1Z2dpbmcsIGJ1dCBkb24ndCBleHBvc2UgaXQgdG8gdXNlcnNcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBVbmV4cGVjdGVkIHN0YXR1cyBjb2RlIGR1cmluZyAke29wZXJhdGlvbn1gLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgcmV0dXJuIGBGYWlsZWQgdG8gY29tcGxldGUgJHtvcGVyYXRpb259LiBQbGVhc2UgY2hlY2sgeW91ciBpbnRlcm5ldCBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uYDtcbiAgICB9XG4gIH1cbn0iXX0=
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Persistent cache for collection data to support offline/anonymous browsing
3
+ */
4
+ export interface CollectionItem {
5
+ name: string;
6
+ path: string;
7
+ sha: string;
8
+ content?: string;
9
+ last_modified?: string;
10
+ }
11
+ export interface CollectionCacheEntry {
12
+ items: CollectionItem[];
13
+ timestamp: number;
14
+ etag?: string;
15
+ }
16
+ /**
17
+ * Persistent cache for collection data that supports offline browsing
18
+ */
19
+ export declare class CollectionCache {
20
+ private cacheDir;
21
+ private cacheFile;
22
+ private readonly CACHE_TTL_MS;
23
+ constructor(baseDir?: string);
24
+ /**
25
+ * Initialize cache directory
26
+ */
27
+ private ensureCacheDir;
28
+ /**
29
+ * Load collection data from persistent cache
30
+ */
31
+ loadCache(): Promise<CollectionCacheEntry | null>;
32
+ /**
33
+ * Save collection data to persistent cache
34
+ */
35
+ saveCache(items: CollectionItem[], etag?: string): Promise<void>;
36
+ /**
37
+ * Search cached collection items with fuzzy matching
38
+ */
39
+ searchCache(query: string): Promise<CollectionItem[]>;
40
+ /**
41
+ * Normalize search terms for better matching (handles spaces, dashes, etc.)
42
+ */
43
+ private normalizeSearchTerm;
44
+ /**
45
+ * Get cached collection items by type/path
46
+ */
47
+ getItemsByPath(pathPrefix: string): Promise<CollectionItem[]>;
48
+ /**
49
+ * Check if cache exists and is valid
50
+ */
51
+ isCacheValid(): Promise<boolean>;
52
+ /**
53
+ * Clear the cache
54
+ */
55
+ clearCache(): Promise<void>;
56
+ /**
57
+ * Get cache stats for debugging
58
+ */
59
+ getCacheStats(): Promise<{
60
+ itemCount: number;
61
+ cacheAge: number;
62
+ isValid: boolean;
63
+ }>;
64
+ }
65
+ //# sourceMappingURL=CollectionCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollectionCache.d.ts","sourceRoot":"","sources":["../../src/cache/CollectionCache.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuB;gBAExC,OAAO,GAAE,MAAsB;IAK3C;;OAEG;YACW,cAAc;IAS5B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAkCvD;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BtE;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAkB3D;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IASnE;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAKtC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAWjC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CAY1F"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Persistent cache for collection data to support offline/anonymous browsing
3
+ */
4
+ import * as fs from 'fs/promises';
5
+ import * as path from 'path';
6
+ import { logger } from '../utils/logger.js';
7
+ import { SecurityMonitor } from '../security/securityMonitor.js';
8
+ /**
9
+ * Persistent cache for collection data that supports offline browsing
10
+ */
11
+ export class CollectionCache {
12
+ cacheDir;
13
+ cacheFile;
14
+ CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours for collection cache
15
+ constructor(baseDir = process.cwd()) {
16
+ this.cacheDir = path.join(baseDir, '.dollhousemcp', 'cache');
17
+ this.cacheFile = path.join(this.cacheDir, 'collection-cache.json');
18
+ }
19
+ /**
20
+ * Initialize cache directory
21
+ */
22
+ async ensureCacheDir() {
23
+ try {
24
+ await fs.mkdir(this.cacheDir, { recursive: true });
25
+ }
26
+ catch (error) {
27
+ logger.error(`Failed to create cache directory: ${error}`);
28
+ throw error;
29
+ }
30
+ }
31
+ /**
32
+ * Load collection data from persistent cache
33
+ */
34
+ async loadCache() {
35
+ try {
36
+ // Validate cache file path (basic security check)
37
+ if (this.cacheFile.includes('..') || this.cacheFile.includes('\0')) {
38
+ // SECURITY FIX: Add audit logging for path traversal attempt detection
39
+ SecurityMonitor.logSecurityEvent({
40
+ type: 'PATH_TRAVERSAL_ATTEMPT',
41
+ severity: 'HIGH',
42
+ source: 'CollectionCache.loadCache',
43
+ details: `Potential path traversal attempt detected in cache file path: ${this.cacheFile.substring(0, 100)}`
44
+ });
45
+ logger.warn('Invalid cache file path, skipping cache load');
46
+ return null;
47
+ }
48
+ const data = await fs.readFile(this.cacheFile, 'utf8');
49
+ const cache = JSON.parse(data);
50
+ // Check if cache is expired
51
+ if (Date.now() - cache.timestamp > this.CACHE_TTL_MS) {
52
+ logger.debug('Collection cache expired, will refresh from GitHub');
53
+ return null;
54
+ }
55
+ logger.debug(`Loaded ${cache.items.length} items from collection cache`);
56
+ return cache;
57
+ }
58
+ catch (error) {
59
+ if (error.code !== 'ENOENT') {
60
+ logger.debug(`Failed to load collection cache: ${error}`);
61
+ }
62
+ return null;
63
+ }
64
+ }
65
+ /**
66
+ * Save collection data to persistent cache
67
+ */
68
+ async saveCache(items, etag) {
69
+ try {
70
+ await this.ensureCacheDir();
71
+ const cacheEntry = {
72
+ items,
73
+ timestamp: Date.now(),
74
+ etag
75
+ };
76
+ const data = JSON.stringify(cacheEntry, null, 2);
77
+ await fs.writeFile(this.cacheFile, data, 'utf8');
78
+ logger.debug(`Saved ${items.length} items to collection cache`);
79
+ // SECURITY FIX: Add audit logging for cache write operations
80
+ logger.debug('Security audit: Cache write operation completed successfully');
81
+ // Log operation completed successfully
82
+ logger.debug(`Cache file operation completed with ${items.length} items`);
83
+ }
84
+ catch (error) {
85
+ logger.error(`Failed to save collection cache: ${error}`);
86
+ // Don't throw - caching failures shouldn't break functionality
87
+ }
88
+ }
89
+ /**
90
+ * Search cached collection items with fuzzy matching
91
+ */
92
+ async searchCache(query) {
93
+ const cache = await this.loadCache();
94
+ if (!cache) {
95
+ return [];
96
+ }
97
+ const normalizedQuery = this.normalizeSearchTerm(query);
98
+ return cache.items.filter(item => {
99
+ // Search in filename and path with normalization
100
+ const normalizedName = this.normalizeSearchTerm(item.name);
101
+ const normalizedPath = this.normalizeSearchTerm(item.path);
102
+ return normalizedName.includes(normalizedQuery) ||
103
+ normalizedPath.includes(normalizedQuery) ||
104
+ (item.content && this.normalizeSearchTerm(item.content).includes(normalizedQuery));
105
+ });
106
+ }
107
+ /**
108
+ * Normalize search terms for better matching (handles spaces, dashes, etc.)
109
+ */
110
+ normalizeSearchTerm(term) {
111
+ return term.toLowerCase()
112
+ .replace(/[-_\s]+/g, ' ') // Convert dashes, underscores to spaces
113
+ .replace(/\.md$/, '') // Remove .md extension
114
+ .trim();
115
+ }
116
+ /**
117
+ * Get cached collection items by type/path
118
+ */
119
+ async getItemsByPath(pathPrefix) {
120
+ const cache = await this.loadCache();
121
+ if (!cache) {
122
+ return [];
123
+ }
124
+ return cache.items.filter(item => item.path.startsWith(pathPrefix));
125
+ }
126
+ /**
127
+ * Check if cache exists and is valid
128
+ */
129
+ async isCacheValid() {
130
+ const cache = await this.loadCache();
131
+ return cache !== null;
132
+ }
133
+ /**
134
+ * Clear the cache
135
+ */
136
+ async clearCache() {
137
+ try {
138
+ await fs.unlink(this.cacheFile);
139
+ logger.debug('Collection cache cleared');
140
+ }
141
+ catch (error) {
142
+ if (error.code !== 'ENOENT') {
143
+ logger.debug(`Failed to clear collection cache: ${error}`);
144
+ }
145
+ }
146
+ }
147
+ /**
148
+ * Get cache stats for debugging
149
+ */
150
+ async getCacheStats() {
151
+ const cache = await this.loadCache();
152
+ if (!cache) {
153
+ return { itemCount: 0, cacheAge: 0, isValid: false };
154
+ }
155
+ return {
156
+ itemCount: cache.items.length,
157
+ cacheAge: Date.now() - cache.timestamp,
158
+ isValid: Date.now() - cache.timestamp <= this.CACHE_TTL_MS
159
+ };
160
+ }
161
+ }
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sbGVjdGlvbkNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NhY2hlL0NvbGxlY3Rpb25DYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFnQmpFOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFDbEIsUUFBUSxDQUFTO0lBQ2pCLFNBQVMsQ0FBUztJQUNULFlBQVksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxnQ0FBZ0M7SUFFckYsWUFBWSxVQUFrQixPQUFPLENBQUMsR0FBRyxFQUFFO1FBQ3pDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLGNBQWM7UUFDMUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMscUNBQXFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDM0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FB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SSxJQUFJLENBQUMsWUFBWTtTQUMzRCxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQZXJzaXN0ZW50IGNhY2hlIGZvciBjb2xsZWN0aW9uIGRhdGEgdG8gc3VwcG9ydCBvZmZsaW5lL2Fub255bW91cyBicm93c2luZ1xuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgUGF0aFZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3BhdGhWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uSXRlbSB7XG4gIG5hbWU6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBzaGE6IHN0cmluZztcbiAgY29udGVudD86IHN0cmluZztcbiAgbGFzdF9tb2RpZmllZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uQ2FjaGVFbnRyeSB7XG4gIGl0ZW1zOiBDb2xsZWN0aW9uSXRlbVtdO1xuICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgZXRhZz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQZXJzaXN0ZW50IGNhY2hlIGZvciBjb2xsZWN0aW9uIGRhdGEgdGhhdCBzdXBwb3J0cyBvZmZsaW5lIGJyb3dzaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uQ2FjaGUge1xuICBwcml2YXRlIGNhY2hlRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgY2FjaGVGaWxlOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ0FDSEVfVFRMX01TID0gMjQgKiA2MCAqIDYwICogMTAwMDsgLy8gMjQgaG91cnMgZm9yIGNvbGxlY3Rpb24gY2FjaGVcbiAgXG4gIGNvbnN0cnVjdG9yKGJhc2VEaXI6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCkpIHtcbiAgICB0aGlzLmNhY2hlRGlyID0gcGF0aC5qb2luKGJhc2VEaXIsICcuZG9sbGhvdXNlbWNwJywgJ2NhY2hlJyk7XG4gICAgdGhpcy5jYWNoZUZpbGUgPSBwYXRoLmpvaW4odGhpcy5jYWNoZURpciwgJ2NvbGxlY3Rpb24tY2FjaGUuanNvbicpO1xuICB9XG4gIFxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBjYWNoZSBkaXJlY3RvcnlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlQ2FjaGVEaXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLm1rZGlyKHRoaXMuY2FjaGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgY2FjaGUgZGlyZWN0b3J5OiAke2Vycm9yfWApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogTG9hZCBjb2xsZWN0aW9uIGRhdGEgZnJvbSBwZXJzaXN0ZW50IGNhY2hlXG4gICAqL1xuICBhc3luYyBsb2FkQ2FjaGUoKTogUHJvbWlzZTxDb2xsZWN0aW9uQ2FjaGVFbnRyeSB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVmFsaWRhdGUgY2FjaGUgZmlsZSBwYXRoIChiYXNpYyBzZWN1cml0eSBjaGVjaylcbiAgICAgIGlmICh0aGlzLmNhY2hlRmlsZS5pbmNsdWRlcygnLi4nKSB8fCB0aGlzLmNhY2hlRmlsZS5pbmNsdWRlcygnXFwwJykpIHtcbiAgICAgICAgLy8gU0VDVVJJVFkgRklYOiBBZGQgYXVkaXQgbG9nZ2luZyBmb3IgcGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCBkZXRlY3Rpb25cbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ0NvbGxlY3Rpb25DYWNoZS5sb2FkQ2FjaGUnLFxuICAgICAgICAgIGRldGFpbHM6IGBQb3RlbnRpYWwgcGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCBkZXRlY3RlZCBpbiBjYWNoZSBmaWxlIHBhdGg6ICR7dGhpcy5jYWNoZUZpbGUuc3Vic3RyaW5nKDAsIDEwMCl9YFxuICAgICAgICB9KTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ludmFsaWQgY2FjaGUgZmlsZSBwYXRoLCBza2lwcGluZyBjYWNoZSBsb2FkJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgZnMucmVhZEZpbGUodGhpcy5jYWNoZUZpbGUsICd1dGY4Jyk7XG4gICAgICBjb25zdCBjYWNoZTogQ29sbGVjdGlvbkNhY2hlRW50cnkgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBpZiBjYWNoZSBpcyBleHBpcmVkXG4gICAgICBpZiAoRGF0ZS5ub3coKSAtIGNhY2hlLnRpbWVzdGFtcCA+IHRoaXMuQ0FDSEVfVFRMX01TKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnQ29sbGVjdGlvbiBjYWNoZSBleHBpcmVkLCB3aWxsIHJlZnJlc2ggZnJvbSBHaXRIdWInKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgTG9hZGVkICR7Y2FjaGUuaXRlbXMubGVuZ3RofSBpdGVtcyBmcm9tIGNvbGxlY3Rpb24gY2FjaGVgKTtcbiAgICAgIHJldHVybiBjYWNoZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIGxvYWQgY29sbGVjdGlvbiBjYWNoZTogJHtlcnJvcn1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFNhdmUgY29sbGVjdGlvbiBkYXRhIHRvIHBlcnNpc3RlbnQgY2FjaGVcbiAgICovXG4gIGFzeW5jIHNhdmVDYWNoZShpdGVtczogQ29sbGVjdGlvbkl0ZW1bXSwgZXRhZz86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUNhY2hlRGlyKCk7XG4gICAgICBcbiAgICAgIGNvbnN0IGNhY2hlRW50cnk6IENvbGxlY3Rpb25DYWNoZUVudHJ5ID0ge1xuICAgICAgICBpdGVtcyxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBldGFnXG4gICAgICB9O1xuICAgICAgXG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkoY2FjaGVFbnRyeSwgbnVsbCwgMik7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUodGhpcy5jYWNoZUZpbGUsIGRhdGEsICd1dGY4Jyk7XG4gICAgICBcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgU2F2ZWQgJHtpdGVtcy5sZW5ndGh9IGl0ZW1zIHRvIGNvbGxlY3Rpb24gY2FjaGVgKTtcbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFkgRklYOiBBZGQgYXVkaXQgbG9nZ2luZyBmb3IgY2FjaGUgd3JpdGUgb3BlcmF0aW9uc1xuICAgICAgbG9nZ2VyLmRlYnVnKCdTZWN1cml0eSBhdWRpdDogQ2FjaGUgd3JpdGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgIFxuICAgICAgLy8gTG9nIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICBsb2dnZXIuZGVidWcoYENhY2hlIGZpbGUgb3BlcmF0aW9uIGNvbXBsZXRlZCB3aXRoICR7aXRlbXMubGVuZ3RofSBpdGVtc2ApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBzYXZlIGNvbGxlY3Rpb24gY2FjaGU6ICR7ZXJyb3J9YCk7XG4gICAgICAvLyBEb24ndCB0aHJvdyAtIGNhY2hpbmcgZmFpbHVyZXMgc2hvdWxkbid0IGJyZWFrIGZ1bmN0aW9uYWxpdHlcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZWFyY2ggY2FjaGVkIGNvbGxlY3Rpb24gaXRlbXMgd2l0aCBmdXp6eSBtYXRjaGluZ1xuICAgKi9cbiAgYXN5bmMgc2VhcmNoQ2FjaGUocXVlcnk6IHN0cmluZyk6IFByb21pc2U8Q29sbGVjdGlvbkl0ZW1bXT4ge1xuICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgdGhpcy5sb2FkQ2FjaGUoKTtcbiAgICBpZiAoIWNhY2hlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IG5vcm1hbGl6ZWRRdWVyeSA9IHRoaXMubm9ybWFsaXplU2VhcmNoVGVybShxdWVyeSk7XG4gICAgcmV0dXJuIGNhY2hlLml0ZW1zLmZpbHRlcihpdGVtID0+IHtcbiAgICAgIC8vIFNlYXJjaCBpbiBmaWxlbmFtZSBhbmQgcGF0aCB3aXRoIG5vcm1hbGl6YXRpb25cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gdGhpcy5ub3JtYWxpemVTZWFyY2hUZXJtKGl0ZW0ubmFtZSk7XG4gICAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHRoaXMubm9ybWFsaXplU2VhcmNoVGVybShpdGVtLnBhdGgpO1xuICAgICAgXG4gICAgICByZXR1cm4gbm9ybWFsaXplZE5hbWUuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KSB8fCBcbiAgICAgICAgICAgICBub3JtYWxpemVkUGF0aC5pbmNsdWRlcyhub3JtYWxpemVkUXVlcnkpIHx8XG4gICAgICAgICAgICAgKGl0ZW0uY29udGVudCAmJiB0aGlzLm5vcm1hbGl6ZVNlYXJjaFRlcm0oaXRlbS5jb250ZW50KS5pbmNsdWRlcyhub3JtYWxpemVkUXVlcnkpKTtcbiAgICB9KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSBzZWFyY2ggdGVybXMgZm9yIGJldHRlciBtYXRjaGluZyAoaGFuZGxlcyBzcGFjZXMsIGRhc2hlcywgZXRjLilcbiAgICovXG4gIHByaXZhdGUgbm9ybWFsaXplU2VhcmNoVGVybSh0ZXJtOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0ZXJtLnRvTG93ZXJDYXNlKClcbiAgICAgIC5yZXBsYWNlKC9bLV9cXHNdKy9nLCAnICcpICAvLyBDb252ZXJ0IGRhc2hlcywgdW5kZXJzY29yZXMgdG8gc3BhY2VzXG4gICAgICAucmVwbGFjZSgvXFwubWQkLywgJycpICAgICAgIC8vIFJlbW92ZSAubWQgZXh0ZW5zaW9uXG4gICAgICAudHJpbSgpO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGNhY2hlZCBjb2xsZWN0aW9uIGl0ZW1zIGJ5IHR5cGUvcGF0aFxuICAgKi9cbiAgYXN5bmMgZ2V0SXRlbXNCeVBhdGgocGF0aFByZWZpeDogc3RyaW5nKTogUHJvbWlzZTxDb2xsZWN0aW9uSXRlbVtdPiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCB0aGlzLmxvYWRDYWNoZSgpO1xuICAgIGlmICghY2FjaGUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGNhY2hlLml0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0ucGF0aC5zdGFydHNXaXRoKHBhdGhQcmVmaXgpKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGlmIGNhY2hlIGV4aXN0cyBhbmQgaXMgdmFsaWRcbiAgICovXG4gIGFzeW5jIGlzQ2FjaGVWYWxpZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjYWNoZSA9IGF3YWl0IHRoaXMubG9hZENhY2hlKCk7XG4gICAgcmV0dXJuIGNhY2hlICE9PSBudWxsO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2xlYXIgdGhlIGNhY2hlXG4gICAqL1xuICBhc3luYyBjbGVhckNhY2hlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy51bmxpbmsodGhpcy5jYWNoZUZpbGUpO1xuICAgICAgbG9nZ2VyLmRlYnVnKCdDb2xsZWN0aW9uIGNhY2hlIGNsZWFyZWQnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIGNsZWFyIGNvbGxlY3Rpb24gY2FjaGU6ICR7ZXJyb3J9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGNhY2hlIHN0YXRzIGZvciBkZWJ1Z2dpbmdcbiAgICovXG4gIGFzeW5jIGdldENhY2hlU3RhdHMoKTogUHJvbWlzZTx7IGl0ZW1Db3VudDogbnVtYmVyOyBjYWNoZUFnZTogbnVtYmVyOyBpc1ZhbGlkOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBjYWNoZSA9IGF3YWl0IHRoaXMubG9hZENhY2hlKCk7XG4gICAgaWYgKCFjYWNoZSkge1xuICAgICAgcmV0dXJuIHsgaXRlbUNvdW50OiAwLCBjYWNoZUFnZTogMCwgaXNWYWxpZDogZmFsc2UgfTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW1Db3VudDogY2FjaGUuaXRlbXMubGVuZ3RoLFxuICAgICAgY2FjaGVBZ2U6IERhdGUubm93KCkgLSBjYWNoZS50aW1lc3RhbXAsXG4gICAgICBpc1ZhbGlkOiBEYXRlLm5vdygpIC0gY2FjaGUudGltZXN0YW1wIDw9IHRoaXMuQ0FDSEVfVFRMX01TXG4gICAgfTtcbiAgfVxufSJdfQ==
@@ -2,4 +2,5 @@
2
2
  * Cache module exports
3
3
  */
4
4
  export * from './APICache.js';
5
+ export * from './CollectionCache.js';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC"}